useFormItem.ts 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. import type { UnwrapRef, Ref, WritableComputedRef, DeepReadonly } from 'vue';
  2. import {
  3. reactive,
  4. readonly,
  5. computed,
  6. getCurrentInstance,
  7. watchEffect,
  8. unref,
  9. nextTick,
  10. toRaw,
  11. } from 'vue';
  12. import { isEqual } from 'lodash-es';
  13. export function useRuleFormItem<T extends Recordable, K extends keyof T, V = UnwrapRef<T[K]>>(
  14. props: T,
  15. key?: K,
  16. changeEvent?,
  17. emitData?: Ref<any[]>,
  18. ): [WritableComputedRef<V>, (val: V) => void, DeepReadonly<V>];
  19. export function useRuleFormItem<T extends Recordable>(
  20. props: T,
  21. key: keyof T = 'value',
  22. changeEvent = 'change',
  23. emitData?: Ref<any[]>,
  24. ) {
  25. const instance = getCurrentInstance();
  26. const emit = instance?.emit;
  27. const innerState = reactive({
  28. value: props[key],
  29. });
  30. const defaultState = readonly(innerState);
  31. const setState = (val: UnwrapRef<T[keyof T]>): void => {
  32. innerState.value = val as T[keyof T];
  33. };
  34. watchEffect(() => {
  35. innerState.value = props[key];
  36. });
  37. const state: any = computed({
  38. get() {
  39. return innerState.value;
  40. },
  41. set(value) {
  42. if (isEqual(value, defaultState.value)) return;
  43. innerState.value = value as T[keyof T];
  44. nextTick(() => {
  45. emit?.(changeEvent, value, ...(toRaw(unref(emitData)) || []));
  46. });
  47. },
  48. });
  49. return [state, setState, defaultState];
  50. }