返回顶部
首页 > 资讯 > 精选 >Component与PureComponent对比源码分析
  • 102
分享到

Component与PureComponent对比源码分析

2023-07-05 08:07:15 102人浏览 独家记忆
摘要

这篇文章主要介绍了Component与PureComponent对比源码分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Component与PureComponent对比源码分析文章都会有所收获,下面我们一起

这篇文章主要介绍了Component与PureComponent对比源码分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Component与PureComponent对比源码分析文章都会有所收获,下面我们一起来看看吧。

官方文档

React.PureComponent 与 React.Component很相似。两者的区别在于 React.Component 并未实现 shouldComponentUpdate(),而 React.PureComponent 中以浅层对比 prop 和 state 的方式来实现了该函数。

官方解释也很容易理解,React.PureComponentReact.Component中多实现了一个方法,就导致了在组件数据发生变化时,React.PureComponent会先进行和上一次的比较,如果相同,就不会再继续更新了。

对比

先看两者相同得地方 代码如下

class Box1 extends React.Component {  render() {    console.log('Box1 update');    return <div>Box1: {this.props.count}</div>;  }}
class Box2 extends React.PureComponent {  render() {    console.log('Box2 update');    return <div>Box2: {this.props.count}</div>;  }}

先制作2个对比的组件Box1与Box2, 然后制作一个父组件引入其中,并设置一个方法

export default () => {  const [count, setCount] = React.useState(1);  console.log('parent update');  return (    <div>      <Box1 count={count}/>      <Box2 count={count}/>      <button onClick={() => setCount(count + 1)}>+1</button>    </div>  );};

此时,点击button按钮的时候,上述2个Box组件都会进行更新。

Component与PureComponent对比源码分析

这也是最基础的组件更新。

取消外部数据引入

class Box1 extends React.Component {  render() {    console.log('Box1 update');    return <div>Box1</div>;  }}class Box2 extends React.PureComponent {  render() {    console.log('Box2 update');    return <div>Box2</div>;  }}export default () => {  const [count, setCount] = React.useState(1);  console.log('parent update');  return (    <div>      <Box1 />      <Box2 />      <button onClick={() => setCount(count + 1)}>+1</button>    </div>  );};

取消Box组件内对外部count的引入

此时页面更新为

Component与PureComponent对比源码分析

此时会发现只有Box1重新刷新了一遍,而Box2未重新加载组件,也就是PureComponent内部做了浅比较相同的不会进行更新。

为什么被称为浅比较

浅比较是指对值类型进行比较,而稍微复杂一点的引用类型(Object),就无法进行判断了,react内部的更新都是浅比较。

export default () => {  const [count, setCount] = React.useState({ num: 1 });  console.log('parent update');  const click = () => {    const newCount = count;    newCount.num = count.num + 1;    setCount(newCount);    console.log('update:', count)  };  return (    <div>      <Box1 />      <Box2 />      <button onClick={click}>+1</button>    </div>  );};

此时,父组件内部的count为对象类型,此时进行更新时,页面不会触发任何更新,父组件也不会进行刷新(由于是引用类型,newCount发生数据变化时,count其实已经发生变化,但是页面并不会有任何的反应)。

Component与PureComponent对比源码分析

由图可见,子组件和父组件并没有进行刷新,均未打印。

小知识点

const的不可变定义也是只对于值类型而言,对于引用类型,还是依然可变。上述代码云清并不会报错。

说明

上述的一切代码都是建立在父组件自身更新的基础上子组件才会刷新,如果我将setCount(count + 1)改为setCount(count + 0),那么,父组件本身不会进行刷新,子组件也就理所当然的不会有任何变化。

另类的不更新

这里的父组件刷新带动子组件刷新有一种例外的情况。代码如下

const Parent = ({ children }) => {  const [count, setCount] = React.useState(1);  console.log('parent update');  return (    <div>      {children}      <button onClick={() => setCount(count + 1)}>box2</button>    </div>  );};export default () => {  return (    <Parent>      <Box1 />      <Box2 />    </Parent>  );};

将父组件抽离出来,子组件以children的形式引入。 此时页面点击发生的变化为

Component与PureComponent对比源码分析

会发现不管怎么点击,只有Parent组件进行刷新,子组件全部都毫无反应。

关于“Component与PureComponent对比源码分析”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“Component与PureComponent对比源码分析”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注编程网精选频道。

--结束END--

本文标题: Component与PureComponent对比源码分析

