Skip to content

FieldEffectHooks

字段级别的副作用 Hook 集合,用于按路径模式监听字段生命周期事件

描述

FieldEffectHooks 用于在 Form effects 函数中监听特定字段级别的生命周期事件。与 Form 级别的 Hook 不同,FieldEffectHooks 需要指定路径模式来筛选目标字段。

所有 Field 副作用 Hook

生命周期类

Hook生命周期类型触发时机
onFieldInitON_FIELD_INIT字段初始化
onFieldMountON_FIELD_MOUNT字段挂载
onFieldUnmountON_FIELD_UNMOUNT字段卸载

值变化类

Hook生命周期类型触发时机
onFieldValueChangeON_FIELD_VALUE_CHANGE字段 value 变化
onFieldInitialValueChangeON_FIELD_INITIAL_VALUE_CHANGE字段 initialValue 变化
onFieldInputValueChangeON_FIELD_INPUT_VALUE_CHANGE字段 inputValue 变化

校验类

Hook生命周期类型触发时机
onFieldValidateStartON_FIELD_VALIDATE_START校验开始
onFieldValidatingON_FIELD_VALIDATING正在校验
onFieldValidateEndON_FIELD_VALIDATE_END校验结束
onFieldValidateSuccessON_FIELD_VALIDATE_SUCCESS校验成功
onFieldValidateFailedON_FIELD_VALIDATE_FAILED校验失败

提交类

Hook生命周期类型触发时机
onFieldSubmitON_FIELD_SUBMIT字段提交
onFieldSubmitStartON_FIELD_SUBMIT_START提交开始
onFieldSubmitEndON_FIELD_SUBMIT_END提交结束
onFieldSubmitSuccessON_FIELD_SUBMIT_SUCCESS提交成功
onFieldSubmitFailedON_FIELD_SUBMIT_FAILED提交失败

其他

Hook生命周期类型触发时机
onFieldResetON_FIELD_RESET字段重置
onFieldLoadingON_FIELD_LOADING加载状态变化

通用签名

所有 Field Hook 遵循统一的签名:

txt
onFieldXxx(pattern: FormPathPattern, callback: (field: Field, form: Form) => void): void
  • pattern: 路径模式(支持通配符 *
  • callback: 回调函数,接收匹配的 Field 和所属 Form

用法

监听特定字段

ts
import { createForm, onFieldMount, onFieldValueChange } from '@silver-formily/core'

const form = createForm({
  effects() {
    onFieldValueChange('username', (field) => {
      console.log('username changed:', field.value)
    })

    onFieldMount('email', (field, form) => {
      // 字段挂载时自动聚焦
      console.log('email mounted')
    })
  },
})

使用通配符

ts
onFieldValueChange('user.*', (field) => {
  // 匹配 user.username, user.email 等 user 的直接子字段
})

onFieldValueChange('**.name', (field) => {
  // 匹配任意层级的 name 字段
})

字段联动

ts
import { createForm, onFieldValueChange } from '@silver-formily/core'

const form = createForm({
  effects() {
    // 当 source 字段变化时,联动更新 target 字段
    onFieldValueChange('source', (field) => {
      field.form.setValuesIn('target', `copy: ${field.value}`)
    })
  },
})

onFieldInit 的特殊行为

onFieldInit 与其它 Hook 不同:

  • 如果字段已存在于表单中,则立即同步调用回调
  • 如果字段尚未创建,则在字段初始化时调用回调
ts
onFieldInit('dynamic.*', (field) => {
  // 已有的 dynamic.* 字段会立即回调
  // 未来创建的 dynamic.* 字段会在创建时回调
})

onFieldReact

响应式字段副作用,自动追踪字段状态变化:

ts
onFieldReact('username', (field) => {
  // 自动追踪 field 上的 observable 属性
  console.log(field.value, field.valid)
})

onFieldChange

监听字段特定属性的变化:

ts
// 默认监听 value 变化
onFieldChange('username', (field) => {
  console.log('value changed:', field.value)
})

// 监听多个属性
onFieldChange('username', ['value', 'modified', 'valid'], (field) => {
  console.log('state changed:', field.value, field.modified, field.valid)
})

onFieldChangeonFieldValueChange 的区别在于:

  • onFieldValueChange 是生命周期事件钩子,只在 value 确认变更时触发
  • onFieldChange 基于 reaction,可监听任意属性的变化