react使用setState注意事项

React设计setState方法就是为了重新渲染页面

看看下面的代码实现的结果:

state = {
    value : 0
}

function test() {
    this.setState({ value: this.state.value + 1 });
    this.setState({ value: this.state.value + 1 });
    this.setState({ value: this.state.value + 1 });
}

test()   //发现最后value 是1,只加了一次


function test1() {
    this.setState((state, props) => ({ value: state.value + 1 }));
    this.setState((state, props) => ({ value: state.value + 1 }));
    this.setState((state, props) => ({ value: state.value + 1 }));
}

test1()  // 发现最后value 是3, 结果就如我们所意了

因为使用函数式setState,React会保证每次调用函数时,state都已经合并了之前的状态修改结果。


多次setState会合并

前面我们了解到setState并不会立即改变state的值,而是将其放到一个任务队列里,最终将多个setState合并,一次性更新页面。所以我们可以在代码里多次调用setState,每次只需要关注当前修改的字段即可。

多次setState会合并为什么会合并

主要是setState触发页面重新渲染, 需要经过以下生命周期:

  • shouldComponentUpdate
  • componentWillUpdate
  • render
  • componentDidUpdate

经过测试,其实state的值只有在render的时候才真正被修改了

// shouldComponentUpdate: 0

// componentWillUpdate: 0

// render: 1

// componentDidUpdate: 1

// shouldComponentUpdate: 1

// componentWillUpdate: 1

// render: 2

// componentDidUpdate: 2

// shouldComponentUpdate: 2

// componentWillUpdate: 2

// render: 3

// componentDidUpdate: 3
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值