










React.PureComponent 是 React 15.3 引入的一个优化手段,它通过浅比较(shallow compare)props 和 state 来自动实现 shouldComponentUpdate,从而避免不必要的重新渲染。理解何时使用它,可以帮你写出更高效的 React 应用。
React.PureComponent?props 和 state,组件总是渲染相同的结果。componentDidMount 或 componentDidUpdate 中。props 和 state 实际上并没有变化,使用 PureComponent 可以跳过这次渲染,提升性能。PureComponent 可以阻止该子树的不必要更新。React.PureComponent?PureComponent 只做浅比较,如果直接修改对象或数组内部的值(而没有创建新对象),浅比较会认为新旧值相等,从而跳过更新。this.state.user.name = "New Name"; // 直接修改对象属性
this.setState({ user: this.state.user }); // 引用相同,PureComponent 认为没变化
this.setState({ user: { ...this.state.user, name: "New Name" } });
shouldComponentUpdate 做深比较,或者使用 React.memo(函数组件)配合自定义比较函数。children 或 render propsprops.children 是动态生成的 JSX 或函数,每次父组件渲染时都会生成新的引用,导致浅比较认为 props 变化,从而失去优化意义。PureComponent 往往没有效果,甚至可能因为频繁比较而增加开销。window 上的数据)或执行了副作用(如日志记录),那么跳过渲染可能会造成逻辑错误。React.memo在 React 16.6+ 中,函数组件可以使用 React.memo,它提供了类似 PureComponent 的浅比较优化,且更加灵活:
const MyComponent = React.memo(function MyComponent(props) {
// 渲染逻辑
});
你可以传入第二个参数自定义比较函数,弥补浅比较的不足。
Immutable.js、Immer 或对象/数组展开运算符(...)确保每次更新都产生新引用。React.PureComponent 在 React 15.3.0 中引入,如果你的项目使用的是更低版本,需要升级。componentWillReceiveProps 仍被广泛使用,但配合 PureComponent 时要注意:父组件每次重新渲染都会传递新的 props(即使内容相同),但浅比较会正确过滤掉无实际变化的更新。组件是否纯(无副作用,输入相同输出相同)?
├─ 否 → 不要用 PureComponent
└─ 是 → props/state 是否包含可变数据结构或深层嵌套?
├─ 是 → 不要用 PureComponent(或确保不可变更新)
└─ 否 → 组件是否频繁接收相同 props/state?
├─ 是 → 可以使用 PureComponent
└─ 否 → 使用普通 Component 即可
React.PureComponent 是一个很有用的性能优化工具,但只有在你正确管理数据不可变性且组件符合“纯组件”特征时,才能发挥它的优势。
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。