本文链接: https://lsjlt.com/news/350427.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Component与PureComponent对比源码分析
    这篇文章主要介绍了Component与PureComponent对比源码分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Component与PureComponent对比源码分析文章都会有所收获,下面我们一起...
    99+
    2023-07-05
  • Component与PureComponent对比解析
    目录题外话官方文档对比取消外部数据引入为什么被称为浅比较小知识点说明另类的不更新总结题外话 有啥不对的请多多指教,研究的不算很深,记录为了分享,也为了博采众长,完善知识。 官方文档...
    99+
    2023-03-01
    Component PureComponent解析 Component PureComponent
  • GoLang string与strings.Builder使用源码对比分析
    本文小编为大家详细介绍“GoLang string与strings.Builder使用源码对比分析”,内容详细,步骤清晰,细节处理妥当,希望这篇“GoLang string与strings.Builder使用源码对比分析...
    99+
    2023-07-05
  • workerman和swoole源码对比分析
    这篇“workerman和swoole源码对比分析”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“workerman和swoo...
    99+
    2023-07-05
  • fastapi与django异步的并发源码对比分析
    这篇文章主要介绍“fastapi与django异步的并发源码对比分析”,在日常操作中,相信很多人在fastapi与django异步的并发源码对比分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”fastapi...
    99+
    2023-07-05
  • mybatis查询方式与效率高低源码对比分析
    这篇文章主要介绍“mybatis查询方式与效率高低源码对比分析”,在日常操作中,相信很多人在mybatis查询方式与效率高低源码对比分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”mybatis查询方式与效...
    99+
    2023-07-05
  • 大数组元素差异removeAll与Map效率源码对比分析
    本文小编为大家详细介绍“大数组元素差异removeAll与Map效率源码对比分析”,内容详细,步骤清晰,细节处理妥当,希望这篇“大数组元素差异removeAll与Map效率源码对比分析”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一...
    99+
    2023-07-05
  • Vue.js React与Angular流行前端框架优势源码对比分析
    这篇文章主要介绍“Vue.js React与Angular流行前端框架优势源码对比分析”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Vue.js React与Angular流行前...
    99+
    2023-07-05
  • Python列表和集合效率源码对比分析
    这篇“Python列表和集合效率源码对比分析”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Python列表和集合效率源码对比...
    99+
    2023-07-06
  • Vue3响应式函数toRef()对比toRefs()源码分析
    今天小编给大家分享一下Vue3响应式函数toRef()对比toRefs()源码分析的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下...
    99+
    2023-07-05
  • TypeScript与JavaScript对比及打包工具对比分析
    这篇文章主要介绍了TypeScript与JavaScript对比及打包工具对比分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇TypeScript与JavaScript对比及打包工具对比分析文章都会有所收获,...
    99+
    2023-07-05
  • Redis对象与redisObject超详细分析源码层
    目录一、对象二、对象的类型及编码RedisObject 结构体三、不同对象编码规则四、redisObject结构各字段使用范例4.1 类型检查(type字段)4.2 多态命令的实现(encoding)4.3 内存回收和共...
    99+
    2022-11-28
    Redis对象 RedisredisObject RedisredisObject源码
  • Aspectj与Spring AOP的对比分析
    1、简介 今天有多个可用的 AOP 库, 它们需要能够回答许多问题: 1、是否与用户现有的或新的应用程序兼容? 2、在哪里可以实现 AOP? 3、与自己的应用程序集成多快? 4、性能...
    99+
    2024-04-02
  • Clojure与Java对比实例分析
    这篇文章主要介绍“Clojure与Java对比实例分析”,在日常操作中,相信很多人在Clojure与Java对比实例分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Clojure与Java对比实例分析”的疑...
    99+
    2023-07-02
  • C语言与Python的对比与分析
    C语言与Python的对比与分析 C语言和Python是两种不同的编程语言,各有优点和适用场景。C语言作为一种底层语言,被广泛应用于系统编程、嵌入式开发等领域,具有高效性和灵活性的特点...
    99+
    2024-04-02
  • MySQL多表关联on和where速度源码对比分析
    今天小编给大家分享一下MySQL多表关联on和where速度源码对比分析的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章...
    99+
    2023-03-24
    mysql where on
  • 开源与专有软件:比较与对比
    🌷🍁 博主猫头虎 带您 Go to New World.✨🍁 🦄 博客首页——猫头虎的博客🎐 🐳《面试题大全专栏》 文章图文并茂&#...
    99+
    2023-08-30
    开源
  • Pytorch中Softmax与LogSigmoid的对比分析
    Pytorch中Softmax与LogSigmoid的对比 torch.nn.Softmax 作用: 1、将Softmax函数应用于输入的n维Tensor,重新改变它们的规格,使n维...
    99+
    2024-04-02
  • MySQL中InnoDB与MyISAM的对比分析
    小编给大家分享一下MySQL中InnoDB与MyISAM的对比分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!对比InnoDB与MyISAM1、 存储结构MyI...
    99+
    2023-06-27
  • hive与rdbms对比的分析说明
    这篇文章给大家分享的是有关hive与rdbms对比的分析说明的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。Hive并非为联机事务处理而设计,Hive并不提供实时的查询和基于行级的数据更新操作。Hive是建立在Ha...
    99+
    2023-06-03
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作