React系列-SetState

136 阅读2分钟

面试了许多求职者,很多求职者只知其然,而不知所以然,写此文章为广大前端小伙伴指引迷津。纯干货!纯干货!纯干货!

目录

setState

setState

答:是 React 中用于修改状态,更新视图的方法。。

setState 过程??

在代码中调用 setState 之后,React 会将传入的参数对象与组件当前的状态合并,触发所谓的调和过程(Reconciliation)。

经过调和过程,React 会以相对高效的方式根据新的状态构建 React 元素树并且着手重新渲染整个 UI 界面。

在 React 得到元素树之后,React 会自动计算新树和老树之间的节点差异,然后根据差异对界面进行最小化重新渲染。

在差异计算算法(Diff)中,React 能够相对精确地知道哪些位置发生了改变以及英国如何改变,保证了按需更新,而不是全部重新渲染。

简单来说:

  1. 合并参数对象,触发调和过程
  2. 计算新树和老树差异(Diff
  3. 根据差异进行最小化重新渲染
setState 是同步还是异步?

答:有时候同步,有时候异步。

  1. setState 在合成事件和钩子函数中是异步的,在原生事件和 setTimeout 是同步的。
  2. setState 的异步,并不是说内部由异步代码实现,它本身执行的过程和代码是同步的,只是合成事件和钩子函数的调用顺序在更新之前,导致在合成事件和钩子函数中没法立马拿到更新后的值,从而形成了所谓的异步。
解决setState数据问题?
// 回调函数
this.setState(
  {
    count: count + 1
  },
  () => {
    console.log(this.state.count);
  }
);
// componentDidUpdate
import React, { PureComponent } from 'react';

class Demo extends PureComponent {

  state = {
    count: 0
  }

  componentDidUpdate() {
    const { count } = this.state;
    console.log(count);
  }

  click = () => {
    const { count } = this.state;
    this.setState({
      count: count + 1
    });
  }

  render() {
    const { count } = this.state;

    return (
      <div>
        <button onClick={this.click}>+1</button>
        <div>{count}</div>
      </div>
    );
  }
}

export default Demo;

小白也是新手面试官,欢迎领导莅临指导工作,提出建议,小白不胜感激,不喜勿喷,点赞收藏随机送程序媛小姐姐一枚哦!!!