继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

深入学习 react的 setState

1步
关注TA
已关注
手记 24
粉丝 120
获赞 651

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()

打开App,阅读手记
2人推荐
发表评论
随时随地看视频慕课网APP