Child依旧会更新,是因为你以这样的形式写jsx
<div>
<button onClick={handleSetStep}>step is : {step} </button>
<button onClick={handleSetCount}>count is : {count} </button>
<hr />
<Child cb={lazyCallback} /> <hr />
</div>
Child最终会被babel编译为React.createElement的调用。那么再看一下React.createElement的源码:
export function createElement(type, config, children) {
// 重点在这里,重新声明了props属性的引用
const props = {};
...
return ReactElement(
type,
key,
ref,
self,
source,
ReactCurrentOwner.current,
props,
);
}
它每次执行,都会重新声明一下props,直接导致了Child的props发生变化。所以即使没有改变和Child有关的props,但由于props重新声明了,所以props还是变了,所以重新更新。但只是执行了一下render,并没有往下走,这就是diff算法起的作用
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…