其他分享
首页 > 其他分享> > React优化点滴

React优化点滴

作者:互联网

谈到React优化,估计说的最多的就是减少子组件渲染,减少真实DOM节点操作等。

1. shouldComponentUpdate, 通过对Props和State的浅比较,如果没有变化,return false,避免重复多余的render方法调用,省去虚拟DOM的生成和对比过程,提高性能。

 早期类似的技术有pureRender,16版本中可以直接对class组件继承PureComponent,它的实现其实也很简单,也只是浅比较,因为过深的比较也会消耗很多的时间,或许还比render方法的消耗大。

 注意这里的浅比较,基础类型比较值是否相等,不等则需要再次渲染;对于引用类型,先比较引用的地址,地址相同,不渲染,地址不同,判断两个对象的keys的长度,长度不等,则需要渲染,相等则对第一层属性比较,如果有不同,则渲染,否则不渲染。下面的code则是核心主要逻辑。

注意object.is(ES6)和===的主要区别,是object.is(+0,-0) === false, Object.is(NaN,Nan) === false

function is(x, y) { //处理了基本类型的比较
  //1,针对+0===-0的情况
  //2. 针对NaN!==NanN的情况
  return x === y && (x !== 0 || 1 / x === 1 / y) || x !== x && y !== y 
  ;
}
var is$1 = typeof Object.is === 'function' ? Object.is : is;
var hasOwnProperty$2 = Object.prototype.hasOwnProperty;

//返回值:false更新  true不更新
function shallowEqual(objA, objB) {
  if (is$1(objA, objB)) {//基本数据类型 不更新
    return true;
  }
 //由于Object.is 可以对基本数据类型做一个精确的比较 如果不等只有一种情况 那就是object, objA/objB中,只要有一个不是object或为null则返回false
  if (typeof objA !== 'object' || objA === null || typeof objB !== 'object' || objB === null) {
    return false;
  }
  //过滤掉基本数据类型 就是对象比较 首先比较长度 优化性能
 //比较oldProps和新的Props以及oldState和newState长度是否相同 如果长度不同则重新更新渲染 如果长度相同则不用重新渲染 如果不相等 不会往下执行 优化性能
  var keysA = Object.keys(objA);
  var keysB = Object.keys(objB);
  if (keysA.length !== keysB.length) {
    return false;  
  }
   //如果key相等
   //如果objA的属性不在objB里,或者是objA的属性值和objB的属性值不等 则重新渲染 不考虑当keysA[i]为对象的多层问题 浅显比较 提高性能
   for (var i = 0; i < keysA.length; i++) { 
       if (!hasOwnProperty$2.call(objB, keysA[i]) || !is$1(objA[keysA[i]], objB[keysA[i]])) {
      return false;
    }
  return true;
 }
}

 

标签:keysA,objA,false,Object,React,objB,return,优化,点滴
来源: https://www.cnblogs.com/roy1/p/13832424.html