【问题标题】:Is there an example where using React.memo/PureComponent has worse performance than not using it?有没有使用 React.memo/PureComponent 比不使用它的性能更差的例子?
【发布时间】:2021-10-30 06:12:23
【问题描述】:

我在讨论和文章(其中许多来自 React 的开发人员)中多次看到提到 React.memo 或 PureComponent 会带来性能开销,并且应该仅在实际测量性能后应用。

但是,正如 this answer 中所见,认为对 props 进行浅层比较的开销可能超过深度 VDOM 比较的成本是违反直觉的,而且如果没有一个具体的例子来实际展示React.memo 或 PureComponent 确实更慢的情况。

但是,在花了整整一个晚上搜索有关此主题的更多信息之后,我还没有找到这样的示例。

是不是因为这样的例子构造起来不那么简单?或者它是如此微不足道,以至于在大多数情况下都可以观察到性能损失(因此无需编写一些示例代码来展示这种效果)?

【问题讨论】:

  • 我理解 react 的方式是,在每次重新渲染时都会进行深度 vdom 比较,无论是否实际渲染了子级以比较道具为代价。

标签: reactjs performance memoization premature-optimization


【解决方案1】:

根据我的理解,如果从父级传递到子级的 prop 保证在每次重新渲染时都会发生变化,React.memo 可能会因为每次重新渲染都会执行额外的比较而阻碍性能。

例如:

import React, { useState } from "react";

export default function Form() {
  const [text, updateText] = useState("");

  const handleSubmit = (e) => {
    updateText(e.target.value);
  };
  return (
    <>
      <Input value={text} onChange={handleSubmit} />
    </>
  );
}

const Input = React.memo(function Input(props) {
  console.log("render");

  return (
    <>
      <input value={props.value} onChange={props.onChange} />
    </>
  );
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>

在这种情况下,Input 组件将在每次父级重新渲染时重新渲染,因为 handleSubmit 没有被记忆,并且每次引用都会改变。添加memo 会影响性能,因为它会在重新渲染之前强制进行道具比较,并且道具比较总是返回false,所以结果memo 只是为每个渲染添加了一个额外的对象比较。

【讨论】:

  • 哦,我明白了!记忆化节省的时间乘以 在每次渲染期间道具保持不变的可能性。如果一个组件的变化足够频繁,这个因素就会降低,这样节省的时间就会少于浪费的时间。谢谢!
猜你喜欢
  • 1970-01-01
  • 2013-01-18
  • 2011-09-05
  • 2020-06-25
  • 1970-01-01
  • 1970-01-01
  • 2023-04-08
  • 2021-03-04
  • 2011-12-12
相关资源
最近更新 更多