手写对象浅比较(React中pureComponent和Component区别)

news2025/1/16 11:16:07

PureComponent和Component的区别

        PureComponent会给类组件默认加一个shouldComponentUpdate这样的周期函数

  //PureComponent类似自动加了这段
  shouldComponentUpdate(nextProps,nextState){
    let { props, state } = this;
    // props/state:修改之前的属性状态
    // nextProps/nextState: 将要修改的属性状态
    return !shallowEqual(props,nextProps) || !shallowEqual(state,nextState)
  }
  •   在此周期函数中,它对新老的属性/状态 会做一个浅比较
  •   如果经过浅比较,发现属性和状态并没有改变,则返回false(也就是不继续更新组件),有变化才会去更新!!
  • 当使用component时,父组件的state或prop更新时,无论子组件的state、prop是否更新,都会触发子组件的更新,这会形成很多没必要的render,浪费很多性能;
  • pureComponent的优点在于:pureComponent在shouldComponentUpdate只进行浅层的比较,只要外层对象没变化,就不会触发render,减少了不必要的render,当遇到复杂数据结构时,可以将一个组件拆分成多个pureComponent,以这种方式来实现复杂数据结构,以期达到节省不必要渲染的目的,如:表单、复杂列表、文本域等情况

pureComponent的优缺点:

  1. pureComponent的优点:不需要开发者使用shouldComponentUpdate就可使用简单的判断来提升性能;
  2. pureComponent的缺点:由于进行的是浅比较,可能由于深层的数据不一致导致而产生错误的否定判断,从而导致页面得不到更新;

手写对象的浅比较

1.浅比较含义:只比较对象的第一级,对于深层次内容,不会再进行比较

2.浅比较实现思路图

3.代码实现以及注释思路

//检测是否为对象
const isObject = function isObject(obj) {
  return obj !== null && /^(object|function)$/.test(typeof obj); //typeof obj === "object"
};
//对象的浅比较
const shallowEqual = function shallowEqual(objA, objB) {
  if (!isObject(objA) || !isObject(objB)) return false; //如果有一个不是对象就返回false
  if (objA === objB) return true;
  // 先比较成员的数量
  let keysA = Reflect.ownKeys(objA),
    keysB = Reflect.ownKeys(objB);

  if (keysA.length !== keysB.length) return false;
  //数量一致,再逐一比较内部的成员(只比较第一级:浅比较)
  for (let i = 0; i < keysA.length; i++) {
    let key = keysA[i];
    // 如果一个对象中有这个成员,一个对象中没有,或者都有这个成员,但是成员值不一样,都应该被判定为不相同!!
    //NAN ===NAN 返回是false
    //Object.is(NAN,NAN) 返回是true 底层也是三个等号
    if (!objB.hasOwnProperty(key) || !Object.is(objA[key], objB[key])) {
      //objA[key] !== objB[key]
      return false;
    }
  }
  //以上都处理完,发现没有不相同的成员,则认为两个对象是相等的
  return true;
};

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/755637.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

layui入门增删改查

layui入门增删改查 创建Lauiyi对象1.后台准备1.dao方法2.子实现类 2.R工具类的使用3.查询前端代码实现前端页面 4.增删改实现2.浮层3分离的js代码1.userManage.js2.userEdit.js3.index.js 5.运行效果 作为一名开发人员&#xff0c;我们经常需要对数据库中的数据进行增删改查&am…

120、仿真-51单片机温湿度光照强度C02 LCD1602 报警设计(Proteus仿真+程序+元器件清单等)

方案选择 单片机的选择 方案一&#xff1a;STM32系列单片机控制&#xff0c;该型号单片机为LQFP44封装&#xff0c;内部资源足够用于本次设计。STM32F103系列芯片最高工作频率可达72MHZ&#xff0c;在存储器的01等等待周期仿真时可达到1.25Mip/MHZ(Dhrystone2.1)。内部128k字节…

刷题 DAY4

题目1 给定一个有序数组arr&#xff0c;给定一个正数aim (1)返回累加和为aim的&#xff0c;所有不同二元组 (2)返回累加和为aim的&#xff0c;所有不同三元组 问题一 暴力的解法就是 遍历每一个二元组 找和为aim的 当然 只用暴力解很难ac 想一想有序 那肯定就是能加速 我们…

RocketMQ下载安装、集群搭建保姆级教程

目录 1.下载安装 2.配置 3.测试 4.集群配置 4.1.规划 4.2.环境准备 4.3.节点配置 4.3.1.master1 4.3.2.slave2 4.3.3.master2 4.3.4.slave1 4.4.启动 4.5.测试 1.下载安装 前置条件&#xff1a; JDK环境 下载地址&#xff1a; 下载 | RocketMQ 博主下载的是4.…

排序算法笔记--摩尔投票算法

摩尔投票算法 摩尔投票算法是一种用于在数组中查找出现次数超过一半的元素的有效算法。算法的核心思想是利用候选元素和计数器进行投票&#xff0c;通过消除不同元素之间的抵消来找到出现次数超过一半的元素。 算法原理 如果数组中存在一个出现次数超过一半的元素&#xff0…

【从零开始学习CSS | 第三篇】选择器优先级

目录 前言&#xff1a; 常见选择器的优先级&#xff08;从高到低&#xff09; 选择器的权重&#xff1a; 总结&#xff1a; 前言&#xff1a; 在前几篇文章中我们介绍了大量的选择器&#xff0c;那么大量的选择器在使用的时候&#xff0c;一定是有一个优先级顺序的&#xff…

