再看setState

作者: XJBT | 来源:发表于2019-08-12 09:15 被阅读2次

case 1

    class Clock extends React.Component {
        constructor(props) {
            super(props);
            this.state = {
            count: 0
            }
        }
        
        componentDidMount() {
            
            this.setState({count: this.state.count + 1}, (a) => {
                console.log(this.state.count)  // -> 6
            })
            this.setState({count: this.state.count + 1}, () => {
                console.log(this.state.count)  // -> 7
            })
            this.setState({count: this.state.count + 1}, () => {
                console.log(this.state.count)  // -> 8
            })
            this.setState(pre => {
                console.log('function')  // -> 3
                return {
                    count: pre.count+1
                }
            })
            this.setState(pre => {
                console.log('function1')  // -> 4
                return {
                    count: pre.count+1
                }
            })
            console.log('sync')  // -> 2
        }
        render() {
            console.log('render')  // -> 1 -> 6
            return (
            <div>
                <h1>Hello, world1!</h1>
                <h2>{this.state.count}</h2>
            </div>
            );
        }
    }
    // 组件从挂载到更新,console里面输出的顺序是这样的
    // render -> sync -> function -> function1 -> render -> 3 -> 3 -> 3


结论:

  • setState({}, callback)这种形式的setState会被batch,而且回调函数是在render之后执行
  • setState((preState) => {})这种形式不会被batch,但是代码不会同步执行,会等到所有的同步代码执行之后再同步执行这些setState,在render之前执行,因为setState之后才会render,上面那种形式的setState也是在render之前执行,但是回调在render之后执行

case 2

    class Clock extends React.Component {
        constructor(props) {
            super(props);
            this.state = {
            count: 0
            }
        }
        
        componentDidMount() {
            setTimeout(() => {
                this.setState({count: this.state.count + 1}, (a) => {
                    console.log(this.state.count)
                })
                this.setState({count: this.state.count + 1}, () => {
                    console.log(this.state.count)
                })
                this.setState({count: this.state.count + 1}, () => {
                    console.log(this.state.count)
                })
                this.setState(pre => {
                    console.log('function')
                    return {
                        count: pre.count+1
                    }
                })
                this.setState(pre => {
                    console.log('function1')
                    return {
                        count: pre.count+1
                    }
                })
                console.log('sync')
            })
        }
        render() {
            console.log('render')
            return (
            <div>
                <h1>Hello, world1!</h1>
                <h2>{this.state.count}</h2>
            </div>
            );
        }
    }

    // 输出顺序为: render -> render -> 1 -> render -> 2 -> render -> 3 -> function -> render -> function1 -> render -> sync
    // 在setTimeout里面所有的setState都同步执行

相关文章

  • 再看setState

    case 1 结论: setState({}, callback)这种形式的setState会被batch,而且回...

  • 从源码的角度看 React JS 中批量更新 State 的策略

    在之前的文章「深入理解 React JS 中的 setState」与 「从源码的角度再看 React JS 中的 ...

  • react拓展

    setState() setState更新状态的2种方式 对象式的setState 函数式的setState 对象...

  • setState()状态更新函数

    理解setState的关键 setState不会立刻改变React组件中state的值; setState通过引发...

  • 08react基础-react原理

    setState()更新数据 setState()更新数据是异步的 注意:使用该语法,后面的setState不要依...

  • 『react』setState()特性

    一.setState()更新数据 由于setState()更新数据是异步的,所以后面的setState()不要依赖...

  • setState相关

    - setState相关 setState是同步执行的,但是state不一定同步更新 多次执行setState,...

  • react 中的 API

    设置状态:setState setState(object nextState[,function callbac...

  • RN 优化之一

    大组件使用setState ,分离成很小的模块。各用各的setState 把setState 的范围使用到最少。

  • React初探(二)

    探索state和setState 关于state和setState有以下几点注意: 1.调用setState方法来...

网友评论

    本文标题:再看setState

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