zoukankan      html  css  js  c++  java
  • setState总结

    react中的setState特点

    1. 是异步操作函数;
    2. 组件在还没有渲染之前, this.setState 还没有被调用;
    3. 批量执行 State 转变时让 DOM 渲染更快(相对比一个一个的setState的来的快)

    例如:{count:0}//初始化count
    this.setState({count:1});
    console.log(this.state.count);
    

     setState函数并不会阻塞等待状态更新完毕。所以,打印出来的并不是count=1,而还是count=0。

    很多时候,我们需要想要的state状态更新完成后再进行某些操作

    实现方法:

    • setState支持回调函数
    • ES7的Async/Await实现异步转同步

    1. setState支持回调函数

    第一个参数是我们要设置的state,第二个参数是在状态更新完毕后的回调操作 (一般有时候无效果);

    this.setState({count:1},()=>{
    console.log(this.state.count)//输出count=1
    });
    

     2. ES7的Async/Await实现异步转同步

    var delay = function (time) {
    return new Promise(function (resolve, reject) {
    setTimeout(function () {
    resolve();
    }, time);
    })
    };
    
    var start = async function () {
    console.log('a');
    await delay(2000);
    console.log('b');
    };
    
    start();//先输出a,稍等2秒后,输出了b

    同样在react中的应用:

    Promise来封装setState:
    setStateAsync(state) {
    return new Promise((resolve) => {
    this.setState(state, resolve)
    });
    }
    async componentDidMount() {
    await this.setStateAsync({count: 1});
    console.log(this.state.count);//输出count=1
    }
    
    1. async 表示这是一个async函数,await只能用在这个函数里面。
    2. await 表示在这里等待promise返回结果了,再继续执行。
    3. await 后面跟着的应该是一个promise对象
    class Example extends React.Component {
      constructor() {
        super();
        this.state = {
          val: 0
        };
      }
      
      componentDidMount() {
        this.setState({val: this.state.val + 1});
        console.log(this.state.val);    // 第 1 次 log->0
    
        this.setState({val: this.state.val + 1});
        console.log(this.state.val);    // 第 2 次 log->0
    
        setTimeout(() => {
          this.setState({val: this.state.val + 1});
          console.log(this.state.val);  // 第 3 次 log->2
    
          this.setState({val: this.state.val + 1});
          console.log(this.state.val);  // 第 4 次 log->3
        }, 0);
      }
    
      render() {
        return null;
      }
    };
    

     

  • 相关阅读:
    array_map()与array_shift()搭配使用 PK array_column()函数
    Educational Codeforces Round 8 D. Magic Numbers
    hdu 1171 Big Event in HDU
    hdu 2844 poj 1742 Coins
    hdu 3591 The trouble of Xiaoqian
    hdu 2079 选课时间
    hdu 2191 珍惜现在,感恩生活 多重背包入门题
    hdu 5429 Geometric Progression 高精度浮点数(java版本)
    【BZOJ】1002: [FJOI2007]轮状病毒 递推+高精度
    hdu::1002 A + B Problem II
  • 原文地址:https://www.cnblogs.com/allenxieyusheng/p/11385360.html
Copyright © 2011-2022 走看看