useFormConfigHook.ts 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  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 type { FormConfig } from '@/types/basic-form';
  20. import { msgConfirm } from '@/utils/element-plus/messageBox';
  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. msgConfirm('当前页面存在修改,是否确认离开当前页面?', '提示', {
  45. confirmButtonText: '确认',
  46. cancelButtonText: '取消',
  47. customClass: 'customMessageBox--warning',
  48. })
  49. .then(() => {
  50. next();
  51. })
  52. .catch(() => {
  53. next(false);
  54. });
  55. }, 200);
  56. });
  57. };
  58. return {
  59. ruleFormConfig,
  60. ruleFormData,
  61. formRules,
  62. cloneRuleFormData,
  63. beforeRouteLeave,
  64. };
  65. };