美文网首页
深入学习react 中的 setState 方法

深入学习react 中的 setState 方法

作者: 1歩 | 来源:发表于2017-09-25 13:55 被阅读0次

    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
    }
    
    1. 🔔注意:在 addEventListener、setTimeout、ajax 回调中 this.setState 是立即触发的。
    2. 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()

    相关文章

      网友评论

          本文标题:深入学习react 中的 setState 方法

          本文链接:https://www.haomeiwen.com/subject/gvzrextx.html