设为首页 - 加入收藏 ASP站长网(Aspzz.Cn)- 科技、建站、经验、云计算、5G、大数据,站长网!
热搜: 重新 试卷 文件
当前位置: 首页 > 运营中心 > 建站资源 > 优化 > 正文

React 性能优化技巧总结(5)

发布时间:2019-02-26 02:39 所属栏目:21 来源:落在起风的地方
导读:我们来看下下面的例子: importReact,{useState}fromreact; importReactDOMfromreact-dom; functionApp(){ const[isFooVisible,setFooVisibility]=useState(false); return( divclassName=App {isFooVisible?( Fooh

我们来看下下面的例子:

  1. import React, { useState } from "react";  
  2. import ReactDOM from "react-dom";  
  3.   
  4. function App() {  
  5.   const [isFooVisible, setFooVisibility] = useState(false);  
  6.   
  7.   return (  
  8.     <div className="App">  
  9.       {isFooVisible ? (  
  10.         <Foo hideFoo={() => setFooVisibility(false)} />  
  11.       ) : (  
  12.         <button onClick={() => setFooVisibility(true)}>Show Foo </button>  
  13.       )}  
  14.       <Bar name="Bar" />  
  15.     </div>  
  16.   );  
  17. }  
  18.   
  19. function Foo({ hideFoo }) {  
  20.   return (  
  21.     <>  
  22.       <h1>Foo</h1>  
  23.       <button onClick={hideFoo}>Hide Foo</button>  
  24.     </>  
  25.   );  
  26. }  
  27.   
  28. function Bar({ name }) {  
  29.   return <h1>{name}</h1>;  
  30. }  
  31.   
  32. const rootElement = document.getElementById("root");  
  33. ReactDOM.render(<App />, rootElement);  

可以看到,只要父组件 App 的状态值 isFooVisible 发生变化,Foo 和 Bar 就都会被重新渲染。

这里因为为了决定 Foo 是否要被渲染出来,我们需要将 isFooVisible 放在 App中维护,因此也就不能将状态拆出放到更低的层级。不过,在 isFooVisible 发生变化时重新渲染 Bar 仍然是不必要的,因为 Bar 并不依赖 isFooVisible。我们只希望 Bar 在传入属性 name 变化时重新渲染。

那我们该怎么搞呢?两种方法。

其一,对 Bar 做记忆化(memoize):

  1. const Bar = React.memo(function Bar({name}) {  
  2.   return <h1>{name}</h1>;  
  3. });  

这就能保证 Bar 只在 name 发生变化时才重新渲染。

此外,另一个方法就是让 Bar 继承 React.PureComponent 而非 React.Component:

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

是不是很熟悉?我们经常提到使用 React.PureComponent 能带来一定的性能提升,避免不必要的 render。

总结:避免组件不必要的渲染的方法有:React.memo 包裹的函数式组件,继承自 React.PureComponent 的 class 组件。

为什么不让每个组件都继承 PureComponent 或者用 memo 包呢?

(编辑:ASP站长网)

网友评论
推荐文章
    热点阅读