React性能优化之非必要的渲染问题解决.docx

React性能优化之非必要的渲染问题解决.docx

  1. 1、本文档共4页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 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(){

//...

文档评论(0)

152****2426 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档