美文网首页
setState细节

setState细节

作者: 转移到CSDN名字丹丹的小跟班 | 来源:发表于2021-03-12 09:00 被阅读0次

1.setState是合并动作,不是替换动作

this.state = {name: 'dandan', age: 20}
//当使用this.setState{name: 'fufu'}时,并不会删除age属性,而是只更改name属性值
this.setState{name: 'fufu'}  //{name: 'fufu', age: 20}

2.setState动作会触发render函数的执行,使其返回最新的数据
以下代码每次点击都会输出'render被调用'

import React from "react";
import ReactDOM from "react-dom";

class Demo extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      num: 1,
    };
    this.add = this.add.bind(this);
  }
  render() {
    console.log('render被调用');
    return (
      <div>
        <button onClick={this.add}> 加1 </button>{" "}
      </div>
    );
  }
  add() {
    let num = this.state.num;
    this.setState({
      num: num + 1,
    });
  }
}
ReactDOM.render(<Demo> </Demo>, document.getElementById("root"));

3.setState 只在合成事件(例如onclick)和钩子函数中是“异步”的,在原生事件和 setTimeout 中都是同步的。

import React from "react";
import ReactDOM from "react-dom";

class Demo extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      num: 0,
    };
  }
  componentDidMount() {
    this.setState({
      num: this.state.num + 1
    })
    this.setState((state) => {
      console.log(state.num) // 1
      return {
        num: state.num + 1
      }
    })
    console.log(this.state.num)  //输出0
    setTimeout(() => {
      this.setState({
        num: this.state.num + 1
      })
      console.log(this.state.num) //3
    }, 0);
  }
  
  render() {
    return null;
  }
}
  
  render() {
    return null;
  }
}
ReactDOM.render(<Demo></Demo>,  document.getElementById("root"));

setState的“异步”并不是说内部由异步代码实现,其实本身执行的过程和代码都是同步的,只是合成事件和钩子函数的调用顺序在更新之前,导致在合成事件和钩子函数中没法立马拿到更新后的值,形式了所谓的“异步”,当然可以通过第二个参数 setState(partialState, callback) 中的callback拿到更新后的结果。

4.setState 的批量更新优化也是建立在“异步”(合成事件、钩子函数)之上的,在原生事件和setTimeout 中不会批量更新,在“异步”中如果对同一个值进行多次 setState , setState 的批量更新策略会对其进行覆盖,取最后一次的执行,就像Object.assign方法一般(但是如果使用函数作为参数传递给setState的话,就不会被覆盖)。如果是同时 setState 多个不同的值,在更新时会对其进行合并批量更新。

import React from "react";
import ReactDOM from "react-dom";

class Demo extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      num: 0,
    };
  }
  componentDidMount() {
    this.setState({
      num: this.state.num + 1
    })
    this.setState({
      num: this.state.num + 1
    })
    this.setState({
      num: this.state.num + 1
    })
  }
  
  render() {
    //这里会输出两个结果
    //第一次输出的结果为0,为初次渲染组件的时候,获取的num值
    //第二次输出的结果为1.为在钩子函数里改变num状态时发生的更新,而两次更新放在了一起且对同一个属性操作,则只会执行最后的一次。
    console.log(this.state.num)  
    return null;
  }
}
ReactDOM.render(<Demo></Demo>,  document.getElementById("root"));

来试试你是否掌握了该知识点

相关文章

  • setState细节

    1.setState是合并动作,不是替换动作 2.setState动作会触发render函数的执行,使其返回最新的...

  • 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补充

    RN中setState 设置状态 setState(object nextState[,functioncallb...

网友评论

      本文标题:setState细节

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