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
Uh oh!
There was an error while loading. Please reload this page.
-
问题
下面这段代码,当 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