【问题标题】:Can't access state from child component无法从子组件访问状态
【发布时间】:2016-07-19 23:14:13
【问题描述】:

我正在尝试构建一个天气应用程序。我有一个搜索栏组件,它通过 api 获取数据并设置最初为 null 的天气道具的状态:

  getInitialState: function() {
    return {text: '', weather: null};
  },
  handleClick: function() {
    WeatherApi.get('q=' + this.state.text).then(function(data) {
      this.setState({weather: data})
    }.bind(this));
  },

我想要做的是将天气道具的状态通过用户设置后传递给子组件:

<TodaysWeatherContainer weatherData={this.state.weather} />

然后像这样从组件中访问它:

var TodaysWeatherContainer = React.createClass({
  render: function() {
    return (
      <div>
        <p>{this.props.weatherData}</p>
      </div>
    );
  }
});

现在当我搜索城市时,出现以下错误:

未捕获(在承诺中)错误:对象作为 React 子项无效(找到:带有键 {city、cod、message、cnt、list} 的对象)。如果您打算渲染一组子项,请改用数组或使用 React 附加组件中的 createFragment(object) 包装对象。检查TodaysWeatherContainer的渲染方法。

如果我添加 {this.props.weatherData.city} 我会收到此错误:

未捕获的类型错误:无法读取 null 的属性“城市”

这就是我感到困惑的地方。当使用 this.props.weatherData 返回一个对象时,它怎么可能为 null?

【问题讨论】:

  • 它应该如何呈现一个对象字面量? “对象作为 React 子级无效”
  • 可能发生的情况是您没有取回数据。也许天气电话不起作用。你能在promise中记录数据吗?因为您天气为“空”,它显示为对象类型。我认为 state.weather 永远不会更新。
  • 在我的 handleclick 函数中的 this.setState 链接之后添加了 console.log 行并返回:Object {city: Object, cod: "200", message: 0.008, cnt: 40, list: Array[ 40]}
  • this.props.weatherData.citynull 因为 --> 你的初始状态 --> weather: null 并且只有在你从 api 获取数据后才会被设置
  • @deowk 您的评论解决了 OP 问题的一个重要部分。我应该将其编辑到下面的答案中吗?

标签: javascript reactjs react-router


【解决方案1】:

听起来AJAX请求返回的数据不仅仅是文本(这将是那些&lt;p&gt;&lt;/p&gt;标签之间的有效子节点),而是一个对象,它是一个无效的子节点。

将 state 的 weather 属性设置为 API 响应返回的对象的属性,而不是整个对象。

在回应您的最新评论时,听起来weatherData.city 本身就是一个需要解析的对象。您可能可以通过更好地研究我们不了解的 API 来自己解决这个问题。

正如@deowk 在 cmets 中指出的那样,您的第二个错误是由父组件的初始状态引起的:{weather: null}。当子组件第一次被渲染时,它试图在null 对象上找到city 属性。您不再收到该错误,因为您现在是在 API 回调中而不是在子组件本身中执行查找。

【讨论】:

  • 他的做法:If I add {this.props.weatherData.city} I get this error: Uncaught TypeError: Cannot read property 'city' of null
  • 我设置了 'this.setState({weather: data.city.name})' 现在它可以工作了!
  • 如果有人需要更多信息,这是我正在使用的 api:openweathermap.org/api
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-06
  • 2018-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-08
相关资源
最近更新 更多