/** * 通用表单配置hook * @param config 表单配置 * @param data 表单数据 * @param rules 表单规则 * @returns initRuleFormData 初始化表单数据 * @returns ruleFormData 表单数据 * @returns formRules 表单规则 * @returns cloneRuleFormData 克隆表单数据 * @returns validateFormData 验证表单数据 * @returns beforeRouteLeave 离开页面前的确认 * @description 用于RuleForm的配置 * @author Chauncey */ import { ref, reactive } from 'vue'; import type { FormRules } from 'element-plus'; import { cloneDeep, isEqual } from 'lodash-es'; import { onBeforeRouteLeave } from 'vue-router'; import type { FormConfig } from '@/types/basic-form'; import { msgConfirm } from '@/utils/element-plus/messageBox'; export const useFormConfigHook = = Record>( config: FormConfig[], data: T, rules: FormRules, ) => { const ruleFormConfig = ref(config); const ruleFormData = reactive(cloneDeep(data)); const initRuleFormData = ref(); const formRules = reactive>(rules); const cloneRuleFormData = () => { initRuleFormData.value = cloneDeep(ruleFormData as T); }; const hasFormChanged = () => { return isEqual(initRuleFormData.value, ruleFormData); }; const beforeRouteLeave = () => { onBeforeRouteLeave((to, from, next) => { const hasChange = hasFormChanged(); if (hasChange) { next(); return; } setTimeout(() => { msgConfirm('当前页面存在修改,是否确认离开当前页面?', '提示', { confirmButtonText: '确认', cancelButtonText: '取消', customClass: 'customMessageBox--warning', }) .then(() => { next(); }) .catch(() => { next(false); }); }, 200); }); }; return { ruleFormConfig, ruleFormData, formRules, cloneRuleFormData, beforeRouteLeave, }; };