axios.get не может отображать данные
У меня проблема с моими аксиосами. Я хочу прочитать данные из JSON и отобразить его в виде таблицы. Это мой код
constructor(props){
super(props)
data: []
}
componentWillMount(){
axios.get('http://localhost:3030/Personel')
.then((response) => {
console.log(response.data);
this.setState({
datas: response.data
})
})
.catch(function (error) {
console.log(error);
});
}
render(){
console.log("lagi ngerender nih")
return(
<div>
<Table>
<TableHeader >
<TableRow>
<TableHeaderColumn>
<div>
<IconPerson /> <p> Data Personil </p>
</div>
</TableHeaderColumn>
</TableRow>
<TableRow>
<TableHeaderColumn>#</TableHeaderColumn>
<TableHeaderColumn>Nama Personil</TableHeaderColumn>
<TableHeaderColumn>Posisi</TableHeaderColumn>
<TableHeaderColumn>Jenis Kelamin</TableHeaderColumn>
<TableHeaderColumn>TB/BB</TableHeaderColumn>
<TableHeaderColumn>No.Handphone</TableHeaderColumn>
</TableRow>
</TableHeader>
<TableBody>
{this.state.datas.map((data, i) => (
<TableRow key={i}>
<TableRowColumn>{data.id}</TableRowColumn>
<TableRowColumn>{data.fullName}</TableRowColumn>
<TableRowColumn>{data.posisi}</TableRowColumn>
<TableRowColumn>{data.isMale? "Laki-laki": "Perempuan"}</TableRowColumn>
<TableRowColumn>{data.height+ "cm / " + data.weight+ "kg"}</TableRowColumn>
<TableRowColumn>{data.phoneNo}</TableRowColumn>
</TableRow>
))}
</TableBody>
</Table>
</div>
)
}
}
и я получил эту ошибку: "TypeError: Невозможно прочитать свойство 'datas' из null" Кажется, что render() запускается перед axios. как я могу исправить эту проблему? Спасибо
3 ответа
Поскольку вызов axios является асинхронным, он может не завершиться и не установить состояние с ответом до запуска метода render. Таким образом, вам придется проверять наличие нуля в вашем методе рендеринга и отображать строки таблицы только тогда, когда доступны действительные данные.
Вы можете использовать чек, как
{this.state.datas && this.state.datas.map . . .}
Кроме того, вам нужно будет инициализировать state
в конструкторе, так что это не null
при доступе в методе рендеринга
constructore(props){
super(props);
this.state = {datas:null};
}
Это не аксиос часть. Вы перебираете неправильный массив. "данных" не существует, "данных" существует. Также попробуйте найти другое имя для первого аргумента карты вместо данных.
this.state.datas.map((data, i))
в
this.state.data.map((d, i))
Также вам необходимо изменить деталь после получения ваших "данных" с сервера.
this.setState({
datas: response.data
})
У вас нет массива данных в вашем состоянии, он называется "данные".
Также к вашему сведению. Данные множественного числа, данные единственного числа.
Надеюсь это поможет!:)
Ошибка не в том, что "render() запускается перед axios". Это невозможно как componentWillMount
уволен раньше render
,
Здесь ответ от вызова API устанавливается асинхронно. Это означает, что ваш вызов axios сделан, но нет никакого ожидания ответа, и render вызывается после вызова axios. т.е.
componentWillMount -> axios -> render -> response from axios
Вам необходимо отображать данные только после получения ответа. Проверь это-