Skip to content
目录

源码证据摘录与解读

说明:以下摘录用于口头表述“我不是只背概念,而是看过实现”。

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 精准触发,而不是全局刷新。

MIT License.