React/Taro如何优化渲染过程

760 阅读3分钟

前言:React频繁的setStete导致频繁的渲染,造成不必要的性能浪费,甚至会影响机器性能较差的用户的体验感 前提了解

在说优化之前,需要知道‘浅比较’和‘深比较’。

  1. JS中典型的浅比较就是使用‘===’来比较两个对象,只检查两个对象之间是否是同一个对象的引用,也就是说,如果,比较的两边是同一个对象的引用的话则会返回true
  2. 深比较则需要比较两个对象之间的所有属性是否都相等,无关是否引用。需要用遍历的方式遍历两个对象的所有属性,包括属性对应的对象也需要属性相等。JS中还没有提供深比较的API。

优化的方式这里提供两种

通过shouldComponentUpdate来优化渲染性能

  1. shouldComponentUpdate通过控制返回的布尔值来决定是否重新render
  2. 这个渲染优化需要自己手动去解决,较灵活
shouldComponentUpdate(nextPorps, nextState) {
  const { temp } = this.state
  if (temp === nextState.temp) return false
  return true
}
// 很明显,这个组件是否重新渲染取决于temp是否发生改变

pureComponent通过浅对比来提升渲染性能

不建议使用了pureComponent还使用shouldComponentUpdate,继承自PureComponent的组件不用我们手动去判断prop和state

  1. pureComponent通过浅比较的方式来比较新旧state和新旧props,进而根据比较的结果来判断是否渲染,无需用户自己去手动优化(shouldComponentUpdate)
  2. 也就是说,只有state和props的值发生改变,包括number、string、bool的值改变,或者对象引用发生改变才会触发render
  3. 无需手动优化,但较复杂或者特定业务下需要重新渲染的时候不适合用pureComponent

pureComponent和父子组件之间的关系

  1. 我们明白一个道理就行了,父组件的渲染会触发子组件的渲染,由于puerComponet通过浅比较来断绝不必要的渲染,所以就从源头上断绝子组件的渲染。
  2. 我们需要注意的是两种情况: a. 父组件继承pureComponent,子组件继承Component的情况,一般来说,子组件自己的state发生改变后自己会重新render,但如果是子组件的props发生改变(父组件传给子组件的),而父组件自己并没有渲染,相当于渲染被拦截了,所以子组件并不会重新render。 b. 父组件继承Component,子组件继承puerComponet的情况,和预期的一样,父组件传给子组件的props发生改变后做个浅比较才会决定子组件是否重新渲染。

什么时候用Component或者pureComponent & 总结

  1. state、props少更新时,也就是希望组件少重新渲染时用pureComponet,常见的应用场景就是page,最为最顶层的页面,频繁的重新render整个页面将会导致页面内的所有组件都会重新render。因为pureComponet频繁的浅比较也会消耗性能,甚至不如Component。也就是说puerComponent真正起作用的地方是在纯组件上。
  2. 与用户交互比较多的组件,也就是state、props频繁的更新时使用Component。可以简单的理解为尽量父组件用pureComponet,子组件用Component,具体还需要视业务逻辑来自行选择。
  3. 总结成一句话就是:继承puerComponet最好作为展示组件(state、props不发生变化),需要频繁渲染的组件用Component

参考文献:www.jianshu.com/p/c41bbbc20…

群鱼湾

IT赋能你,赋能你的IT

IT技术与创业分享