【React入门总结01】react6大基础概念

98 阅读5分钟

概览:

1.setState使用

2.render函数的优化(SCU)

3.数据不可变的力量

4.获取DOM方式

5.受控与非受控组件

6.高阶组件

react官网链接 : zh-hans.react.dev/

一: setState的使用方式

1.1:基本使用

image.png

1.2:setState可以传入一个回调函数

好处一: 可以在回调函数中编写新的state的逻辑

好处二: 当前的回调函数会将之前的state和props传递进来

image.png

image.png

1.3 : setState中可以传入第二个参数: callback

   setState被设计为异步更新,好处为, setState设计为异步,可以显著的提升性能;

   如果每次调用 setState都进行一次更新,那么意味着render函数会被频繁调用,界面重新渲染,这样效率是很低的; 最好的办法应该是获取到多个更新,之后进行批量更新;

  如果同步更新了state,但是还没有执行render函数,那么state和props不能保持同步; state和props不能保持一致性,会在开发中产生很多的问题;

  那么如何可以获取到更新后的值呢?,此时可以利用到第二个参数,setState的回调。

image.png

二:render函数的优化(SCU)

在react中,组件除了第一次默认执行render函数以外,它们调用render应该有一个前提,就是依赖的数据(state、props)发生改变时,再调用自己的render方法;而实际上,默认情况下,当父组件的render函数被调用时,所有的子组件的render函 数都会被重新调用,哪怕依赖的props并没有发生改变。

image.png

image.png

那么如何来控制render方法是否被调用呢?

React给我们提供了一个生命周期方法 shouldComponentUpdate(很多时候,我们简称为SCU),这个方法接受参数,并且需要有

返回值:

该方法有两个参数:

参数一:nextProps 修改之后,最新的props属性

参数二:nextState 修改之后,最新的state属性

该方法返回值是一个boolean类型:

返回值为true,那么就需要调用render方法;

 返回值为false,那么久不需要调用render方法;

默认返回的是true,也就是只要state发生改变,就会调用render方法;

如果所有组件我们都需要手动来实现 shouldComponentUpdate,那么会给我们开发者增加非常多的工作量。

事实上只需要将类继承自PureComponent.

image.png 此时点击修改文本,可以发现,只有依赖了message的组件才重新执行了渲染,其他的并没有重新执行render函数

image.png 不过,针对类组件可以使用PureComponent,那么函数式组件呢?,

需要使用一个高阶组件memo。

image.png

当函数组件被高阶组件memo包裹时,可以发现,此时当依赖的props没有发生变化时,并没有重新执行render函数。

image.png

三:数据不可变的力量

前提:当组件继承自PureComponent时,

当修改引用数据类型时,直接操作原数据,并不会引起重新渲染(我的理解是它会进行一个浅层比较,所以并没有重新渲染),这就是数据不可变的力量。

image.png

如果想要修改之后,render函数重新执行渲染,需要自己设置一个新对象,才能通过PureComponet的浅层比较。

image.png

四:获取DOM方式

方式一:在React元素上绑定一个ref字符串,通过refs去获取(已废弃)

方式二:提前创建好ref对象, createRef(), 将创建出来的对象绑定到元素,通过current属性去获取元素

image.png

方式三: 传入一个回调函数, 在对应的元素被渲染之后, 回调函数被执行, 并且将元素传入

image.png

获取类组件实例

      通过以上方式都可以获取到类组件的实例,并且可以拿到实例并调用实例上面的方法。

image.png

获取函数组件实例

函数式组件是没有实例的,所以无法通过ref获取他们的实例:

 但是某些时候,我们可能想要获取函数式组件中的某个DOM元素,可通过

forwardRef转发获取,函数组件被forwardref函数包裹之后,能够接收第二个参数

从外面传进来的ref,即可以获取到函数组件里面的某个元素。

image.png

五: 受控与非受控组件

在 HTML 中,表单元素(如、 和 )之类的表单元素通常自己维护 state,并根据用户输入进行更新。在 React 中,可变状态(mutable state)通常保存在组件的state 属性中,并且只能通过使用 setState()来更新。

如果将结合起来,使React的state成为“唯一数据源”;渲染表单的 React 组件还控制着用户输入过程中表单发生的操作;

 被 React 以这种方式控制取值的表单输入元素就叫做“受控组件”;

◼ 由于在表单元素上设置了 value 属性,因此显示的值将始终为 this.state.value,这使得 React 的 state 成为唯一数据源**

简单理解,如果一个表单组件交给了state控制,那么它就是受控组件,否则就是非受控组件。

六:高阶组件

高阶组件的英文是 Higher-Order Components,简称为 HOC; 官方的定义:高阶组件是参数为组件,返回值为新组件的函数;

应用场景:

1.props的增强

  如果继承(extend)可以实现state和methods的增强,那么HOC就可以实现props上面的一个增强。 image.png

2.鉴权操作

image.png

3.劫持生命周期

image.png ....

当然,HOC也有自己的一些缺陷:

HOC需要在原组件上进行包裹或者嵌套,如果大量使用HOC,将会产生非常多的嵌套,这让调试变得非常困难; HOC可以劫持props,在不遵守约定的情况下也可能造成冲突;

注意使用得当。