我正在尝试使用reactjs来更新状态,一旦更新,就会激活一个请求新页面的ajax调用。就在ajax调用触发之前,设置了一个偏移量变量: var offset = this.state.npp * this.state.page;
但是我发现clickNextPage()被触发后,this.state.page的值不会更新。
我从根本上不明白这里发生了什么,这似乎是竞争条件,因为我用{this.state.page}观察我的render()函数的状态变化。
如何确保更新my.state.page,然后触发findByName()?
clickNextPage: function(event){
console.log("clicked happend")
page = this.state.page;
console.log(page)
page += 1
console.log(page)
this.setState({page: page});
console.log(this.state.page)
this.findByName()
},
JS控制台:
clicked happend
0
1
0
setState
是异步的 this.state
将不会立即更新。你的窘境的简短回答是使用回调(第二个参数来 setState
)在内部状态更新后调用。例如
this.setState({page: page}, function stateUpdateComplete() {
console.log(this.state.page)
this.findByName();
}.bind(this));
更长的答案是你打电话后 setState
,调用三个函数(有关每个函数的详细信息,请参见此处) https://facebook.github.io/react/docs/component-specs.html):
shouldComponentUpdate
这允许您检查先前和新状态以确定组件是否应更新自身。如果返回false,则以下函数为 不 执行(虽然 this.state
仍将在您的组件内更新)
componentWillUpdate
这使您有机会在内部设置新状态并进行渲染之前运行任何代码
render
这发生在组件“will”和“did”函数之间。
componentDidUpdate
这使您有机会在设置新状态并且组件重新自我渲染后运行任何代码
打电话时 this.setState
新状态没有直接设置,React通过调用将其置于挂起状态 this.state
可以归还旧州。
这是因为React可能批量处理您的状态更新,因此无法保证 this.setState
是同步的。
你想做什么叫 this.findByName()
中 componentDidUpdate
, componentWillUpdate
或通过作为第二个参数提供的回调 this.setState
取决于您的使用案例。注意回调到 this.setState
在您的调用通过并且组件已重新呈现之后才会被触发。
在你的情况下你可以传递一个函数do this.setState
而不是做一个变量舞蹈来提高可读性。
this.setState(function (prevState, currentProps) {
return {page: prevState.page + 1}
}, this.findByName);