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

React 性能优化技巧总结

发布时间:2019-02-26 13:07:11 所属栏目:建站 来源:落在起风的地方
导读:本文将从 render 函数的角度总结 React App 的优化能力。必要提示的是,文中将涉及 React 16.8.2 版本的内容(也即 Hooks),因此请至少相识 useState 以担保食用结果。 正文开始。 当我们接头 React App 的机能题目时,组件的渲染速率是一个重要题目。在进
副问题[/!--empirenews.page--]

React 机能优化能力总结

本文将从 render 函数的角度总结 React App 的优化能力。必要提示的是,文中将涉及 React 16.8.2 版本的内容(也即 Hooks),因此请至少相识 useState 以担保食用结果。

正文开始。

当我们接头 React App 的机能题目时,组件的 渲染 速率是一个重要题目。在进入到详细优化提议之前,我们先要领略以下 3 点:

  1. 当我们在说「render」时,我们在说什么?
  2. 什么时辰会执行「render」?
  3. 在「render」进程中会产生什么?
解读 render 函数

这部门涉及 reconciliation 和 diffing 的观念,虽然官方文档在 这里 。

当我们在说「render」时,我们在说什么?

这个题目着实写过 React 的人城市知道,这里再简朴说下:

在 class 组件中,我们指的是 render 要领:

  1. class Foo extends React.Component {  
  2.  render() {  
  3.    return <h1> Foo </h1>;  
  4.  }  
  5. }  

在函数式组件中,我们指的是函数组件自己:

  1. function Foo() {  
  2.   return <h1> Foo </h1>;  
  3. }  

什么时辰会执行「render」?

render 函数会在两种场景下被挪用:

1. 状态更新时

a. 担任自 React.Component 的 class 组件更新状态时

  1. import React from "react";  
  2. import ReactDOM from "react-dom";  
  3.   
  4. class App extends React.Component {  
  5.   render() {  
  6.     return <Foo />;  
  7.   }  
  8. }  
  9.   
  10. class Foo extends React.Component {  
  11.   state = { count: 0 };  
  12.   
  13.   increment = () => {  
  14.     const { count } = this.state;  
  15.   
  16.     const newCount = count < 10 ? count + 1 : count;  
  17.   
  18.     this.setState({ count: newCount });  
  19.   };  
  20.   
  21.   render() {  
  22.     const { count } = this.state;  
  23.     console.log("Foo render");  
  24.   
  25.     return (  
  26.       <div>  
  27.         <h1> {count} </h1>  
  28.         <button onClick={this.increment}>Increment</button>  
  29.       </div>  
  30.     );  
  31.   }  
  32. }  
  33.   
  34. const rootElement = document.getElementById("root");  
  35. ReactDOM.render(<App />, rootElement);  

可以看到,代码中的逻辑是我们点击就会更新 count,到 10 往后,就会维持在 10。增进一个 console.log,这样我们就可以知道 render 是否被挪用了。从执行功效可以知道,纵然 count 到了 10 以上,render 如故会被挪用。

总结:担任了 React.Component 的 class 组件,纵然状态没变革,只要挪用了setState 就会触发 render。

b. 函数式组件更新状态时

我们用函数实现沟通的组件,虽然由于要有状态,我们用上了 useState hook:

  1. import React, { useState } from "react";  
  2. import ReactDOM from "react-dom";  
  3.   
  4. class App extends React.Component {  
  5.   render() {  
  6.     return <Foo />;  
  7.   }  
  8. }  
  9.   
  10. function Foo() {  
  11.   const [count, setCount] = useState(0);  
  12.   
  13.   function increment() {  
  14.     const newCount = count < 10 ? count + 1 : count;  
  15.     setCount(newCount);  
  16.   }  
  17.   
  18.   console.log("Foo render");  
  19.     
  20.   return (  
  21.     <div>  
  22.       <h1> {count} </h1>  
  23.       <button onClick={increment}>Increment</button>  
  24.     </div>  
  25.   );  
  26. }  
  27.   
  28. const rootElement = document.getElementById("root");  
  29. ReactDOM.render(<App />, rootElement);  

(编辑:河北网)

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

热点阅读