Skip to content

Field Effect Hooks

onFieldInit

描述

用于监听某个字段初始化的副作用钩子,我们在调用 createField 的时候就会触发字段初始化事件

签名

ts
interface onFieldInit {
  (pattern: FormPathPattern, callback: (field: Field, form: Form) => void)
}

FormPathPattern的语法格式请参考 FormPath

用例

<script setup lang="ts">
import { createForm, onFieldInit } from '@silver-formily/core'
import { ElButton } from 'element-plus'
import { ref } from 'vue'
import ActionResponse from '../shared/ActionResponse.vue'

const response = ref('')
function setResponse(value: string) {
  response.value = value
}
const form = createForm({
  effects() {
    onFieldInit('target', () => {
      setResponse('target已初始化')
    })
  },
})
</script>

<template>
  <ActionResponse :response="response">
    <ElButton
      @click="() => {
        form.createField({ name: 'target' })
      }"
    >
      创建字段
    </ElButton>
  </ActionResponse>
</template>
查看源码

onFieldMount

描述

用于监听某个字段已挂载的副作用钩子,我们在调用 onMount 的时候就会触发字段挂载事件

签名

ts
interface onFieldMount {
  (pattern: FormPathPattern, callback: (field: Field, form: Form) => void)
}

用例

<script setup lang="ts">
import { createForm, onFieldMount } from '@silver-formily/core'
import { ElButton } from 'element-plus'
import { ref } from 'vue'
import ActionResponse from '../shared/ActionResponse.vue'

const response = ref('')
function setResponse(value: string) {
  response.value = value
}
const form = createForm({
  effects() {
    onFieldMount('target', () => {
      setResponse('target已挂载')
    })
  },
})
</script>

<template>
  <ActionResponse :response="response">
    <ElButton
      @click="() => {
        form.createField({ name: 'target' }).onMount()
      }"
    >
      创建并挂载字段
    </ElButton>
  </ActionResponse>
</template>
查看源码

onFieldUnmount

描述

用于监听某个字段已卸载的副作用钩子,我们在调用 onUnmount 的时候就会触发卸载事件

签名

ts
interface onFieldUnmount {
  (pattern: FormPathPattern, callback: (field: Field, form: Form) => void)
}

用例

<script setup lang="ts">
import { createForm, onFieldMount, onFieldUnmount } from '@silver-formily/core'
import { ElButton } from 'element-plus'
import { ref } from 'vue'
import ActionResponse from '../shared/ActionResponse.vue'

const response = ref('')
function setResponse(value: string) {
  response.value = value
}
const form = createForm({
  effects() {
    onFieldMount('target', () => {
      setResponse('target已挂载')
    })
    onFieldUnmount('target', () => {
      setResponse('target已卸载')
    })
  },
})
</script>

<template>
  <ActionResponse :response="response">
    <ElButton
      @click="() => {
        form.createField({ name: 'target' }).onMount()
      }"
    >
      创建并挂载字段
    </ElButton>
    <ElButton
      @click="() => {
        form.createField({ name: 'target' }).onUnmount()
      }"
    >
      卸载字段
    </ElButton>
  </ActionResponse>
</template>
查看源码

onFieldReact

用于实现字段响应式逻辑的副作用钩子,它的核心原理就是字段初始化的时候会执行回调函数,同时自动追踪依赖,依赖数据发生变化时回调函数会重复执行

签名

ts
interface onFieldReact {
  (pattern: FormPathPattern, callback: (field: Field, form: Form) => void)
}

用例

<script setup lang="ts">
import { createForm, onFieldReact } from '@silver-formily/core'
import { ElButton } from 'element-plus'
import { ref } from 'vue'
import ActionResponse from '../shared/ActionResponse.vue'

const response = ref('')
function setResponse(value: string) {
  response.value = value
}
const form = createForm({
  effects(form) {
    onFieldReact('target', () => {
      setResponse(
        `target ${form.values.other === 123 ? '显示' : '隐藏'}`,
      )
    })
  },
})
</script>

<template>
  <ActionResponse :response="response">
    <ElButton
      @click="() => {
        form.createField({ name: 'target' })
      }"
    >
      初始化target
    </ElButton>
    <ElButton
      @click="() => {
        const field = form.createField({ name: 'other' })
        field.setValue(123)
      }"
    >
      赋值other = 123
    </ElButton>
    <ElButton
      @click="() => {
        const field = form.createField({ name: 'other' })
        field.setValue(null)
      }"
    >
      赋值other = null
    </ElButton>
  </ActionResponse>
