源码证据摘录与解读
说明:以下摘录用于口头表述“我不是只背概念,而是看过实现”。
1. Form 初始化链路(模型优先)
来源:packages/core/src/models/Form.ts
ts
constructor(props: IFormProps<ValueType>) {
this.initialize(props)
this.makeObservable()
this.makeReactive()
this.makeValues()
this.onInit()
}解读:创建 Form 时,先建模型再建响应,再触发生命周期。说明 Formily 的核心在模型层而非 UI 层。
2. Field.value 实际读写的是 form.values[path]
来源:packages/core/src/models/Field.ts
ts
get value(): ValueType {
return this.form.getValuesIn(this.path)
}
setValue = (value?: ValueType) => {
this.form.setValuesIn(this.path, value)
}解读:字段值与提交值共址,避免双源状态不一致。
3. display=none 时值缓存与剔除
来源:packages/core/src/models/Field.ts
ts
createReaction(
() => this.display,
(display) => {
const value = this.value
if (display !== 'none') {
if (value === undefined && this.caches.value !== undefined) {
this.setValue(this.caches.value)
}
} else {
this.caches.value = toJS(value) ?? toJS(this.initialValue)
this.form.deleteValuesIn(this.path)
}
}
)解读:none 不是单纯隐藏 UI,而是控制提交数据参与性。
4. setFieldState 的“延迟命中”能力
来源:packages/core/src/shared/internals.ts
ts
if (matchCount === 0 || path.isWildMatchPattern) {
subscribeUpdate(form, path, payload)
}解读:字段还没挂载也可先声明更新,动态表单场景可用性更高。
5. reactive 的依赖收集入口
来源:packages/reactive/src/reaction.ts
ts
const reactionLen = ReactionStack.length
if (reactionLen === 0) return
const current = ReactionStack[reactionLen - 1]
if (isUntracking()) return
addReactionsMapToReaction(current, addRawReactionsMap(target, key, current))解读:只有在 reaction 上下文中读取才会被订阅,保证依赖精准。
6. 写入触发调度(含结构依赖)
来源:packages/reactive/src/reaction.ts
ts
if (type === 'add' || type === 'delete' || type === 'clear') {
const newKey = Array.isArray(target) ? 'length' : ITERATION_KEY
runReactions(target, newKey)
}解读:数组长度、集合迭代依赖会被额外触发,保证结构变化感知。
7. Schema 表达式编译实现
来源:packages/json-schema/src/compiler.ts
ts
return new Function('$root', `with($root) { return (${expression}); }`)(scope)解读:能力强,但 CSP 场景需替换编译器(见 #4338)。
8. x-reactions 的执行落点
来源:packages/json-schema/src/transformer.ts
ts
if (request.state) {
field.form.setFieldState(target, (state) =>
patchCompile(state, request.state, scope)
)
}解读:Schema 联动最终都会下沉到 core 的 setFieldState,这就是协议层与模型层的连接点。
9. React 层 observer 桥接
来源:packages/reactive-react/src/hooks/useObserver.ts
ts
const tracker = useCompatFactory(
() => new Tracker(() => forceUpdate(), options?.displayName)
)
return tracker.track(view)解读:React 组件重渲染由 Tracker 精准触发,而不是全局刷新。