代码之家  ›  专栏  ›  技术社区  ›  Gaurang Shah

ReactJS直接设置状态和通过方法参数的区别

  •  2
  • Gaurang Shah  · 技术社区  · 6 年前

    我已经开始学习ReactJS并意识到有两种方法可以改变状态。两种方法都可以正常工作,没有任何错误或警告。

    主要区别是什么?是否有理由或需要使用第二个版本?

    我想在每次单击时修改以下状态

    this.state = { count: 0 } 
    

    第一版本

    handleClick = () => {
        this.setState({count: this.state.count+1})
    }
    

    第二版

    handleClick = () => {
        this.setState(prvState => {
            return {
                count: prvState+1
            }
        })
    }
    
    2 回复  |  直到 6 年前
        1
  •  3
  •   Ana Liza Pandac    6 年前

    如果要基于前一状态设置下一状态值 值,然后传入 function (第二版)作为第一版 参数 this.setState 而不是 object 推荐 解决方案。

    handleClick = () => {
        this.setState(prvState => {
            return {
                count: prvState+1
            }
        })
    }
    

    原因是 this.state 可能是异步更新的,这就是为什么不应该依赖它们的值来计算下一个状态的原因。

    在第一个版本中,很可能 count 不正确,尤其是当应用程序变大时。

        2
  •  1
  •   inyono    6 年前

    如果您依赖于先前的状态(就像在您的案例中需要先前的计数器值),则首选第二种方法。它保证 prvState 保持当前状态。如果你有两个,这很重要 setState 修改同一渲染循环中的状态(请记住,react可能批处理多个 设置状态 一起打电话),例如

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

    有个问题 count 只递增一次。同时

    this.setState((prevState) => {count: prevState.count+1})
    this.setState((prevState) => {count: prevState.count+1})
    

    保证按预期增加两倍(与订单无关 设置状态 由react处理)