useFormItem.ts 923 B

1234567891011121314151617181920212223242526272829303132333435363738394041
  1. import type { UnwrapRef } from 'vue';
  2. import { reactive, readonly, computed, getCurrentInstance, watchEffect } from 'vue';
  3. import { isEqual } from 'lodash-es';
  4. export function useRuleFormItem<T extends Recordable>(
  5. props: T,
  6. key: keyof T = 'value',
  7. changeEvent = 'change'
  8. ) {
  9. const instance = getCurrentInstance();
  10. const emit = instance?.emit;
  11. const innerState = reactive({
  12. value: props[key],
  13. });
  14. const defaultState = readonly(innerState);
  15. const setState = (val: UnwrapRef<T[keyof T]>): void => {
  16. innerState.value = val as T[keyof T];
  17. };
  18. watchEffect(() => {
  19. innerState.value = props[key];
  20. });
  21. const state = computed({
  22. get() {
  23. return innerState.value;
  24. },
  25. set(value) {
  26. if (isEqual(value, defaultState.value)) return;
  27. innerState.value = value as T[keyof T];
  28. emit?.(changeEvent, value);
  29. },
  30. });
  31. return [state, setState, defaultState];
  32. }