react中PureComponent浅对比策略
2019-04-20 08:56:04来源:博客园 阅读 ()
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
如有疑问请与原作者联系
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇:es6 字符串的扩展和数值的扩展
下一篇:网页播放器开发(四)代码精炼提纯
- 前端笔记之React(八)上传&图片裁切 2019-08-14
- 前端笔记之React(七)redux-saga&Dva&路由 2019-08-14
- 前端笔记之React(六)ES6的Set和Map&immutable和Ra 2019-08-14
- 前端笔记之React(五)Redux深入浅出 2019-08-14
- 前端笔记之React(四)生命周期&Virtual DOM和Diff 2019-08-14
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash