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同步

  • 相关阅读:
    vmware 安装 centos7
    Centos7 开机启动命令行模式
    Get、Post 提交的乱码问题
    RabbitMQ消息队列(一):详细介绍
    spring boot 整合 RabbitMq (注解)
    CF Tavas and Nafas
    HDU 2295 Radar (DLX + 二分)
    CF Drazil and Factorial (打表)
    CF Drazil and His Happy Friends
    CF Drazil and Date (奇偶剪枝)
  • 原文地址:https://www.cnblogs.com/Eyeseas/p/react-xue-xi-xiao-jisetstate-de-tong-bu-yu-yi-bu.html
Copyright © 2011-2022 走看看