onFieldValueChange effect 的原理 #1432
javahuang
started this conversation in
Show and tell
Replies: 0 comments
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
-
问题
下面这段代码,当 aa 字段的值变化的时候,会触发 onFieldValueChange effect 的 callback,在该 callback 里面继续修改 bb 字段的值会触发 bb 字段 onFieldValueChange effect 的 callback, 但是修改 aa 不会再次触发 effect 造成死循环,这个原理是啥呢?
onFieldValueChange effect 原理
onFieldValueChange effect 的本质是使用了观察者模式,注册一个 LifeCycle 生命周期对象来订阅 onFieldValueChange 类型的事件
formily/packages/core/src/shared/effectbox.ts
Lines 14 to 21 in 2501e72
field 的 value 是 observable 的,当 field 的 value 变化的时候,会触发 该 value 绑定的 reaction,在该 reaction 里面会发布通知执行注册的回调。
formily/packages/core/src/models/Field.ts
Lines 224 to 229 in 2501e72
为啥不会循环触发回调
上面简单介绍了下 onFieldValueChange effect 的原理,下面说说为啥不会循环触发 effect 的 callback。
formily/packages/core/src/effects/onFieldEffects.ts
Lines 17 to 30 in 2501e72
由于整个执行逻辑是经过 batch 包装的,在 value 的 effect 还没结束之前又去改变自身,仍然是在同一个 batch 里面。
所以, effect 内部修改 aa 字段本身不会再次触发 effect,修改 bb 字段会触发它对应的 effect。
Beta Was this translation helpful? Give feedback.
All reactions