import type { UnwrapRef, Ref, WritableComputedRef, DeepReadonly } from 'vue'; import { reactive, readonly, computed, getCurrentInstance, watchEffect, unref, nextTick, toRaw } from 'vue'; import { Form } from 'ant-design-vue'; import { FormItemContext } from 'ant-design-vue/es/form/FormItemContext'; import { isEqual } from 'lodash-es'; export function useRuleFormItem>( props: T, key?: K, changeEvent?, emitData?: Ref ): [WritableComputedRef, (val: V) => void, DeepReadonly, FormItemContext]; export function useRuleFormItem(props: T, key: keyof T = 'value', changeEvent = 'change', emitData?: Ref) { const instance = getCurrentInstance(); const emit = instance?.emit; const formItemContext = Form.useInjectFormItemContext(); const innerState = reactive({ value: props[key], }); const defaultState = readonly(innerState); const setState = (val: UnwrapRef): void => { innerState.value = val as T[keyof T]; }; watchEffect(() => { innerState.value = props[key]; }); const state: any = computed({ get() { //修复多选时空值显示问题(兼容值为0的情况) return innerState.value == null || innerState.value === '' ? [] : innerState.value; }, set(value) { if (isEqual(value, defaultState.value)) return; innerState.value = value as T[keyof T]; nextTick(() => { emit?.(changeEvent, value, ...(toRaw(unref(emitData)) || [])); // https://antdv.com/docs/vue/migration-v3-cn // antDv3升级后需要调用这个方法更新校验的值 nextTick(() => formItemContext.onFieldChange()); }); }, }); return [state, setState, defaultState, formItemContext]; }