美文网首页
React.memo

React.memo

作者: 就问你怕不怕 | 来源:发表于2021-12-09 14:49 被阅读0次

先来看官网解释:

React.memo 为高阶组件。
如果你的组件在相同 props 的情况下渲染相同的结果,那么你可以通过将其包装在 React.memo 中调用,以此通过记忆组件渲染结果的方式来提高组件的性能表现。这意味着在这种情况下,React 将跳过渲染组件的操作并直接复用最近一次渲染的结果。

使用方式为:

const MyComponent = React.memo(function MyComponent(props) {
  /* 使用 props 渲染 */
});

也就是说,React.memo能够实现子组件根据props是否变更来判断该子组件是否发生重新渲染,也是属于性能优化的一个东西。先看下面的例子:

import { useState,  memo } from "react";
import * as ReactDOM from "react-dom";

function Child({seconds}){
  console.log('I am rendering');
  return (
      <div>I am update every {seconds} seconds</div>
  )
};
// const MemoChild = memo(Child);
function App() {
  const [count, setCount] = useState(0);
  
  return (
    <>
      <button onClick={()=>setCount((count)=>count+1)} >点击次数:{count}</button>
      <Child seconds={1}/>
    </>
  );
}

const rootElement = document.getElementById("root");
ReactDOM.render(<App />, rootElement);

image.png

可以看到,当我在父组件中点击按钮的时候,子组件Child也跟随发生渲染。很明显子组件的渲染是没有必要的,因为它并不依赖count这个状态,那么这个时候该如何解决呢?
此时当然是 React.memo来解决这个问题了!

import { useState,  memo } from "react";
import * as ReactDOM from "react-dom";

function Child({seconds}){
  console.log('I am rendering');
  return (
      <div>I am update every {seconds} seconds</div>
  )
};
const MemoChild = memo(Child);
function App() {
  const [count, setCount] = useState(0);
  
  return (
    <>
      <button onClick={()=>setCount((count)=>count+1)} >点击次数:{count}</button>
      <MemoChild seconds={1}/>
    </>
  );
}

const rootElement = document.getElementById("root");
ReactDOM.render(<App />, rootElement);

只需要使用React.memo将子组件包裹起来,返回一个新的组件就可以了。实际运行效果如下:


image.png

可以看到,我在父组件中点击按钮更新count状态多次,但子组件并不受影响。说明此时React.memo起作用了。

const [seconds, setSeconds] = useState(0);
  return (
    <>
      <button onClick={()=>setCount((count)=>count+1)} >点击次数:{count}</button>
      <button onClick={()=>setSeconds((seconds)=>seconds+1)} >seconds:{seconds}</button>
      <MemoChild seconds={seconds}/>
    </>
  );
image.png

现在我将seconds传入子组件,在父组件中通过另一个按钮点击改变它的值,发现子组件正常渲染。

另外,React.memo还有第二个参数,类似于class组件中shouldComponentUpdate的用法,不过返回true和false的逻辑是相反的:

function Child({seconds}){
    ...
};

function areEqual(prevProps, nextProps) {
    if(prevProps.seconds===nextProps.seconds){
        return true
    }else {
        return false
    }
}

React.memo(Child,areEqual)

比较:React.memo与useMemo?

很明显,React.memo是高阶组件,用于包装整个组件使其达到性能优化,相当于在class组件中的PureComponent,而useMemo则是在组件内部针对局部进行性能优化。

完。

相关文章

  • 如何使用React.memo()

    目录 包装函数 PureComponent React.memo() React.memo() 与Redux 其他...

  • React.memo()

    React 16.6.0 正式发布 React.memo() React.memo() 是什么? React.me...

  • Hooks进阶

    React.memo、useMemo、useCallback 的区别 React.memo 是对传入的 props...

  • [React Hooks] 样例学习---useWhyDidYo

    前置知识 React.memo React.memo 是一个高阶组件。类似于 React.PureComponen...

  • 封装了一个react下拉刷新上拉加载组件

    useState,useEffect,React.memo,Ts 使用等

  • React.memo

    React.memo 为高阶组件。它与 React.PureComponent 非常相似,但它适用于函数组件,但不...

  • react.memo

    React.memo 和 JS 的 memorize 函数的区别 https://dmitripavlutin.c...

  • React.memo

    1.基础使用 React.memo 相当于 React.pureComponent内部的shouldCompone...

  • React.memo

    先来看官网解释: React.memo 为高阶组件。如果你的组件在相同 props 的情况下渲染相同的结果,那么你...

  • React.memo() - React.lazy()

    介绍 包装函数 PureComponent React.memo() Redux配合使用 React.lazy()...

网友评论

      本文标题:React.memo

      本文链接:https://www.haomeiwen.com/subject/jgkffrtx.html