Skip to content

FieldEffectHooks

Field-level side-effect hooks for listening to field lifecycle events by path pattern

Description

FieldEffectHooks listen for lifecycle events on specific fields. Unlike Form-level hooks, they require a path pattern to filter target fields.

All Field Effect Hooks

Lifecycle

HookTrigger
onFieldInitField initialized
onFieldMountField mounted
onFieldUnmountField unmounted

Value Changes

HookTrigger
onFieldValueChangeField value changed
onFieldInitialValueChangeInitial value changed
onFieldInputValueChangeInput value changed

Validation

HookTrigger
onFieldValidateStartValidation started
onFieldValidatingValidating
onFieldValidateEndValidation ended
onFieldValidateSuccessValidation passed
onFieldValidateFailedValidation failed

Submit

HookTrigger
onFieldSubmitField submit
onFieldSubmitStartSubmit started
onFieldSubmitEndSubmit ended
onFieldSubmitSuccessSubmit succeeded
onFieldSubmitFailedSubmit failed

Other

HookTrigger
onFieldResetField reset
onFieldLoadingLoading state changed

Common Signature

txt
onFieldXxx(pattern: FormPathPattern, callback: (field: Field, form: Form) => void): void

Usage

Listen to Specific Fields

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

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

    onFieldMount('email', (field, form) => {
      console.log('email mounted')
    })
  },
})

Wildcard Patterns

ts
onFieldValueChange('user.*', (field) => {
  // matches user.username, user.email, etc.
})

onFieldValueChange('**.name', (field) => {
  // matches name at any depth
})

Field Linkage

ts
onFieldValueChange('source', (field) => {
  field.form.setValuesIn('target', `copy: ${field.value}`)
})

onFieldInit Special Behavior

If the field already exists in the form, the callback fires immediately; otherwise it fires when the field is created.

ts
onFieldInit('dynamic.*', (field) => {
  // fires immediately for existing fields
  // fires on creation for future fields
})

onFieldReact & onFieldChange

ts
// Reactive: auto-tracks observable reads
onFieldReact('username', (field) => {
  console.log(field.value, field.valid)
})

// Watch specific properties
onFieldChange('username', ['value', 'modified'], (field) => {
  console.log('state changed')
})