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