if语句中的setState()问题

时间:2016-09-16 12:28:49

标签: javascript reactjs react-native

if语句中的

setState():

// morePage = true
// pageNum = 1

if(morePage){
  this.setState({pageNum: this.state.pageNum+1})
}

console.log(this.state.pageNum); // return: 1

setState()if if statement:

// morePage = true
// pageNum = 1

if(morePage){
  // ... 
}
this.setState({pageNum: this.state.pageNum+1})

console.log(this.state.pageNum); // return: 2

我现在正面对这一点,我想知道为什么......

谢谢:)

在正确的答案后编辑:

所以是的,我应该花更多的时间阅读React的Doc:P 如果有人有兴趣知道我最终是怎么做的,这就是答案:

在文档中,他们说不能保证你的州在重新渲染之前会有新的价值。所以你必须使用" componentDidUpdate()"。

所以我做的是,我把:

this.setState({pageNum: this.state.pageNum+1})

在我创建的随机函数中,之后在" componentDidUpdate(prevProps,prevState)"功能我可以访问新的和旧的道具值,在那里我可以使用" pageNum"的前一个和当前值。 :)

4 个答案:

答案 0 :(得分:3)

setState()不会立即改变this.state,但会创建挂起状态转换。调用此方法后访问this.state可能会返回现有值 无法保证对setState的调用进行同步操作,并且可以对调用进行批处理以获得性能提升。

如上所述,无法保证在下一行代码中更新状态值。

如果要检查调试状态,请尝试使用render方法将其记录,因为在更新状态后调用此方法

答案 1 :(得分:0)

使用setState合并当前和以前的状态。因此价值。此外,它同步可能会产生意想不到的结果。

答案 2 :(得分:0)

备注:

  

setState()不会立即改变this.state,但会创建待处理状态转换。调用此方法can potentially return the existing value.

后访问this.state      

There is no guarantee of synchronous operation of calls to setState and calls may be batched for performance gains.

     除非在shouldComponentUpdate()中实现条件呈现逻辑,否则

setState()将始终触发重新渲染。如果正在使用可变对象且无法在shouldComponentUpdate()中实现逻辑,则仅当新状态与先前状态不同时调用setState()将避免不必要的重新渲染。

您可以从官方文档中获取更多信息 https://facebook.github.io/react/docs/component-api.html

答案 3 :(得分:0)

所以基本上你的问题是其他人从setState引用的。但你可以轻松地console.log做:

this.setState({pageNum: this.state.pageNum+1}, () => {
  console.log(this.state.pageNum);
})

请参阅setState定义:

void setState(
  function|object nextState,
  [function callback]
)