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

news/2024/11/7 9:31:40/

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; //如果有一个不是对象就返回falseif (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.ppmy.cn/news/884451.html

相关文章

edem2018失败?电脑名显示no-net导致许可证不能添加

此时&#xff0c;是系统的用户变量缺失&#xff0c;解决方案如下&#xff1a; 就可以完美运行啦&#xff01;&#xff01;&#xff01;

打开Visual Studio提示“无效的许可证书,需要重新安装”的解决方法

我是因为卸载office后&#xff0c;visual studio就用不了。点击之后弹出“无效的许可证书&#xff0c;需要重新安装”。 注册vs有一个独立的工具&#xff0c;对于vs2015&#xff0c;在C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\DDConfigCA.exe&#x…

VS2019 无法登录 许可证已过期 无法下载许可证

许可证已过期 点击检查更新的许可证&#xff0c;报出错误&#xff1a;我们无法下载许可证&#xff0c;请检查你的网络连接或代理设置 解决方法 其实问题就在于嵌入式web浏览器的问题&#xff0c;选择账户选项-》账户-》登录选项-》将嵌入式web浏览器改为系统web浏览器。随后就…

solidwork2019/2020安装后出现无法获得许可证

解决方案&#xff1a;1、将SolidSQUAD_下Program Files和Program Files&#xff08;x86&#xff09;中所有内容拷贝到系统C盘对应的文件夹中&#xff08;这一步在通常安装教程中没有&#xff09;2、将C:\Program Files\SOLIDWORKS Corp\SOLIDWORKS里的netapi32.dll文件复制到安…

VS2010出现“无效的许可证数据,需重新安装”

1. 找到 安装路径下Microsoft Visual Studio 10.0\Common7\IDE\DDConfigCA.exe ,使用管理员权限运行该exe文件&#xff0c; 等待自然推出&#xff1b; 2. 重启VS&#xff0c;重新输入产品密钥 &#xff0c; VS2010专业版&#xff08;or旗舰版&#xff09;密钥&#xff1a;YCFHQ…

怎样解决PowerDesigner15出现许可证过期问题?

打开PowerDesigner软件&#xff0c;出现许可证过期问题&#xff0c;解决方法&#xff1a; 1.打开软件安装路径&#xff08;右击软件&#xff0c;点击打开文件所在位置即可&#xff09; 2.下载破解PowerDesigner版本的补丁&#xff08;powerDesigner15.116.5破解补丁.rar&#…

Visual Studio 2019许可证授权

Visual Studio 2019许可证如下&#xff0c;亲测有效&#xff1a; Visual Studio 2019 Enterprise&#xff08;企业版&#xff09; BF8Y8-GN2QH-T84XB-QVY3B-RC4DFVisual Studio 2019 Professional&#xff08;专业版&#xff09; NYWVH-HT4XC-R2WYW-9Y3CM-X4V3Y

prescan许可证无效

出现了如上的报错&#xff0c;但我的FlexNet Licensing error:-10,32 FlexNet Licensing error查询网站 https://blog.csdn.net/baidu_18607183/article/details/51319104 之前看到一个人博主说无论是几几年都把“madlic_SSQ.dat” 文件中&#xff0c;全部的 “2019” 为 “20…