useFormConfigHook.ts 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. /**
  2. * 通用表单配置hook
  3. * @param config 表单配置
  4. * @param data 表单数据
  5. * @param rules 表单规则
  6. * @returns initRuleFormData 初始化表单数据
  7. * @returns ruleFormData 表单数据
  8. * @returns formRules 表单规则
  9. * @returns cloneRuleFormData 克隆表单数据
  10. * @returns validateFormData 验证表单数据
  11. * @returns beforeRouteLeave 离开页面前的确认
  12. * @description 用于RuleForm的配置
  13. * @author Chauncey
  14. */
  15. import { ref, reactive } from 'vue';
  16. import type { FormRules } from 'element-plus';
  17. import { cloneDeep, isEqual } from 'lodash-es';
  18. import { onBeforeRouteLeave } from 'vue-router';
  19. import { ElMessageBox } from 'element-plus';
  20. import type { FormConfig } from '@/types/basic-form';
  21. export const useFormConfigHook = <T extends Record<string, any> = Record<string, any>>(
  22. config: FormConfig[],
  23. data: T,
  24. rules: FormRules<T>,
  25. ) => {
  26. const ruleFormConfig = ref<FormConfig[]>(config);
  27. const ruleFormData = reactive<T>(cloneDeep(data));
  28. const initRuleFormData = ref<T>();
  29. const formRules = reactive<FormRules<T>>(rules);
  30. const cloneRuleFormData = () => {
  31. initRuleFormData.value = cloneDeep(ruleFormData as T);
  32. };
  33. const hasFormChanged = () => {
  34. return isEqual(initRuleFormData.value, ruleFormData);
  35. };
  36. const beforeRouteLeave = () => {
  37. onBeforeRouteLeave((to, from, next) => {
  38. const hasChange = hasFormChanged();
  39. if (hasChange) {
  40. next();
  41. return;
  42. }
  43. setTimeout(() => {
  44. ElMessageBox.confirm('当前页面存在修改,是否确认离开当前页面?', '提示', {
  45. confirmButtonText: '确认',
  46. cancelButtonText: '取消',
  47. })
  48. .then(() => {
  49. next();
  50. })
  51. .catch(() => {
  52. next(false);
  53. });
  54. }, 200);
  55. });
  56. };
  57. return {
  58. ruleFormConfig,
  59. ruleFormData,
  60. formRules,
  61. cloneRuleFormData,
  62. beforeRouteLeave,
  63. };
  64. };