React Context精准更新 #112
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
-
前言
用过
Context
的同学都知道,Context
是无法像Redux
一样精准更新的,当Context
中某一个值改变,所有使用了该Context
的组件一定都会更新,用Context
来做状态管理,一定会有一些小小的性能损失。但是在我阅读
Context
源码的过程中,发现了一个文档上没有描述的方法,createContext
方法和useContext
方法都有第二个参数,可以做到精准的更新使用了Context
中某一项值的组件,而不会导致所有组件全部刷新。实现原理
原理很有React的风格,使用位运算。
我们需要对字段增加一个二进制的标识,用来标识值是否有改变。
我们的组件在使用
Context
的时候,需要标识该组件使用了那些字段。当
Context
的值改变的时候,会运行一个比较函数。如果
user
和password
字段都发生了变化,最后result
为0b11
。React内部会将这个
result
的值和我们在useContext
传入的第二个参数bits.user
进行比较。如果经过判断,是
password
字段发生变化,result
结果为0b10
,我们传入的值bits.user
是0b01
,0b01 & 0b10
结果为0,所以不会更新组件。一个例子
可以在codesandbox查看。
useContext
的第二个参数除了二进制标识,也可以传false
,表示不需要更新,这在传递dispatch
方法的时候会很有用。在
ContextConsumer
中使用。需要注意的地方
由于是二进制的值,所以有一个最大值的限制,如在32位系统上最大的二进制值为
0b111111111111111111111111111111
,也就是只能记录31个字段的标识。由于是
future
功能,也是实验性质的,所以在控制台有警告。Beta Was this translation helpful? Give feedback.
All reactions