Загрузить внешний JSON в React

Так что я новичок в этом. Я хочу загрузить внешний файл json в React, а затем использовать его.

Проблема, по-видимому, в том, что json еще не загружен, поэтому я получаю ошибки. Как Cannot read property 'map' of undefined и т. д. console.info дает:

1
3
Uncaught TypeError: Cannot read property 'map' of undefined

Итак, я читал, что это связано с асинхронными вещами. Но я не могу найти ни одного примера, как это исправить. Или как заставить его работать.

Я был бы очень признателен за такой небольшой пример, чтобы он работал.

Позже я хочу сделать возможным фильтрацию json с помощью <input type=text etc> с каким-то динамическим поиском. Но обо всем по порядку. Так может кто-нибудь мне помочь?

Это мой простой файл:

import React, { Component } from 'react';
import './App.css';

class App extends Component {

  constructor(){
    super();
    this.state = {
      data: []
    };
    console.info('1');
  };

  componentDidMount() {
    fetch("http://asite.com/file.json")
    .then( (response) => {
      return response.json() })
    .then( (json) => {
      this.setState({data: json});
      console.info('2');
    })
  };

  render() {
    console.info("3");
    return(
      <div className = "Employee">
      {
        this.state.data.employees.map(function(employee) {
          return (
            <div>
            <h1> {employee.name} </h1>
            </div>
          )
        })
      }
      </div>
    )
  }
}

export default App;
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
0
1 657
2

Ответы 2

Поскольку у вас есть this.state.data.employees, я предполагаю, что вы хотите сформировать начальное состояние следующим образом:

constructor(){
  super();
  this.state = {
    data: {
      employees: []
    }
  };
};

Вы можете либо сохранить в состояние другую переменную, которая переворачивается, когда вы знаете, что загрузили данные, либо просто проверьте, существуют ли данные, прежде чем пытаться сопоставить их.

Последнее можно сделать, как показано ниже:

 <div className = "Employee">
  { this.state.data.employees &&
    this.state.data.employees.map(function(employee) {
      return (
        <div>
        <h1> {employee.name} </h1>
        </div>
      )
    })
  }
  </div>

Или вы можете настроить начальное состояние, чтобы включить пустую (но инициализированную) версию возврата, например:

this.state = {
  data: { employees: [] }
};

Проверка того, что состояние содержит поле данных, которое вы сопоставляете, намного безопаснее, хотя в случае, если возвращаемый результат никогда не включает поле.

Другие вопросы по теме