riku
2024-05-09 75aeb4e63339b60f9559af984c7d9f87a7cba24a
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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
import { onActivated, onDeactivated, ref, watch } from 'vue';
import { useCloned } from '@vueuse/core';
// import { useMessageBoxTip, useMessageBox } from './messageBox';
 
// 表单的确认和取消
export function useFormConfirm({
  defaultForm = undefined,
  submit = {
    do: () => {}
  },
  cancel = {
    do: () => {}
  },
  reset = {
    do: () => {}
  }
}) {
  if (!submit.title) submit.title = '提交';
  if (!submit.msg) submit.msg = '确认是否提交?';
  if (!cancel.title) cancel.title = '取消';
  if (!cancel.msg) cancel.msg = '是否放弃已编辑的内容?';
 
  // const formProps = defineProps({
  //   // 是否在提交成功后清空表单
  //   clearAftSubmit: Boolean
  // });
 
  //表单内容
  const formObj = ref(defaultForm ? defaultForm : {});
  let formObjClone = useCloned(formObj, { manual: true });
  //表单组件引用
  const formRef = ref(null);
 
  // 表单编辑状态
  const edit = ref(false);
  let isReset = false;
  const active = ref(true);
 
  // 若组件实例是 <KeepAlive> 缓存树的一部分,当组件被插入到 DOM 中时调用
  onActivated(() => {
    active.value = true;
  });
  // 若组件实例是 <KeepAlive> 缓存树的一部分,当组件从 DOM 中被移除时调用
  onDeactivated(() => {
    active.value = false;
  });
 
  // 当表单被取消激活后,清空表单数据
  watch(active, (nValue) => {
    if (!nValue) {
      clear();
    }
  });
 
  // 表单被修改过, 更新编辑状态
  watch(
    formObj,
    (nv, ov) => {
      if (!isReset && nv != ov) {
        formObjClone = useCloned(nv, { manual: true });
      }
      if (!isReset && nv === ov) {
        edit.value = true;
      }
      isReset = false;
    },
    { deep: true }
  );
 
  // 重置表单
  const _reset = function () {
    formRef.value.clearValidate();
    edit.value = false;
    isReset = true;
    formObj.value = useCloned(formObjClone.cloned, {
      manual: true
    }).cloned.value;
  };
 
  // 清空表单
  const clear = function () {
    isReset = true;
    formRef.value.resetFields();
    edit.value = false;
  };
 
  // 提交成功后
  const submited = function () {
    // if (formProps.clearAftSubmit) clear();
    edit.value = false;
    formObjClone = useCloned(formObj, { manual: true });
  };
 
  // 提交表单
  const onSubmit = function (messageBox = true) {
    formRef.value.validate(async (valid) => {
      if (valid) {
        if (messageBox) {
          // useMessageBoxTip({
          //   confirmMsg: submit.msg,
          //   confirmTitle: submit.title,
          //   onConfirm: async () => {
          //     const res = await submit.do();
          //     submited();
          //     return res;
          //   }
          // });
        } else {
          await submit.do();
          submited();
        }
      }
    });
  };
 
  // 取消提交
  const onCancel = function () {
    if (edit.value) {
      // 弹出确认框
      // useMessageBox({
      //   confirmMsg: cancel.msg,
      //   confirmTitle: cancel.title,
      //   onConfirm: () => {
      //     // clear();
      //     return cancel.do();
      //   }
      // });
    } else {
      cancel.do();
    }
  };
 
  // 重置表单
  const onReset = function (tips) {
    if (edit.value) {
      if (tips) {
        // 弹出确认框
        // useMessageBox({
        //   confirmMsg: '是否重置表单内容?',
        //   confirmTitle: '重置表单',
        //   onConfirm: () => {
        //     _reset();
        //     return reset.do();
        //   }
        // });
      } else {
        _reset();
        reset.do();
      }
    } else {
      reset.do();
    }
  };
 
  return { formObj, formRef, edit, onSubmit, onCancel, onReset, clear };
}