javascript - 将状态传递给 preact 组件

标签 javascript reactjs asynchronous ecmascript-6 preact

我有一个新人要 react /准备。我有一个简单的应用程序,可以从 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>
    );
}

在图表组件中,我尝试直接在 render() 方法中访问 this.props.temps,但最终得到的值为 未定义。 我究竟做错了什么?非常感谢您的帮助。

最佳答案

您需要使用setState函数,创建先前状态的副本,然后推送新项目。
请引用React生命周期文档:https://reactjs.org/docs/react-component.html#setstate

下面的代码是如何在您的情况下设置状态。但是,您必须将此函数放在 React 可以更新状态的位置:

parseHourly = (parsed_json) = > {
  const bufferTemps = JSON.parse(JSON.stringify(this.state.temps));
  for (let i = 0; i < 7; i++) {
    const h = parsed_json['hourly_forecast'][i]['FCTTIME']['hour'];
    const t = parsed_json['hourly_forecast'][i]['temp']['metric'];
    const pair = {
      hour: h,
      temperature: t
    };
    bufferTemps.push(pair);
  }
  this.setState({
    temps: bufferTemps
  });
}

注意:
const bufferTemps = [...this.state.temps]不会为每个项目创建深拷贝,并且它不应该这样做 this.state.temps.push(pair)
为了解决这个问题,我使用 JSON.parse(JSON.stringify(this.state.temps))创建深度克隆。

关于javascript - 将状态传递给 preact 组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49184792/

相关文章:

node.js - 我希望我的 aws lambda 在 mysql 查询在 node.js 上完全执行之前不返回任何内容

javascript - 使用 JqueryAJAX 中的 ".then"到 "normal"函数?

javascript - 这个 rxjs 合并逻辑可以简化吗?

python - 如何将异步插入到 mongodb 中的日志中?

javascript - 在 Chrome 中的窗口上停止滚动之前,滚动事件不会触发

javascript - 无法对 api 进行 POST,使用 fetch 时出现错误 400

java - 两遍JSP页面渲染

javascript - 如何在Go中解密使用aes-js包在vuejs中加密的密文

javascript - 为什么可以在我的笔记本电脑上使用 HTML 地理定位?

Javascript 嵌套循环不显示完整矩阵