稀土掘金 稀土掘金

React.memo

1、React.memo()是什么?

React 16.6.0版本钟主要更新了两个新的功能,帮助提高渲染性能:

  • React.memo()
  • React.lazy(): 使用 React Suspense 进行代码拆分和懒加载

本文只介绍React.memo()

React.memo()和PureComponent很相似,都是用来控制组件何时渲染的。我们都知道当组件props和state发生改变时,当前组件以及其子孙组件会重新渲染,但是有一些组件(纯文本组件)是不需要重新渲染的,这种不需要的组件被重新渲染会影响整体的渲染性能。

通过控制组件何时渲染可以帮助我们解决这个问题,在React中可以用来优化组件性能的方法大概有以下几种:

  • 组件懒加载(React.lazy(...)和)
  • PureComponent
  • shouldComponentUpdate(...){...}生命周期函数
  • React.memo

与PureComponent不同的是,React.memo()是一个高阶组件,用于函数组件,通过对前后props进行浅比较,如果前后props不一致,该组件将重新渲染,反之,不进行渲染,使用缓存中的组件。

function memo<T extends ComponentType<any\>\>(
 Component: T,
 propsAreEqual?: (prevProps: Readonly<ComponentProps<T\>\>, nextProps: Readonly<ComponentProps<T\>\>) \=\> boolean
 ): MemoExoticComponent<T\>;

memo函数第二个参数接收一个函数,该函数比较前后props是否一致。

2、React.memo使用前后比较

举个例子看看React.memo的使用,当不使用React.memo:

// Parent.tsx
import React, { useState } from 'react';
import Child from '../Child';

const Parent = () => {
 const \[count, setCount\] = useState(0);
 console.log('parent render update')
 return (
     <React.Fragment\>
         <div\>{count}</div\>
         <button onClick\={() => setCount(count + 1)}>++++</button\>
         <Child msg\='test'/>
     </React.Fragment\>
 )
}

export default Parent;

// Child.tsx
import React from 'react';

const Child = (props) => {
 console.log('child render update');
 return <div\>{props.msg}</div\>
}

export default Child;

当父组件改变state时,Child组件也重新渲染了

image.png

当使用React.memo后

// Child.tsx
import React from 'react';

const Child = (props) => {
 console.log('child render update');
 return <div\>{props.msg}</div\>
}

export default React.memo(Child);

控制台打印结果

image.png

Child组件没有重新渲染,因为前后props没有改变。

3、类组件中控制渲染

3.1、shouldComponentUpdate

为了避免React组件的无用渲染,我们可以实现自己的shouldComponentUpdate生命周期函数。

当React想要渲染一个组件的时候,它将会调用这个组件的shouldComponentUpdate函数, 这个函数会告诉它是不是真的要渲染这个组件。

将Child组件改写一下就可以达到控制效果

import React from 'react';

class Child extends React.Component {
     shouldComponentUpdate(nextProps, nextState) {
         if (this.props.msg === nextProps.msg) {
             return false;
         }
         return true;
     }
     render() {
         return <div>test</div>
     }
}

export default Child;

3.2、PureComponent

PureComponent内部有监听props是否改变(浅比较),类组件继承PureComponent就可以控制渲染

import React from 'react';

class Child extends React.PureComponent {
 render() {
     return <div>test</div>
 }
}

export default Child;

image.png

4、总结

平常开发中应该对渲染性能有一定优化意识,React团队一直在致力于性能的提升,提出了很多新的API以及hooks,我们应该去了解、学习这些新知识,把开发做到极致!

参考

Web 性能优化: 使用 React.memo() 提高 React 组件性能

使用React.memo()来优化函数组件的性能

# 为什么要在函数组件中使用React.memo? - 七日打卡

React PureComponent 使用指南

玻璃钢生产厂家湖南佛像玻璃钢雕塑酒店玻璃钢雕塑现货玻璃钢雕塑设计灵感合肥frp玻璃钢雕塑玻璃钢小矮人雕塑彩色玻璃钢雕塑加工江西卡通玻璃钢雕塑玻璃钢雕塑制作方式四川抽象玻璃钢雕塑制作甘孜卡通玻璃钢雕塑厦门园林玻璃钢雕塑厂家铜陵大型玻璃钢人物雕塑延津玻璃钢雕塑价格玻璃钢雕塑简介山东通道商场美陈采购包头玻璃钢花盆商场玻璃钢雕塑摆件定制兰州玻璃钢雕塑施工曲阳玻璃钢雕塑蝴蝶云浮古代玻璃钢人物雕塑呈贡玻璃钢雕塑产品厂家贵不贵福州手糊法玻璃钢雕塑生产四川常见商场美陈费用安宁玻璃钢广场雕塑设计贵不贵重庆抽象玻璃钢造型雕塑制作江苏季节性商场美陈售价安阳玻璃钢商场美陈合肥玻璃钢雕塑安装新郑铜玻璃钢景观雕塑厂家高科技商场美陈香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化