SimpleForm.vue 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. <!-- 编辑弹窗 -->
  2. <template>
  3. <pro-form
  4. class="simple-form"
  5. v-bind="$attrs"
  6. ref="proFormRef"
  7. :model="form"
  8. :items="items"
  9. :grid="{ span: grid }"
  10. @updateValue="setFieldValue"
  11. @submit="submitForm"
  12. @reset="resetForm"
  13. >
  14. <template
  15. v-for="(val, key) in $slots"
  16. #[key]="{ item, model, updateValue }"
  17. >
  18. <slot
  19. :name="key"
  20. :item="item"
  21. :model="model"
  22. :updateValue="updateValue"
  23. ></slot>
  24. </template>
  25. </pro-form>
  26. </template>
  27. <script setup>
  28. import { ref } from 'vue';
  29. import { useFormData } from '@/utils/use-form-data';
  30. import ProForm from '@/components/ProForm/index.vue';
  31. const slotArray = useSlots();
  32. const emit = defineEmits(['submit', 'reset']);
  33. const proFormRef = ref(null);
  34. const props = defineProps({
  35. items: {
  36. type: Array,
  37. default: () => []
  38. },
  39. grid: {
  40. type: Number,
  41. default: 24
  42. }
  43. });
  44. let initKeys = [];
  45. watch(
  46. () => props.items,
  47. (values) => {
  48. initKeys = values.map((item) => item.prop);
  49. },
  50. { deep: true, immediate: true }
  51. );
  52. const [form, resetFields, assignFields, setFieldValue] = useFormData();
  53. /** 提交表单 */
  54. const submitForm = (model) => {
  55. return new Promise((resolve, reject) => {
  56. proFormRef.value?.validate?.((valid) => {
  57. if (valid) {
  58. resolve(form);
  59. emit('submit', model);
  60. } else {
  61. reject('表单验证失败');
  62. }
  63. });
  64. });
  65. };
  66. /** 重置表单 */
  67. const resetForm = () => {
  68. // Complete reset - reinitialize the form data object to clear all fields
  69. Object.keys(form).forEach((key) => {
  70. form[key] = undefined;
  71. });
  72. resetFields();
  73. nextTick(() => {
  74. proFormRef.value?.clearValidate?.();
  75. });
  76. };
  77. function setData(data) {
  78. Object.keys(data).forEach((key) => {
  79. if (initKeys.includes(key)) {
  80. setFieldValue(key, data[key]);
  81. }
  82. });
  83. // 延迟清空表单验证,防止表单验证不生效
  84. setTimeout(() => {
  85. proFormRef.value?.clearValidate?.();
  86. }, 50);
  87. }
  88. defineExpose({
  89. resetFields,
  90. assignFields,
  91. setData,
  92. submitForm,
  93. resetForm
  94. });
  95. </script>