- 1、本文档共4页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
第
React性能优化之非必要的渲染问题解决
目录1.非必要组件渲染2.解决方案之shouldComponentUpdate3.解决方案之PureComponent4.解决方案之React.memo5.useMemo和useCallback
1.非必要组件渲染
在React工程中,在改变React状态时,我们希望对整个页面的影响越小越好。然而实际情况是更改掉某些属性之后,除了会导致组件本身的重新渲染,也可能会导致其相关的组件也发生重新渲染。请看下面的例子:
新建一对父子组件
//父组件:
importReact,{Component}fromreact
importChildfrom./Child
classParentextendsComponent{
constructor(props){
super(props)
this.state={
parentInfo:parent,
sonInfo:son
this.changeParentInfo=this.changeParentInfo.bind(this)
changeParentInfo(){
this.setState({parentInfo:`改变了父组件state:${Date.now()}`})
render(){
console.log(ParentComponentrender)
return(
div
p{this.state.parentInfo}/p
buttonthis.changeParentInfo}改变父组件state/buttonbr/
Childson={this.state.sonInfo}/Child
/div
exportdefaultParent
//子组件:
importReact,{Component}fromreact
classChildextendsComponent{
constructor(props){
super(props)
this.state={}
render(){
console.log(ChildComponentrender)
return(
div
这里是child子组件:
p{this.props.son}/p
/div
exportdefaultChild
打开控制台,我们可以观察到,在点击按钮的时候控制台会输出ParentComponentrender和ChildComponentrender。这表明了子组件和父组件同时被重新渲染。
在这个例子中,点击按钮,仅仅改变了父组件相关的状态,而子组件的状态不变。因此,最理想的情况是只重新渲染父组件,而子组件则不会被重新渲染。
为了提高其性能,我们需要通过某种手段来抑制状态未发生改变的组件的渲染。
2.解决方案之shouldComponentUpdate
shouldComponentUpdate是React生命周期的一个环节,具体的执行位置是react在发生更新之后,render之前。该生命周期方法接收两个参数,nextProps和nextState,返回一个Boolean值来决定该组件是否需要重新渲染。因此,在这个生命周期方法中,我们可以完成将下一个时刻的状态和当前的状态进行对比,并且决定是否重新渲染。这样,就减少了非必要的渲染,达到了我们的目的。
3.解决方案之PureComponent
PureComponent类是一个高阶组件,主要是对于类组件的封装。它实现了将之前的状态和改变之后的状态进行浅比较的功能,通过比较的结果决定当前组件是否需要重新渲染。
浅比较:首先比较两个对象的key长度是否一致,然后检测每一个key是否两者都有,并且是否是一个引用。
使用方法和普通的组件差不多,只是在类组件创建的时候将扩展的Component类变成PureComponent类即可:
importReact,{PureComponent}fromreact
exportdefaultclassmyComponentextendsPureComponent{
//...
render(){
//...
您可能关注的文档
- 珠宝销售年终个人总结范文(8篇).docx
- 多间车库租赁合同(30篇).docx
- PHP7中的标量类型声明:如何提升代码的健壮性和可维护性?.docx
- 年终保安部个人工作总结(9篇).docx
- 公司销售部年终工作总结(30篇).docx
- 六年级学生竞选班干部发言稿100字(3篇).docx
- HTML、CSS和jQuery:构建一个漂亮的模态框.docx
- 班主任上学期总结范文(33篇).docx
- 大班有趣的教案及反思6篇.docx
- 高中生竞选学习委员演讲稿(32篇).docx
- DB44_T 2611-2025 城市排水管网有毒有害气体监测与风险分级管理技术标准.pdf
- DB44_T 2612-2025 竞赛类科普活动策划与实施服务规范.pdf
- DB43_T 2947-2024 烟草种子质量控制规程.pdf
- DB37_T 4836-2025 煤矿风量实时监测技术要求.pdf
- 叉车防撞系统,全球前22强生产商排名及市场份额(by QYResearch).docx
- 超滤膜,全球前18强生产商排名及市场份额(by QYResearch).docx
- DB62T 4172-2020 玉米品种 酒623规范.pdf
- DB62T 4160-2020 在用真空绝热深冷压力容器综合性能在线检测方法.pdf
- DB62T 4164-2020 辣椒品种 酒椒1号.pdf
- DB62T 4133-2020 公路隧道地质超前预报机械能无损探测技术规程.pdf
最近下载
- 2024年上半年教师资格证考试《初中语文》真题.docx
- 耳鼻喉科考试题及答案.docx VIP
- 超星尔雅学习通《组织行为学》章节测试答案满分版.doc
- 高中数学椭圆、双曲线抛物线综合练习题及答案-.pdf VIP
- 2024 巡察整改专题民主生活会个人对照检查材料.docx VIP
- 2024年上半年教师资格证考试《初中语文》真题.pdf
- 基于Modbus总线的马铃薯贮藏库温湿度采集.doc VIP
- 2025年全国保密教育线上培训考试试题库及完整答案【全优】.docx VIP
- 2024年上半年教师资格证考试《教育知识与能力》(中学)真题.pdf
- 晓磊(CHXL)Lei3000变频器说明书用户手册.pdf
文档评论(0)