reactjs - 有没有使用 React.memo/PureComponent 比不使用它的性能更差的例子?
问题描述
我在讨论和文章(其中许多来自 React 的开发人员)中看到很多次提到React.memo
或PureComponent
带有性能开销,并且应该仅在实际测量性能后应用。
但是,正如在这个答案React.memo
中所看到的那样,认为对 props 进行浅层比较的开销可能超过深度 VDOM 比较的成本是违反直觉的,而且如果没有一个具体的例子来实际显示orPureComponent
的情况,似乎很难反驳确实比较慢。
但是,在花了整整一个晚上寻找有关此主题的更多信息之后,我还没有找到这样的示例。
是不是因为这样的例子构造起来不那么简单?或者它是如此微不足道,以至于在大多数情况下都可以观察到性能损失(所以没有必要为了展示这种效果而编写一些示例代码)?
解决方案
根据我的理解,如果保证从父级传递给子级的道具在每次重新渲染时都会发生变化,则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
只是为每个渲染添加了一个额外的对象比较。
推荐阅读
- vue.js - Vue路由器重定向到超时哈希
- python - 带有 pyca/密码学的 DES 密码 (PBEWithMD5AndDES)
- google-cloud-platform - 在 Google Cloud Composer 中使用 json 文件导入变量
- swift - 如何从 [AnyObject] 数组中过滤特定类型的对象
- powershell - 如何在 Invoke-Expression -Command 中转义“at 符号”(@)?
- html - 如果段落从标题开始,如何对齐段落的下一行
- java - 扫描多个输入时没有此类元素异常
- mysql - 我可以在 MySQL 表上对字符串使用 ON UPDATE - VARCHAR 列吗
- css - 不依赖 JavaScript 的 Bootstrap CDN 的 WordPress 后备?
- azure - 在 MacOS 上使用 sourcetree 连接到 Azure devops 存储库