Так что я новичок в этом. Я хочу загрузить внешний файл 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;



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Поскольку у вас есть 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: [] }
};
Проверка того, что состояние содержит поле данных, которое вы сопоставляете, намного безопаснее, хотя в случае, если возвращаемый результат никогда не включает поле.