React组件状态下移和内容提升怎么实现


本篇内容介绍了“React组件状态下移和内容提升怎么实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

前言

两个简单实用的优化组件渲染性能的方法:

  • 状态下移

  • 内容提升

在讲解这两种方法之前,我们需要先手动创建一个有严重渲染性能的组件,如下所示:

import{useState}from'react';exportdefaultfunctionApp(){let[color,setColor]=useState('red');return(<div><inputvalue={color}onChange={(e)=>setColor(e.target.value)}/><pstyle={{color}}>Hello,world!</p><ExpensiveTree/></div>);}functionExpensiveTree(){letnow=performance.now();while(performance.now()-now<100){//Artificialdelay--donothingfor100ms}return<p>Iamaveryslow&nbspponenttree.</p>;}

很显然,当 App 组件内的状态发生了改变,ExpensiveTree 组件会 re-render, 事实上 ExpensiveTree 组件的 props、state 并未发生改变,这并不是我们期望的结果,下面将提供两种简单的方法,提升组件渲染的性能;

状态下移

exportdefaultfunctionApp(){let[color,setColor]=useState('red');return(<div><inputvalue={color}onChange={(e)=>setColor(e.target.value)}/><pstyle={{color}}>Hello,world!</p><ExpensiveTree/></div>);}

我们可以看到以上 ExpensiveTree 组件并不依赖 App 组件内部的状态,因此我们是否可以考虑,将依赖 color 的元素抽离到一个依赖 color 的组件中呢?
下面是实践后的代码:

exportdefaultfunctionApp(){return(<><Form/><ExpensiveTree/></>);}functionForm(){let[color,setColor]=useState('red');return(<><inputvalue={color}onChange={(e)=>setColor(e.target.value)}/><pstyle={{color}}>Hello,world!</p></>);}

此时,将依赖 color 的元素提取到了 Form 组件中,Form 组件内部的状态不再影响 ExpensiveTree 组件的渲染,问题便得到了解决

内容提升

exportdefaultfunctionApp(){let[color,setColor]=useState('red');return(<divstyle={{color}}><inputvalue={color}onChange={(e)=>setColor(e.target.value)}/><p>Hello,world!</p><ExpensiveTree/></div>);}

以上情况是高开销组件 ExpensiveTree 的父节点依赖 color,此时显然状态下移是行不通的,但是还有另外一种办法:

exportdefaultfunctionApp(){return(<ColorPicker><p>Hello,world!</p><ExpensiveTree/></ColorPicker>);}functionColorPicker({children}){let[color,setColor]=useState("red");return(<divstyle={{color}}><inputvalue={color}onChange={(e)=>setColor(e.target.value)}/>{children}</div>);}

此时和状态提升是完全相反的,将依赖 color 的元素提升到了 ColorPicker 组件中,而不依赖 color 的元素以 children prop 的形式传入了 ColorPicker ,当组件内部的状态改变时:

  • ColorPicker 会重新渲染但是它仍然保存着

  • ColorPicker 的 children 属性未变化 React 并不会访问那棵子树。 因此,ExpensiveTree不会重新渲染。

“React组件状态下移和内容提升怎么实现”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注主机评测网网站,小编将为大家输出更多高质量的实用文章!


上一篇:Python装饰器的定义形式有哪些

下一篇:vue3中如何使用JSX


Copyright © 2002-2019 测速网 https://www.inhv.cn/ 皖ICP备2023010105号 城市 地区 街道
温馨提示:部分文章图片数据来源与网络,仅供参考!版权归原作者所有,如有侵权请联系删除!
热门搜索