</template>
查看源码

该示例会追踪 values.other 的变化,如果等于 123,就会控制 target 显示,否则隐藏

onFieldChange

描述

用于监听某个字段的属性变化的副作用钩子

签名

ts
interface onFieldChange {
  (
    pattern: FormPathPattern,
    watches?: string[],
    callback: (field: Field, form: Form) => void
  )
  (pattern: FormPathPattern, callback: (field: Field, form: Form) => void)
}

可以传入具体要监听的的属性集合,也可以不传,默认是监听 value 变化

用例

<script setup lang="ts">
import { createForm, isField, onFieldChange } from '@silver-formily/core'
import { ElButton } from 'element-plus'
import { ref } from 'vue'
import ActionResponse from '../shared/ActionResponse.vue'

const response = ref('')
function setResponse(value: string) {
  response.value = value
}
const form = createForm({
  effects() {
    onFieldChange('target', (field) => {
      isField(field) && setResponse(`target值变化:${field.value}`)
    })
    onFieldChange('target', ['component'], () => {
      setResponse('target组件变化')
    })
  },
})
</script>

<template>
  <ActionResponse :response="response">
    <ElButton
      @click="() => {
        const field = form.createField({ name: 'target' })
        field.setValue(field.value ? field.value + 1 : 1)
      }"
    >
      设置值
    </ElButton>
    <ElButton
      @click="() => {
        const field = form.createField({ name: 'target' })
        field.setComponent('Input')
      }"
    >
      设置组件
    </ElButton>
  </ActionResponse>
</template>
查看源码

onFieldValueChange

用于监听某个字段值变化的副作用钩子

签名

ts
interface onFieldValueChange {
  (pattern: FormPathPattern, callback: (field: Field, form: Form) => void)
}

用例

<script setup lang="ts">
import { createForm, onFieldValueChange } from '@silver-formily/core'
import { ElButton } from 'element-plus'
import { ref } from 'vue'
import ActionResponse from '../shared/ActionResponse.vue'

const response = ref('')
function setResponse(value: string) {
  response.value = value
}
const form = createForm({
  effects() {
    onFieldValueChange('target', (field) => {
      setResponse(`target值变化:${field.value}`)
    })
  },
})
</script>

<template>
  <ActionResponse :response="response">
    <ElButton
      @click="() => {
        const field = form.createField({ name: 'target' })
        field.setValue(field.value ? field.value + 1 : 1)
      }"
    >
      设置值
    </ElButton>
  </ActionResponse>
</template>
查看源码

onFieldInitialValueChange

用于监听某个字段默认值变化的副作用钩子

签名

ts
interface onFieldInitialValueChange {
  (pattern: FormPathPattern, callback: (field: Field, form: Form) => void)
}

用例

<script setup lang="ts">
import { createForm, onFieldInitialValueChange } from '@silver-formily/core'
import { ElButton } from 'element-plus'
import { ref } from 'vue'
import ActionResponse from '../shared/ActionResponse.vue'

const response = ref('')
function setResponse(value: string) {
  response.value = value
}
const form = createForm({
  effects() {
    onFieldInitialValueChange('target', (field) => {
      setResponse(`target默认值变化:${field.value}`)
    })
  },
})
</script>

<template>
  <ActionResponse :response="response">
    <ElButton
      @click="() => {
        const field = form.createField({ name: 'target' })
        field.setInitialValue(field.value ? field.value + 1 : 1)
      }"
    >
      设置值
    </ElButton>
  </ActionResponse>
</template>
查看源码

onFieldInputValueChange

用于监听某个字段 onInput 触发的副作用钩子

签名

ts
interface onFieldInputValueChange {
  (pattern: FormPathPattern, callback: (field: Field, form: Form) => void)
}

用例

<script setup lang="ts">
import { createForm, onFieldInputValueChange } from '@silver-formily/core'
import { ElButton } from 'element-plus'
import { ref } from 'vue'
import ActionResponse from '../shared/ActionResponse.vue'

const response = ref('')
function setResponse(value: string) {
  response.value = value
}
const form = createForm({
  effects() {
    onFieldInputValueChange('target', (field) => {
      setResponse(`target 值变化:${field.value}`)
    })
  },
})
</script>

