React之state

149 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第27天,点击查看活动详情

背景

在React中,组件就是一种状态机,组件会根据状态的不同输出不同的UI,需要添加交互时,只需要把交互和状态关联,用户进行交互的时候,UI就会进行不同的渲染。下面看一下state如何交互。

定义state

state是组件的一个属性,该属性的值就是一个对象,代码如下:

image.png

定义属性时利用了ES6的 简写形式,如果一定要写在constructor中,要注意:
组件是继承自Component的,记得加super,constructor的第一个参数是掉一个呢该组件时传入的props,记得传递给super,在父类Component中加到this上,具体代码如下:

image.png

修改state

state现在已经和视图关联起来了,那么怎么修改state,让视图跟着变化呢?
修改state,注意不能直接赋值,如:
this.state+=1;
这种操作是不会引起视图渲染的。
setState方法用于更新state的值,并进行视图的重新渲染;
调用setState方法后,会根据setState传入的值,对state进行修改,根据修改后的state生成新的虚拟DOM,然后对比新老虚拟DOM,找出修改点,具体代码如下:

image.png

单击按钮时,将调用setState方法修改状态中的age属性,然后会重新渲染视图,age就已经跟着改变了;
setState方法被调用时,只接受两种参数类型;
一种是上面栗子中的对象,另一种是函数;
使用函数作为setState的参数时,注意该函数必须有返回值,返回值是一个对象,该对象表示要修改state的哪一项,以及修改后的值,代码如下:

image.png

了解state的使用后,还需要注意一下几个问题:

  1. 调用setState时,只需要传入要修改的状态,不需要传入所有状态,setState会自动进行合并,如上栗中,state中有name和age两个字段,但修改时只传入age,这时候name会保持不变合并到新的state对象中
  2. setState是一个异步方法,在调用setState之后直接打印state,发现state并未修改
  3. 多个setState会被合并,但只会引起一次视图渲染(render)