问题 如何确保更新reactjs状态,然后调用函数?


我正在尝试使用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

11850
2017-09-11 18:40


起源

你在这里写的代码与实际代码有多接近?你有没有可能改变的异步调用 state.page 在它更新之前? - Fenec


答案:


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 这使您有机会在设置新状态并且组件重新自我渲染后运行任何代码

10
2017-09-11 22:19



谢谢很多像魅力 - Ashok R


打电话时 this.setState 新状态没有直接设置,React通过调用将其置于挂起状态 this.state 可以归还旧州。

这是因为React可能批量处理您的状态更新,因此无法保证 this.setState 是同步的。

你想做什么叫 this.findByName() 中 componentDidUpdatecomponentWillUpdate 或通过作为第二个参数提供的回调 this.setState 取决于您的使用案例。注意回调到 this.setState 在您的调用通过并且组件已重新呈现之后才会被触发。

在你的情况下你可以传递一个函数do this.setState 而不是做一个变量舞蹈来提高可读性。

this.setState(function (prevState, currentProps) {
    return {page: prevState.page + 1}
}, this.findByName);

2
2017-09-11 22:08