【发布时间】:2018-03-09 00:31:13
【问题描述】:
我有一个新人要做出反应/预演。我有一个从 API 获取天气预报的简单应用程序,我希望将此数据传递给图表组件(预图表)。我遇到的问题是当这个图表被渲染时,数据还没有被提取并且我得到类型错误,因为我已经在尝试处理它了。我看到另一个问题,其中最佳答案建议在尚未评估父组件的状态时有条件地将 null 而不是组件分配给变量。
在父组件中,我有以下方法设置要传递的状态(由父组件的构造函数调用):
parseHourly = (parsed_json) => {
for (let i = 0; i < 7; i++) {
var h = parsed_json['hourly_forecast'][i]['FCTTIME']['hour'];
var t = parsed_json['hourly_forecast'][i]['temp']['metric'];
var pair = {hour: h, temperature: t};
this.state.temps.push(pair);
}
}
这是我创建图表的父级渲染方法:
render() {
let myChart;
if(this.state.temps) {
myChart = <Chart temps={this.state.temps}/>
} else {
myChart = null
}
return (
<div class={ style.container }>
...
{ myChart }
...
</div>
);
}
在 Chart 组件中,我尝试在 render() 方法中直接访问 this.props.temps,但最终得到的值为 undefined。
我究竟做错了什么?非常感谢您的帮助。
【问题讨论】:
-
您在
parseHourly函数中没有使用setState是否有原因?它应该是这样的:this.setState(state => ({ temps: [...state.temps, pair] }))。这只是一个猜测,如果这最终解决了问题,我会写一个答案 -
@kingdaro 老实说,我不太确定。在构造函数中,我做了
this.state.temps = [];我正在遵循我给出的样板代码,因为我还是一个全新的人。使用setState()和直接设置字段有区别吗? -
使用
setState()是通知 React/Preact 它需要执行重新渲染的正确方法。直接设置或改变变量不会做任何事情,因为 react 不会以这种方式观察它们的变化。 -
此时,是否还需要
if(this.state.temps){...}?顺便说一句,感谢您的回复,@FisNaN 已经提交了答案,但这仍然很有帮助。 -
只要它始终是一个数组,您可能可以将其删除。当然:)
标签: javascript reactjs asynchronous ecmascript-6 preact