View on GitHub

Cycle263 Blog

Stay hungry, stay foolish.

react diff原理

根据新数据生成一个全新的Virtual DOM,然后跟上次生成的Virtual DOM去 diff,得到一个Patch,然后把这个Patch更新到浏览器的DOM上去,这里的patch是新的虚拟DOM和上一次的虚拟DOM经过diff后的差异化的部分。

compare

diff

React 只会简单地考虑同层级节点的位置变换,而对于不同层级的节点,只有分步骤进行多次创建和删除操作。这是一种影响React性能的操作,因此官方建议不要进行 DOM 节点跨层级的操作。

在开发组件时,保持稳定的 DOM 结构会有助于性能的提升。例如,可以通过 CSS 隐藏或显示节点,而不是真正地移除或添加 DOM 节点。

pureRender优化

function shallowCompare(instance, nextProps, nextState) {
  return (
    !shallowEqual(instance.props, nextProps) ||
    !shallowEqual(instance.state, nextState)
  );
}

function is(x, y) {
  // SameValue algorithm
  if (x === y) {
    // Steps 1-5, 7-10
    // Steps 6.b-6.e: +0 != -0
    return x !== 0 || 1 / x === 1 / y;
  } else {
    // Step 6.a: NaN == NaN
    return x !== x && y !== y;
  }
}

function shallowEqual(objA, objB) { // 浅比较
  if (is(objA, objB)) {
    return true;
  }

  if (typeof objA !== 'object' || objA === null || typeof objB !== 'object' || objB === null) {
    return false;
  }

  var keysA = Object.keys(objA);
  var keysB = Object.keys(objB);

  if (keysA.length !== keysB.length) {
    return false;
  }

  // Test for A's keys different from B.
  for (var i = 0; i < keysA.length; i++) {
    if (!hasOwnProperty.call(objB, keysA[i]) || !is(objA[keysA[i]], objB[keysA[i]])) {
      return false;
    }
  }

  return true;
}

module.exports = shallowEqual;

使用immutable,主要是因为其拥有如下特点:

immutable的缺点

参考资料

react兄弟组件key的作用