Reactjs的render()在promise解决这个问题后不会被触发.setState被重新分配
reactjs render() not triggered after promise resolves this.setState is re-assigned
下面有一个函数,它设置了一个InitialState,然后使用componentWillMount和fetchData调用api,为数据分配this.state。然而,当this. setstate()完成后,渲染函数不会被新的this触发。状态数据我的函数如下:
var Home = React.createClass({
getInitialState: function() {
return {
city: '',
weather: '',
temperature: 0,
humidity: 0,
wind: 0,
}
},
fetchData: function() {
apiHelpers.getCityInfo()
.then(function (response){
this.setState({ data: response
})
}.bind(this))
},
componentWillMount: function(){
this.fetchData();
},
render: function () {
return (
<div className="container">
<Cities data={this.state.data} />
</div>
)
}
});
初始状态无data
。将代码更改为-
fetchData: function() {
apiHelpers.getCityInfo()
.then(function (response){
this.setState({
city: response.city,
weather: response.weather,
temperature: response.temperature,
humidity: response.humidity,
wind: response.wind,
})
}.bind(this))
},
期待您的API响应包含对象作为城市,天气,…等等. .
根据react文档
componentWillMount
在client and server
上调用一次,在初始呈现发生之前立即调用。如果在这个方法中调用setState, render()
将看到更新的状态,并且尽管状态发生了变化,但只执行once
。
要解决此问题,请使用componentDidMount
代替componentWillMount
。由于您正在更新状态变量data
中的响应,因此首先定义它,然后无需定义其他状态变量,只需将数据传递给child component
并更新状态,就像您现在所做的那样。
var Home = React.createClass({
getInitialState: function() {
return {
data: ''
}
},
fetchData: function() {
apiHelpers.getCityInfo()
.then(function (response){
this.setState({ data: response
})
}.bind(this))
},
componentDidMount: function(){
this.fetchData();
},
render: function () {
return (
<div className="container">
<Cities data={this.state.data} />
</div>
)
}
});
相关文章:
- Javascript / JQuery循环访问已发布的ajax数据字符串以为其分配新值
- 如果我不这样做会发生什么;t在javascript中的变量中分配新的Image
- 如果我为 JS 变量分配一个新值,它会破坏它的绑定吗?
- Reactjs:在setState中使用时,Obj被重新分配,这很奇怪
- 在以下情况下,map 如何分配新值
- 如何将日期分配给新的日期对象
- 为函数中的现有数组(全局变量)分配新值不起作用.为什么
- 分配给新变量时,计数器值在循环中更改
- 当我将$scope分配给另一个变量并更改新变量上的监视值时,不会触发角度 $scope.$watch
- JS:如何为新创建的HTML元素分配ID
- 将函数中的对象分配给变量或调用 setState 没有这个
- 自动将事件处理程序分配给新元素
- 在javascript中实例化一个新类时,不将其分配给变量有什么害处
- 解构并分配给新变量,同时不起作用
- 当您将字符串文本传递给变量,然后将该字符串中的数据分配给新变量时,它叫什么
- 为什么可以't我给“t”分配一个新值;这个“;在原型函数中
- 只需使用Immutable.js将对象分配给变量,即可克隆新对象
- 将新属性分配给内置类型实际上是非法的
- Javascript 类、编译器性能和新 Klass() 上的内存分配
- 对jsproto和分配新属性感到困惑