为了账号安全,请及时绑定邮箱和手机立即绑定

深入学习 react的 setState

标签:
JavaScript

react 是单向数据流,若想要改变已有组件的外观,我们只能通过更改组件的 props 或者更新组件的 state。在 react 项目的代码中我们操作最多的就是 this.setState 方法。下面对 setState 方法进行详细的说明。

setState要点:react 框架为了提高性能,会对 state 的更新进行收集、合并、再进行一次批量的状态更新。这种机制常常导致一些意想不到的情况。
setState 有两种调用形式:

向 setState 传递对象

  1. setState()并不会立即触发 state 的更新。
    //this.state.demo = 1;
    handleClick = () => {
    this.setState({demo: 2});
    console.log(this.state.demo);//  1
    }
  2. 注意:在 addEventListener、setTimeout、ajax 回调中 this.setState 是立即触发的。
  3. setState 会合并更新,可能会造成状态更新的丢失
    handleClick = () => {
    this.setState({demo: this.state.demo + 1});
    this.setState({demo: this.state.demo + 1});
    }
    //click 之后 demo 为2而不是3

    综上:在同一代码块中不要多次调用 this.setState 方法

react 的 setState 还提供了另一种调用形式: this.setState(callbackFunc)

this.setState((previousState, currentProps) => {
    return { ...previousState, foo: currentProps.bar };
});

该语法和直接为 setState 传递对象不同,不会合并更新。

// demo + 1
handleSyncStateChange = () => {
    this.setState({
        demo: this.state.demo + 1
    });
    this.setState({
        demo: this.state.demo + 1
    });

}
// demo + 2
handleAsyncStateChange = () => {
    this.setState((preState, preProps) => {
        return {
            demo: preState.demo + 1
        }
    });
    this.setState((preState, preProps) => {
        return {
            demo: preState.demo + 1
        }
    });
}

refs

Beware: React setState is asynchronous!

Async Nature Of setState()

点击查看更多内容
2人点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
Web前端工程师
手记
粉丝
120
获赞与收藏
651

关注作者,订阅最新文章

阅读免费教程

感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消