React中Props的浅对比 #119
zhangyu1818
announced in
zh-cn
Replies: 0 comments
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
-
上一周去面试的时候,面试官我
PureComponent里是如何对比props的,概念已经牢记脑中,脱口而出就是浅对比,接着面试官问我是如何浅对比的,结果我就没回答上来。趁着周末,再来看看源码里是如何实现的。
类组件的Props对比
类组件是否需要更新需要实现
shouldComponentUpdate方法,通常讲的是如果继承的是PureComponent则会有一个默认浅对比的实现。PureComponent的实现如上,我以前以为在声明时默认会实现shouldComponentUpdate方法,但实际上并没有一个默认的方法。接下来看看
shouldComponentUpdate方法的调用。可以看出实际上并没有单独写一个
shouldComponentUpdate方法给PureReactComponent,而是在对比的时候就返回浅对比的结果。浅对比的答案都在
shallowEqual方法里了。shallowEqual 浅对比
shallowEqual方法原理很简单了object或为null。key的长度。key对应的值是否相同。原来原理是这样简单的对比,如果我面试的时候能够口喷源码,会不会工资更高一些呢?
函数组件的浅对比
函数组件的浅对比方式则使用
React.memo方法实现。React.memo方法同样支持传入compare函数最为第二个参数。内部的处理其实是手动创建了一个
$$typeof为REACT_MEMO_TYPE的ReactElement,方便之后的类型判断。React.memo组件的创建会稍微复杂一些,由于可以传入第二个自定义的compare函数,所以在内部其实会被定义为2种类型的Fiber节点。compare函数的为SimpleMemoComponent。compare函数的为MemoComponent。但是实际对于
Props的比较都是相同的,默认都是调用shallowEqual方法来对比。updateSimpleMemoComponent
updateMemoComponent
至于为什么要分为2个组件,我也没大看懂,蓝廋香菇,大概是和更新调度相关的。
SimpleMemoComponent的Fiber节点实际等于改了个名的函数组件,走流程会直接走到函数组件里,而MemoComponent则是套了一层壳,需要先把壳剥开生成子Fiber节点,再由子Fiber节点的判断走到函数组件里。以上就是
Props浅对比的分析了~Beta Was this translation helpful? Give feedback.
All reactions