graylog源码搭建

这里主要讲如何源码安装graylog 下载地址&#xff1a; https://www.graylog.org/downloads/ 下载带有JVM的源码文件源码安装 下载graylog-5.1.3-linux-x64.tgz&#xff0c;并上传到Centos中&#xff0c;执行以下操作 tar -zxvf graylog-5.1.3-linux-x64.tgzcd /etcmkdir -p …

Python GUI编程利器:Tkinker中的颜色选择对话框(15)

小朋友们好&#xff0c;大朋友们好&#xff01; 我是猫妹&#xff0c;一名爱上Python编程的小学生。 和猫妹学Python&#xff0c;一起趣味学编程。 今日目标 学习Tkinter中的颜色对话框的使用&#xff0c;实现如下效果&#xff1a; 颜色选择对话框 颜色选择对话框可以提供一…

JavaWeb 笔记——6

JavaWeb 笔记——6 一、Vue1.1、Vue-概述1.2、Vue快速入门1.3、Vue常用指令1.3、Vue生命周期1.4、查询所有-案例1.5、新增品牌-案例 二、Element2.1、Element概述2.2、快速入门2.3、Element布局2.4、常用组件 三、综合案例3.1、换件搭建3.2、查询所有3.3、新增品牌3.4、Servlet…

集群基础2——LVS负载均衡apache(nat模式)

文章目录 一、环境说明一、配置调度器网卡二、配置后端服务器三、配置调度器四、验证五、设置https负载均衡 一、环境说明 使用lvs中的nat模型&#xff0c;对apache负载均衡集群。 主机IP角色安装服务真实IP&#xff1a;192.168.161.129VIP&#xff1a;192.168.161.130调度服务…

证照之星软件怎么样?证照之星怎么换背景色

随着科技的快速发展&#xff0c;越来越多的软件应用于各个方面&#xff0c;为人们的生活和工作带来便利。今天&#xff0c;我们要介绍的就是一款证件照制作方面的软件——证照之星。那么&#xff0c;证照之星到底是什么软件&#xff1f;它好用吗&#xff1f;这篇文章将为大家详…

【PHP面试题45】cgi与fast_cgi关系是怎么样的

文章目录 一、CGI与FastCGI简介二、CGI与FastCGI的关系三、CGI与FastCGI的应用场景四、总结 一、CGI与FastCGI简介 本文已收录于PHP全栈系列专栏&#xff1a;PHP面试专区。 计划将全覆盖PHP开发领域所有的面试题&#xff0c;对标资深工程师/架构师序列&#xff0c;欢迎大家提前…

解析!1V1直播源码开发搭建技术实时语音识别翻译功能的应用

语言是我们人类交流的工具&#xff0c;它的种类繁多&#xff0c;比如世界语言&#xff0c;像是中国的汉语、英国的英语、法国的法语等&#xff1b;又或是我们中国的方言&#xff0c;像是山东话、北京话、上海话等。可谓是五花八门&#xff0c;争奇斗艳&#xff0c;每一种世界语…

MySQL的安装与卸载

1. MySQL安装 连接MySQL cmd或自带工具或Navicat 2. MSQL卸载

怎么管理酒店后勤维修工作?如何提高客户满意度?

酒店维修不及时会对客户满意度产生负面影响。当客人入住酒店时&#xff0c;如果发现设施设备出现故障或损坏&#xff0c;会直接影响客人的入住体验和满意度。如果这些故障或损坏得不到及时维修和解决&#xff0c;客人会对酒店的服务质量和信誉产生怀疑&#xff0c;可能会对酒店…

3.2.17 什么是数组及应用

【分享成果&#xff0c;随喜正能量】人这一生&#xff0c;好不好都得自己走&#xff0c;累不累都得自己承受。每个人都有难言之苦&#xff0c;每个人都有无声的泪&#xff0c;岁月可曾放过谁&#xff1f;再风光的人&#xff0c;背后都有寒凉凄楚&#xff0c;再幸福的人&#xf…

【UE4 塔防游戏系列】04-敌人沿着指定路线移动

目录 效果 步骤 一、绘制道路 二、创建出生点和路径点 三、生成敌人 四、敌人沿着路径点移动 效果 步骤 一、绘制道路 首先绘制一条道路&#xff0c;后面希望敌人会沿着这条绘制道路行走。 二、创建出生点和路径点 2.1 新建父类为Actor的蓝图&#xff0c;作为敌人出…

Docker——认识Docker 常用命令 Linux中安装docker 常见问题及其解决

目录 引出Docker是啥&#xff1f;Docker是啥&#xff1f;Docker VS 虚拟机1.特性优势2.资源优势 Docker的架构Docker常用命令&#xff08;1&#xff09;docker ps&#xff08;2&#xff09;docker stop 容器名称&#xff08;3&#xff09;docker ps -a&#xff08;4&#xff0…

css基础知识二十:说说对Css预编语言的理解?有哪些区别?

一、是什么 Css 作为一门标记性语言&#xff0c;语法相对简单&#xff0c;对使用者的要求较低&#xff0c;但同时也带来一些问题 需要书写大量看似没有逻辑的代码&#xff0c;不方便维护及扩展&#xff0c;不利于复用&#xff0c;尤其对于非前端开发工程师来讲&#xff0c;往…