import { UnwrapRef, Ref, WritableComputedRef, DeepReadonly, nextTick } from 'vue' import { reactive, readonly, computed, getCurrentInstance, watchEffect, unref, toRaw } from 'vue' import { isEqual } from 'lodash-es' export function useRuleFormItem>( props: T, key?: K, changeEvent?, emitData?: Ref ): [WritableComputedRef, (val: V) => void, DeepReadonly] export function useRuleFormItem(props: T, key: keyof T = 'value', changeEvent = 'change', emitData?: Ref) { const instance = getCurrentInstance() const emit = instance?.emit 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() { return innerState.value }, set(value) { if (isEqual(value, defaultState.value)) return innerState.value = value as T[keyof T] nextTick(() => { emit?.(changeEvent, value, ...(toRaw(unref(emitData)) || [])) }) } }) return [state, setState, defaultState] }