博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
react中PureComponent浅对比策略
阅读量:4911 次
发布时间:2019-06-11

本文共 1928 字,大约阅读时间需要 6 分钟。

PureComponent实现了Component中没有实现的shouComponentUpdata()方法,会对state和props进行一次浅对比,本文介绍一下浅对比策略

源码中,实现浅对比的函数是:shallowEqual(),源码:

//shouldComponentUpdate 源码: 判断是不是PureReactComponent,是的话,返回shallowEqual()if (ctor.prototype && ctor.prototype.isPureReactComponent) {    return (      !shallowEqual(oldProps, newProps) || !shallowEqual(oldState, newState)    );  }
// shallowEqual方法源码:const hasOwnProperty = Object.prototype.hasOwnProperty;// 这个is函数,处理了基本类型对比。function is(x, y) {  // SameValue algorithm  if (x === y) {    // Steps 1-5, 7-10    // Steps 6.b-6.e: +0 != -0    // Added the nonzero y check to make Flow happy, but it is redundant    return x !== 0 || y !== 0 || 1 / x === 1 / y;  } else {    // Step 6.a: NaN == NaN    return x !== x && y !== y;  }}/** * Performs equality by iterating through keys on an object and returning false * when any key has values which are not strictly equal between the arguments. * Returns true when the values of all keys are strictly equal. */function shallowEqual(objA: mixed, objB: mixed): boolean {  if (is(objA, objB)) {    return true;  }// 由于Obejct.is()可以对基本数据类型做一个精确的比较, 所以如果不等  // 只有一种情况是误判的,那就是object,所以在判断两个对象都不是object  // 之后,就可以返回false了  if (    typeof objA !== 'object' ||    objA === null ||    typeof objB !== 'object' ||    objB === null  ) {    return false;  } // 过滤掉基本数据类型之后,就是对对象的比较了  // 首先拿出key值,对key的长度进行对比  const keysA = Object.keys(objA);  const keysB = Object.keys(objB);  if (keysA.length !== keysB.length) {    return false;  }  /// key值相等的时候  // 借用原型链上真正的 hasOwnProperty 方法,判断ObjB里面是否有A的key的key值  // 属性的顺序不影响结果也就是{name:'daisy', age:'24'} 跟{age:'24',name:'daisy' }是一样的  // 最后,对对象的value进行一个基本数据类型的比较,返回结果  for (let i = 0; i < keysA.length; i++) {    if (      !hasOwnProperty.call(objB, keysA[i]) ||      !is(objA[keysA[i]], objB[keysA[i]])    ) {      return false;    }  }  return true;}export default shallowEqual;

 

转载于:https://www.cnblogs.com/yadiblogs/p/10732745.html

你可能感兴趣的文章
通过eclipse的egit插件提交提示Auth fail
查看>>
对象序列化
查看>>
UVA 208 Firetruck (DFS+剪枝)
查看>>
windows设置电脑的固定IP
查看>>
Python
查看>>
犀牛Phinoceros 如何切换中文语言
查看>>
Win7如何解决精简版的迅雷7无法运行
查看>>
C#.NET常见问题(FAQ)-如何判断某个字符是否为汉字
查看>>
直接用postman测试api ,服务器端没提供跨域也可以访问。
查看>>
数据的类型以及内置方法
查看>>
继承之super关键字的使用
查看>>
XML - 报表数据的新大陆
查看>>
echart在X轴下方添加字
查看>>
Map集合的两种取出方式
查看>>
GridView,Repeater增加自动序号列
查看>>
SMO算法精解
查看>>
第k小元素学习记录
查看>>
avi文件格式详解【转】
查看>>
django
查看>>
Java学习从入门到精通
查看>>