加入收藏 | 设为首页 | 会员中心 | 我要投稿 核心网 (https://www.hxwgxz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 建站 > 正文

Web性能优化:缓存React事件来提高性能

发布时间:2019-03-18 01:07:25 所属栏目:建站 来源:前端小智
导读:JavaScript中一个不被重视的概念是对象和函数是如何引用的,并且直接影响 React性能。 如果创建两个完全相同的函数,它们仍然不相等,试试下面的例子: constfunctionOne=function(){alert('Helloworld!');}; constfunctionTwo=function(){alert('Hellowor

每次渲染时,都会在内存中创建一个新函数(因为它是在 render 函数中创建的),并将对内存中新地址的新引用传递给<Button />,虽然输入完全没有变化,该 Button 组件还是会重新渲染。

修复

如果函数不依赖于的组件(没有 this 上下文),则可以在组件外部定义它。 组件的所有实例都将使用相同的函数引用,因为该函数在所有情况下都是相同的。

  1. const createAlertBox = () => alert('!'); 
  2.  
  3. class SomeComponent extends React.PureComponent { 
  4.  
  5.   get instructions() { 
  6.     if (this.props.do) { 
  7.       return 'Click the button: '; 
  8.     } 
  9.     return 'Do NOT click the button: '; 
  10.   } 
  11.  
  12.   render() { 
  13.     return ( 
  14.       <div> 
  15.         {this.instructions} 
  16.         <Button onClick={createAlertBox} /> 
  17.       </div> 
  18.     ); 
  19.   } 

和前面的例子相反,createAlertBox 在每次渲染中仍然有着有相同的引用,因此按钮就不会重新渲染了。

虽然 Button 是一个小型,快速渲染的组件,但你可能会在大型,复杂,渲染速度慢的组件上看到这些内联定义,它可能会让你的 React 应用程序陷入囧境,所以最好不要在 render 方法中定义这些函数。

如果函数确实依赖于组件,以至于无法在组件外部定义它,你可以将组件的方法作为事件处理传递过去:

  1. class SomeComponent extends React.PureComponent { 
  2.  
  3.   createAlertBox = () => { 
  4.     alert(this.props.message); 
  5.   }; 
  6.  
  7.   get instructions() { 
  8.     if (this.props.do) { 
  9.       return 'Click the button: '; 
  10.     } 
  11.     return 'Do NOT click the button: '; 
  12.   } 
  13.  
  14.   render() { 
  15.     return ( 
  16.       <div> 
  17.         {this.instructions} 
  18.         <Button onClick={this.createAlertBox} /> 
  19.       </div> 
  20.     ); 
  21.   } 

在这种情况下,SomeComponent 的每个实例都有一个不同的警告框。 Button 的click事件侦听器需要独立于 SomeComponent。 通过传递 createAlertBox 方法,它就和 SomeComponent 重新渲染无关了,甚至和 message 这个属性是否修改也没有关系。createAlertBox 内存中的地址不会改变,这意味着 Button 不需要重新渲染,节省了处理时间并提高了应用程序的渲染速度

但如果函数是动态的呢?

修复(高级)

这里有个非常常见的使用情况,在简单的组件里面,有很多独立的动态事件监听器,例如在遍历数组的时候:

  1. class SomeComponent extends React.PureComponent { 
  2.   render() { 
  3.     return ( 
  4.       <ul> 
  5.         {this.props.list.map(listItem => 
  6.           <li key={listItem.text}> 
  7.             <Button onClick={() => alert(listItem.text)} /> 
  8.           </li> 
  9.         )} 
  10.       </ul> 
  11.     ); 
  12.   } 

在本例中,有一个可变数量的按钮,生成一个可变数量的事件监听器,每个监听器都有一个独特的函数,在创建 SomeComponent 时不可能知道它是什么。怎样才能解决这个难题呢?

输入记忆,或者简单地称为缓存。 对于每个唯一值,创建并缓存一个函数; 对于将来对该唯一值的所有引用,返回先前缓存的函数。

(编辑:核心网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读