概览:
1.setState使用
2.render函数的优化(SCU)
3.数据不可变的力量
4.获取DOM方式
5.受控与非受控组件
6.高阶组件
react官网链接 : zh-hans.react.dev/ ;
一: setState的使用方式
1.1:基本使用
1.2:setState可以传入一个回调函数
好处一: 可以在回调函数中编写新的state的逻辑
好处二: 当前的回调函数会将之前的state和props传递进来
1.3 : setState中可以传入第二个参数: callback
setState被设计为异步更新,好处为, setState设计为异步,可以显著的提升性能;
如果每次调用 setState都进行一次更新,那么意味着render函数会被频繁调用,界面重新渲染,这样效率是很低的; 最好的办法应该是获取到多个更新,之后进行批量更新;
如果同步更新了state,但是还没有执行render函数,那么state和props不能保持同步; state和props不能保持一致性,会在开发中产生很多的问题;
那么如何可以获取到更新后的值呢?,此时可以利用到第二个参数,setState的回调。
二:render函数的优化(SCU)
在react中,组件除了第一次默认执行render函数以外,它们调用render应该有一个前提,就是依赖的数据(state、props)发生改变时,再调用自己的render方法;而实际上,默认情况下,当父组件的render函数被调用时,所有的子组件的render函 数都会被重新调用,哪怕依赖的props并没有发生改变。
那么如何来控制render方法是否被调用呢?
React给我们提供了一个生命周期方法 shouldComponentUpdate(很多时候,我们简称为SCU),这个方法接受参数,并且需要有
返回值:
◼ 该方法有两个参数:
参数一:nextProps 修改之后,最新的props属性
参数二:nextState 修改之后,最新的state属性
◼ 该方法返回值是一个boolean类型:
返回值为true,那么就需要调用render方法;
返回值为false,那么久不需要调用render方法;
默认返回的是true,也就是只要state发生改变,就会调用render方法;
如果所有组件我们都需要手动来实现 shouldComponentUpdate,那么会给我们开发者增加非常多的工作量。
事实上只需要将类继承自PureComponent.
此时点击修改文本,可以发现,只有依赖了message的组件才重新执行了渲染,其他的并没有重新执行render函数
不过,针对类组件可以使用PureComponent,那么函数式组件呢?,
需要使用一个高阶组件memo。
当函数组件被高阶组件memo包裹时,可以发现,此时当依赖的props没有发生变化时,并没有重新执行render函数。
三:数据不可变的力量
前提:当组件继承自PureComponent时,
当修改引用数据类型时,直接操作原数据,并不会引起重新渲染(我的理解是它会进行一个浅层比较,所以并没有重新渲染),这就是数据不可变的力量。
如果想要修改之后,render函数重新执行渲染,需要自己设置一个新对象,才能通过PureComponet的浅层比较。
四:获取DOM方式
方式一:在React元素上绑定一个ref字符串,通过refs去获取(已废弃)
方式二:提前创建好ref对象, createRef(), 将创建出来的对象绑定到元素,通过current属性去获取元素
方式三: 传入一个回调函数, 在对应的元素被渲染之后, 回调函数被执行, 并且将元素传入
获取类组件实例
通过以上方式都可以获取到类组件的实例,并且可以拿到实例并调用实例上面的方法。
获取函数组件实例
函数式组件是没有实例的,所以无法通过ref获取他们的实例:
但是某些时候,我们可能想要获取函数式组件中的某个DOM元素,可通过
forwardRef转发获取,函数组件被forwardref函数包裹之后,能够接收第二个参数
从外面传进来的ref,即可以获取到函数组件里面的某个元素。
五: 受控与非受控组件
在 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上面的一个增强。
2.鉴权操作
3.劫持生命周期
....
当然,HOC也有自己的一些缺陷:
HOC需要在原组件上进行包裹或者嵌套,如果大量使用HOC,将会产生非常多的嵌套,这让调试变得非常困难; HOC可以劫持props,在不遵守约定的情况下也可能造成冲突;
注意使用得当。