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

React 性能优化技巧总结

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

当然, CounterLabel 重新渲染是正常的,因为 count 发生了变化,自然要重新渲染;但是对于 List 而言,就完全是不必要的更新了,因为它的渲染与 count 无关。 尽管 React 并不会在 reconciliation 阶段真的更新 DOM,毕竟完全没变化,但是仍然会执行 diffing 阶段来对前后的树进行对比,这仍然存在性能开销。

还记得 render 执行过程中的 diffing 和 reconciliation 阶段吗?前面讲过的东西在这里碰到了。

因此,为了避免不必要的 diffing 开销,我们应当考虑将特定的状态值放到更低的层级或组件中(与 React 中所说的「提升」概念刚好相反)。在这个例子中,我们可以通过将 count 放到 CounterLabel 组件中管理来解决这个问题。

Tip #2:合并状态更新

因为每次状态更新都会触发新的 render 调用,那么更少的状态更新也就可以更少的调用 render 了。

我们知道,React class 组件有 componentDidUpdate(prevProps, prevState) 的钩子,可以用来检测 props 或 state 有没有发生变化。尽管有时有必要在 props 发生变化时再触发 state 更新,但我们总可以避免在一次 state 变化后再进行一次 state 更新这种操作:

  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: getRange(7),  
  17.     limit: 7  
  18.   };  
  19.   
  20.   handleLimitChange = e => {  
  21.     const limit = e.target.value;  
  22.     const limitChanged = limit !== this.state.limit;  
  23.   
  24.     if (limitChanged) {  
  25.       this.setState({ limit });  
  26.     }  
  27.   };  
  28.   
  29.   componentDidUpdate(prevProps, prevState) {  
  30.     const limitChanged = prevState.limit !== this.state.limit;  
  31.     if (limitChanged) {  
  32.       this.setState({ numbers: getRange(this.state.limit) });  
  33.     }  
  34.   }  
  35.   
  36.   render() {  
  37.     return (  
  38.       <div>  
  39.         <input  
  40.           onChange={this.handleLimitChange}  
  41.           placeholder="limit"  
  42.           value={this.state.limit}  
  43.         />  
  44.         {this.state.numbers.map((number, idx) => (  
  45.           <p key={idx}>{number} </p>  
  46.         ))}  
  47.       </div>  
  48.     );  
  49.   }  
  50. }  
  51.   
  52. const rootElement = document.getElementById("root");  
  53. ReactDOM.render(<App />, rootElement);  

这里渲染了一个范围数字序列,即范围为 0 到 limit。只要用户改变了 limit 值,我们就会在 componentDidUpdate 中进行检测,并设定新的数字列表。

毫无疑问,上面的代码是可以满足需求的,但是,我们仍然可以进行优化。

(编辑:核心网)

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

热点阅读