В настоящее время я получаю данные из API в формате JSON при запуске своей саги. Процесс загрузки начинается, когда компонент смонтировался. Это означает, что компонент рендерится два раза.
Теперь, когда данные доступны в виде реквизита. Я могу использовать его для рендеринга.
Мой подход к этому выглядит следующим образом: у меня есть:
- Конструктор с начальным состоянием
- Я извлекаю данные в "componentDidMount"
- У меня есть функция, которая берет свойства JSON из реквизита и помещает их в новые переменные.
- Я запускаю эту функцию в моей функции render(), когда реквизиты содержат полученные данные.
Проблема в этом подходе: как только компонент запускает функцию, в которой данные становятся "структурированными", функция рендеринга зацикливается, а затем через некоторое время значения свойств отображаются с предупреждающим сообщением в консоль.
Мои вопросы:
- Как предотвратить зацикливание, когда render() запускается один раз?
- Как я могу спроектировать это так, чтобы определенные свойства извлеченного объекта сливались в новый объект и как
Я надеюсь, что описал самые важные вещи о моей проблеме. Вот код:
class Dashboard extends React.Component {
constructor(props) {
super(props);
this.state = {
deviceInfo: {
name: "Initial Name",
batLevel: "78%",
}
}
}
componentDidMount() {
this.props.requestApiData();
}
updateDeviceInfoWithState (){
const devices = (this.props.data.data);
if(devices){
const newDeviceInfo = this.state.deviceInfo;
newDeviceInfo.name = devices[0].shadow.desired.payload.refAppData.name;
newDeviceInfo.batLevel = devices[0].shadow.reported.payload.refAppData.batteryState.level;
this.setState({
deviceInfo: newDeviceInfo,
});
}
}
render() {
this.updateDeviceInfoWithState()
return (
<div className='container'>
<p> {this.state.deviceInfo.name} </p>
<p> {this.state.deviceInfo.batLevel} </p>
</div>
)
}...