zoukankan      html  css  js  c++  java
  • React学习小记--setState的同步与异步

    react中,state不能直接修改,而是需要使用setState()来对state进行修改,那什么时候是同步而什么时候是异步呢?

    基础代码:

        setCounter = (v) => {
            this.setState({
                counter: this.state.counter + v
            })
        }
        changeValue = () => {
            //调用增加函数 每次counter + 1
            this.setCounter(1)
        }
        render(){
            return (
                <div className="set-state-page" >
                   <h2 onClick={this.changeValue}>setState page</h2>
                   {this.state.counter}
               </div>
            )
        }
    

    异步执行

    合成事件中的异步

    setCounter()中加入一行console.log(this.state.counter),观察运行setState后的counter

        setCounter = (v) => {
            this.setState({
                counter: this.state.counter + v
            })
            console.log("异步的counter", this.state.counter)
        }
    

    通过运行上述代码:
    在合成事件中setState异步

    生命周期中的异步

    加入生命周期componentDidMount()

        componentDidMount(){
            this.changeValue()
        }
    

    刷新页面后直接得到运行结果:
    在生命周期setState异步

    同步执行

    setState的回调中同步

    setState()第二个参数是一个回调函数,在setState结束后执行,我们在回调函数中执行log

    代码改为(同时保留是异步的log进行对比):

        setCounter = (v)=>{
            this.setState({
                counter: this.state.counter + v
            },()=>{
                console.log("同步的counter", this.state.counter);
            })
            console.log("异步的counter", this.state.counter)
        }
    

    运行结果如下:
    在回调中setState同步

    原生事件中的同步

    通过document.getElementById来获取到一个元素并通过addEventListener给它添加一个click事件,观察这个是否同步

       componentDidMount(){                 
           document
               .getElementById("btn")
               .addEventListener("click",this.changeValue)
       }
       render(){
           return (
              <div className="set-state-page" >
                  <button id="btn">{this.state.counter}</button>
              </div>
           )
       }
    

    运行结果如下:
    在原生事件中setState同步

  • 相关阅读:
    混合开发的坑(3) ---关于es6
    混合开发的坑(2) ---pdf展示
    混合开发的坑(1) ---ajax请求
    vue.js
    vue中 import引入组件
    vue中 静态文件引用注意事项
    Oracle 数据库链接
    Oracle中的NVL,NVL2,NULLIF以及COALESCE函数使用
    Merge into 使用
    C# —— IList, ArrayList与List的区别详解
  • 原文地址:https://www.cnblogs.com/Eyeseas/p/react-xue-xi-xiao-jisetstate-de-tong-bu-yu-yi-bu.html
Copyright © 2011-2022 走看看