react函数组件性能优化-避免不必要的重新渲染

364 阅读1分钟

​ 持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第14天,点击查看活动详情

函数组件-性能优化(试了一下,react18好像没有这个问题)

当你想要避免函数组件 props 没有变化而产生的不必要更新时,就要用到 React.memo 了

初始状态,创建两个子组件(Child1, Child2)

Child1

export default function Child1({count}) {
  console.log('Child1, 组件被渲染了', count);
  return (
    <div>Child1=={count}</div>
  )
}

Child2

export default function Child2() {
  console.log('Child2, 组件被渲染了');
  return (
    <div>Child2</div>
  )
}

App

import { useState } from 'react';
import Child1 from './components/Child1';
import Child2 from './components/Child2';

export default function App() {

  const [count, setCount] = useState(0);

  // 单击按钮触发 计数器+1
  const add = () => {
    setCount(count + 1);
  }

  return (
    <div>
      <Child1 count={count}></Child1>
      <Child2></Child2>
      <button onClick={add}>按钮+1</button>
    </div>
  )
}

初次加载

​编辑

可以看出,Child2组件没有使用父组件的count,也一直被重新渲染

React.memo基本使用

格式:

const MemoChild = React.memo(Child)

改造

Child2

import React from 'react'

function Child2() {
  console.log('Child2, 组件被渲染了');
  return (
    <div>Child2</div>
  )
}

export default React.memo(Child2);

效果实现

​编辑

手动控制比较过程

export default React.memo(Child2, function areEqual(prevProps, nextProps) {
  /*
  如果把 nextProps 传入 render 方法的返回结果与
  将 prevProps 传入 render 方法的返回结果一致则返回 true,
  否则返回 false
  */
});

  • 第二个参数:用来比较更新前后 props 的函数。
  • 返回值:如果返回 true,表示记住(不重新渲染)该组件;如果返回 false,表示重新渲染该组件。

原理: 

通过对比检查更新前后 props 是否相同,来决定是否复用上一次的渲染结果

  • 如果相同,复用上一次的渲染结果
  • 如果不同,重新渲染组件

react函数组件性能优化-避免不必要的重新渲染

结论

当⽗组件重新渲染时: ⼦组件未使⽤ React.useMemo,不管⼦组件 props 是什么类型,⼦组件都会重复渲染;

⼦组件使⽤ React.useMemo,依赖项数组的值有改变时会造成⼦组件重复渲染; ​