react进阶第七讲:渲染控制

render阶段做了什么

通过React.CreateElement,生成新的state和props,得到新的element对象。接下来,会对比这一次和上一次渲染的Virtual DOM,只在真正的DOM树中修改差别的部分。

控制render的方法

主要通过两种方式:

  • 从自身控制是否render。如shouldComponent和PureComponent。
  • 从父组件直接隔断子组件的渲染。如通过memo,缓存element对象。

方式一:自身控制

shouldComponentUpdate(nextProps, nextState)

shouldComponentUpdate返回一个布尔值,告诉组件需不需要继续这次更新。shouldComponentUpdate返回true,则继续更新,调用render函数;返回false,则停止更新,不调用render函数。

PureComponent

当开发类组件选择了继承 PureComponent,会通过内部的shouldComponentUpdate浅比较 state 和 props 是否相等。

React.memo(Component,compare)

参数说明:

  • Component是组件本身
  • 第二个参数 返回 true 组件不渲染 , 返回 false 组件重新渲染。和 shouldComponentUpdate 相反。
  • 当二个参数 compare 不存在时,会用浅比较处理 props ,相当于仅比较 props 版本的 pureComponent 。
  • 同样适合类组件和函数组件。

方式二:隔断自组件渲染,缓存对象

useMemo(create,deps)

  • 返回一个 memoized 值。
  • 第一个参数为一个函数,函数的返回值作为缓存值.
  • 第二个参数为一个数组,存放当前 useMemo 的依赖项。

useMemo 会记录上一次执行 create 的返回值,并把它绑定在函数组件对应的 fiber 对象上,只要组件不销毁,缓存值就一直存在,但是 deps 中如果有一项改变,就会重新执行 create ,返回值作为新的值记录到 fiber 对象上。

useMemo应用场景

  • 可以缓存 element 对象,从而达到按条件渲染组件,优化性能的作用。
  • 如果组件中不期望每次 render 都重新计算一些值,可以利用 useMemo 把它缓存起来。
  • 把函数和属性缓存起来, 配合hooks使用。
posted @ 2021-12-10 11:14  webLion200  阅读(147)  评论(0编辑  收藏  举报