React的组件实例对象属性state

454 阅读3分钟

在React组件实例对象中存在四个属性,是我们在创建组件过程中经常使用到的,分别是控制组件更新的state(状态),负责传值的props和context以及用于存储当前节点的refs。

  • 组件免不了要与用户互动,React的一大创新,就是将组件看成是一个状态机,一开始有一个初始状态,然后用户互动,导致状态发生变化,从而触发重新渲染UI。
  • React里,只需要更新组件的state,然后根据新的state重新渲染用户界面(不要操作原生DOM)

状态在哪里?

State是组件实例对象中的,组件实例对象是由类产生的,所以只有类是组件中才有state。 state默认值为null

如何初始化状态?

state是组件实例对象继承的React.Component的,素以要在当前组件的构造函数进行初始化,把它作为组件实例对象的属性,也可以直接在类的最顶层进行设置,state的值以对象形式存储。

  1. 类式组件里想更新UI,需要控制state属性
  2. 组件之间传值,用props(父亲向儿子传)和context(祖先向后代传数据)传值
  3. refs用来存储虚拟节点,本质上refs里其实存储的已经是真是节点了,尽量少用,效率低,和操作真是节点没有什么区别了

React state状态

简单来说,state决定了组件长什么样子。状态驱动着组件的更新(重新渲染),原生js里由操作节点来决定DOM的更新。

  • 想要更新组件,就要先找到状态,改变状态,react就会重新调用render方法
  • 每一个组件有自己单独的状态,组件之间的状态被隔离,互不影响。
  • state里其实存的就是组件里所需要的数据。数据就是当前组件的状态。
  • state的值是以json对象。默认值是null

如何修改状态?

常用的通知React数据变化的方法是调用this.setSate(data,callback)方法,这个方法合并data到this.state,并重新渲染组件,渲染完成后,调用可选的callback回调,大部分情况下不需要callback,因为react会负责把界面更新到最新状态。

注意:setState()方法是一个异步方法。 一般情况下,我们需要在constructor方法中进行初始化state,然后再你想要修改更新的时候调用setState方法即可。

this.setState():

  • 组件状态改变时,可以通过this.setState()修改状态。
  • setState方法支持按需修改,如state有两个字段,仅当setState传入的对象包含字段key才会修改属性。
  • 每次调用setState会导致渲染调用render()方法
  • 直接修改state不会重新渲染组件 简写方式就是把state写在类的内部最顶层
  1. this.setState()方法,该方法是一个异步操作。
  2. React会把data 和原来的状态进行合并,
  3. callback会在组件更新完成之后调用

以下内容背下来

在同步任务中setState是异步的,但是异步中setState是同步的,setState被设置成异步操作,是为了防止,在多次大量修改状态时,长时间占用线程,其他任务无法发起,造成操作虚拟DOM假死的问题,在异步任务中同步执行是因为本身setState就处于异步任务之中,不会影响其他任务,它就没必要是异步的了。

state的工作原理

这是一个React组件实现组件可交互所需的流程。render()方法输出虚拟DOM,虚拟DOM转为真实DOM,再再DOM上注册事件,事件触发setState()方法修改数据,再每次调用setState方法时,React会自动执行render()方法来更新虚拟DOM,如果组件已经被渲染,那么还会更新到DOM中去。