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

React 性能优化技巧总结

发布时间:2019-03-03 04:19:40 所属栏目:优化 来源:落在起风的地方
导读:本文将从 render 函数的角度总结 React App 的优化技巧。需要提醒的是,文中将涉及 React 16.8.2 版本的内容(也即 Hooks),因此请至少了解 useState 以保证食用效果。 正文开始。 当我们讨论 React App 的性能问题时,组件的渲染速度是一个重要问题。在进

上面的代码中,每次 limit 发生改变,我们都会触发两次状态更新:第一次是为了修改 limit,第二次是为了修改展示的数字列表。这样一来,每次 limit 的变化会带来两次 render 开销:

  1. // 初始状态  
  2. { limit: 7, numbers: [0, 1, 2, 3, 4, 5, 6]  
  3. // 更新 limit -> 4  
  4. render 1: { limit: 4, numbers: [0, 1, 2, 3, 4, 5, 6] } //   
  5. render 2: { limit: 4, numbers: [0, 2, 3]  

我们的代码逻辑带来了下面的问题:

  • 我们触发了比实际需要更多的状态更新;
  • 我们出现了「不连续」的渲染结果,即数字列表与 limit 不匹配。

为了改进,我们应避免在不同的状态更新中改变数字列表。事实上,我们可以在一次状态更新中搞定:

  1. import React from "react";  
  2. import ReactDOM from "react-dom";  
  3.   
  4. function getRange(limit) {  
  5.   let range = [];  
  6.   
  7.   for (let i = 0; i < limit; i++) {  
  8.     range.push(i);  
  9.   }  
  10.   
  11.   return range;  
  12. }  
  13.   
  14. class App extends React.Component {  
  15.   state = {  
  16.     numbers: [1, 2, 3, 4, 5, 6],  
  17.     limit: 7  
  18.   };  
  19.   
  20.   handleLimitChange = e => {  
  21.     const limit = e.target.value;  
  22.     const limitChanged = limit !== this.state.limit;  
  23.     if (limitChanged) {  
  24.       this.setState({ limit, numbers: getRange(limit) });  
  25.     }  
  26.   };  
  27.   
  28.   render() {  
  29.     return (  
  30.       <div>  
  31.         <input  
  32.           onChange={this.handleLimitChange}  
  33.           placeholder="limit"  
  34.           value={this.state.limit}  
  35.         />  
  36.         {this.state.numbers.map((number, idx) => (  
  37.           <p key={idx}>{number} </p>  
  38.         ))}  
  39.       </div>  
  40.     );  
  41.   }  
  42. }  
  43.   
  44. const rootElement = document.getElementById("root");  
  45. ReactDOM.render(<App />, rootElement);  

Tip #3:使用 PureComponent 和 React.memo 以避免不必要的 render 调用

我们在之前的例子中看到将特定状态值放到更低的层级来避免不必要渲染的方法,不过这并不总是有用。

(编辑:晋中站长网)

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

热点阅读