React Component和Purecomponent区别

前言

大家好,我是小杨,一个做了快6年的前端老油条。今天聊一个React里老生常谈但很多人其实没彻底搞明白的问题------ComponentPureComponent的区别。别看它基础,用对了能直接提升组件性能,用错了可能莫名其妙踩坑。下面我就用最人话的方式,带大家彻底搞懂它!


1. 先看本质区别

  • Component:每次父组件更新,子组件无条件跟着重新渲染(不管props/state变没变)。
  • PureComponent :会自动对props和state做浅比较,只有变化了才重新渲染。

👉 一句话总结PureComponentComponent的"智能防呆版",能避免不必要的渲染。


2. 举个栗子🌰,立马明白

假设有个"我"的信息展示组件:

jsx 复制代码
// 普通Component版本
class 我的信息 extends React.Component {
  render() {
    console.log('我渲染了!'); // 每次父组件更新都会触发
    return <div>{this.props.name} 今年 {this.props.age} 岁</div>;
  }
}

// PureComponent版本
class 我的信息 extends React.PureComponent {
  render() {
    console.log('我渲染了!'); // 只有props.name或props.age变化时触发
    return <div>{this.props.name} 今年 {this.props.age} 岁</div>;
  }
}

现象

  • 如果父组件传给<我的信息 name="小杨" age={18} />的props一直不变:

    • Component版本:父组件任何state更新,子组件都会傻傻地重新渲染。
    • PureComponent版本:直接跳过渲染,省性能!

3. 什么时候该用PureComponent?

适合场景

  • 纯展示型组件(props/state变化不频繁)。
  • 数据结构简单(浅比较能准确判断变化)。

慎用场景

  • props/state嵌套层级深(浅比较会漏判变化)。
  • 传递回调函数(每次父组件渲染生成新函数引用,浅比较失效)。

举个坑爹例子

jsx 复制代码
<我的信息 
  name="小杨" 
  age={18}
  onClick={() => { /* 每次父渲染都生成新函数!PureComponent失效 */ }}
/>

4. 手动优化:函数组件版

函数组件没有PureComponent,但可以用React.memo实现同样效果:

jsx 复制代码
const 我的信息 = React.memo(
  ({ name, age }) => <div>{name} 今年 {age} 岁</div>,
  (prevProps, nextProps) => prevProps.name === nextProps.name 
    && prevProps.age === nextProps.age // 自定义比较逻辑
);

5. 小杨的实战建议

  1. 默认先用Component,遇到性能问题再考虑优化。
  2. 深数据结构 别硬用PureComponent,该用useMemo/useCallback手动控制。
  3. 记住浅比较的局限{ a: 1 }{ a: 1 }会被判定为"不同"(因为是两个对象引用)。

最后吐槽

当年我第一次用PureComponent时,因为传了个style={{ color: 'red' }}导致组件死活不更新,排查到凌晨3点...(血的教训啊!)大家用的时候一定要留意引用类型!

⭐ 写在最后

请大家不吝赐教,在下方评论或者私信我,十分感谢🙏🙏🙏.

✅ 认为我某个部分的设计过于繁琐,有更加简单或者更高逼格的封装方式

✅ 认为我部分代码过于老旧,可以提供新的API或最新语法

✅ 对于文章中部分内容不理解

✅ 解答我文章中一些疑问

✅ 认为某些交互,功能需要优化,发现BUG

✅ 想要添加新功能,对于整体的设计,外观有更好的建议

✅ 一起探讨技术加qq交流群:906392632

最后感谢各位的耐心观看,既然都到这了,点个 👍赞再走吧!

相关推荐
前端大卫29 分钟前
为什么 React 中的 key 不能用索引?
前端
你的人类朋友31 分钟前
【Node】手动归还主线程控制权:解决 Node.js 阻塞的一个思路
前端·后端·node.js
小李小李不讲道理2 小时前
「Ant Design 组件库探索」五:Tabs组件
前端·react.js·ant design
毕设十刻2 小时前
基于Vue的学分预警系统98k51(程序 + 源码 + 数据库 + 调试部署 + 开发环境配置),配套论文文档字数达万字以上,文末可获取,系统界面展示置于文末
前端·数据库·vue.js
mapbar_front3 小时前
在职场生存中如何做个不好惹的人
前端
牧杉-惊蛰3 小时前
纯flex布局来写瀑布流
前端·javascript·css
一袋米扛几楼985 小时前
【软件安全】什么是XSS(Cross-Site Scripting,跨站脚本)?
前端·安全·xss
向上的车轮5 小时前
Actix Web适合什么类型的Web应用?可以部署 Java 或 .NET 的应用程序?
java·前端·rust·.net
XiaoYu20025 小时前
第1章 核心竞争力和职业规划
前端·面试·程序员
excel5 小时前
🧩 深入浅出讲解:analyzeScriptBindings —— Vue 如何分析 <script> 里的变量绑定
前端