<template>
  <ActionResponse :response="response">
    <ElButton
      @click="() => {
        const field = form.createField({ name: 'target' })
        field.onInput(field.value ? field.value + 1 : 1)
      }"
    >
      调用onInput
    </ElButton>
  </ActionResponse>
</template>
查看源码

onFieldValidateStart

描述

监听某个字段校验触发开始的副作用钩子

签名

ts
interface onFieldValidateStart {
  (pattern: FormPathPattern, callback: (field: Field, form: Form) => void)
}

用例

<script setup lang="ts">
import { createForm, onFieldValidateStart } from '@silver-formily/core'
import { ElButton } from 'element-plus'
import { ref } from 'vue'
import ActionResponse from '../shared/ActionResponse.vue'

const response = ref('')
function setResponse(value: string) {
  response.value = value
}
const form = createForm({
  effects() {
    onFieldValidateStart('target', () => {
      setResponse('target校验开始')
    })
  },
})
</script>

<template>
  <ActionResponse :response="response">
    <ElButton
      @click="() => {
        const field = form.createField({ name: 'target', required: true })
        field.onInput('')
      }"
    >
      触发校验
    </ElButton>
  </ActionResponse>
</template>
查看源码

onFieldValidateEnd

描述

监听某个字段校验触发结束的副作用钩子

签名

ts
interface onFieldValidateEnd {
  (pattern: FormPathPattern, callback: (field: Field, form: Form) => void)
}

用例

<script setup lang="ts">
import { createForm, onFieldValidateEnd } from '@silver-formily/core'
import { ElButton } from 'element-plus'
import { ref } from 'vue'
import ActionResponse from '../shared/ActionResponse.vue'

const response = ref('')
function setResponse(value: string) {
  response.value = value
}
const form = createForm({
  effects() {
    onFieldValidateEnd('target', () => {
      setResponse('target校验结束')
    })
  },
})
</script>

<template>
  <ActionResponse :response="response">
    <ElButton
      @click="() => {
        const field = form.createField({ name: 'target', required: true })
        field.onInput('')
      }"
    >
      触发校验
    </ElButton>
  </ActionResponse>
</template>
查看源码

onFieldValidateFailed

描述

监听某个字段校验触发失败的副作用钩子

签名

ts
interface onFieldValidateFailed {
  (pattern: FormPathPattern, callback: (field: Field, form: Form) => void)
}

用例

<script setup lang="ts">
import { createForm, onFieldValidateFailed } from '@silver-formily/core'
import { ElButton } from 'element-plus'
import { ref } from 'vue'
import ActionResponse from '../shared/ActionResponse.vue'

const response = ref('')
function setResponse(value: string) {
  response.value = value
}
const form = createForm({
  effects() {
    onFieldValidateFailed('target', () => {
      setResponse('target校验失败')
    })
  },
})
</script>

<template>
  <ActionResponse :response="response">
    <ElButton
      @click="() => {
        const field = form.createField({ name: 'target', required: true })
        field.onInput('')
      }"
    >
      触发校验
    </ElButton>
  </ActionResponse>
</template>
查看源码

onFieldValidateSuccess

描述

监听某个字段校验触发成功的副作用钩子

签名

ts
interface onFieldValidateSuccess {
  (pattern: FormPathPattern, callback: (field: Field, form: Form) => void)
}

用例

<script setup lang="ts">
import {
  createForm,
  onFieldValidateFailed,
  onFieldValidateSuccess,
} from '@silver-formily/core'
import { ElButton } from 'element-plus'
import { ref } from 'vue'
import ActionResponse from '../shared/ActionResponse.vue'

const response = ref('')
function setResponse(value: string) {
  response.value = value
}
const form = createForm({
  effects() {
    onFieldValidateFailed('target', () => {
      setResponse('target校验失败')
    })
    onFieldValidateSuccess('target', () => {
      setResponse('target校验成功')
    })
  },
})
</script>

<template>
  <ActionResponse :response="response">
    <ElButton
      @click="() => {
        const field = form.createField({ name: 'target', required: true })
        field.onInput('')
      }"
    >
      触发失败
    </ElButton>
    <ElButton
      @click="() => {
        const field = form.createField({ name: 'target', required: true })
        field.onInput('123')
      }"
    >
      触发成功
    </ElButton>
  </ActionResponse>
</template>
查看源码