index.vue 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. <template>
  2. <el-dialog
  3. v-model="dialogVisible"
  4. :close-on-click-modal="false"
  5. :title="parameter.title"
  6. :destroy-on-close="true"
  7. :width="parameter.width"
  8. draggable
  9. >
  10. <ProFrom ref="proFormRef" :items-options="parameter.itemsOptions" :form-options="_options" :model="parameter.model" />
  11. <template #footer>
  12. <span class="dialog-footer">
  13. <el-button type="primary" v-if="parameter.isEdit" :loading="butLoading" @click="handleSubmit">确认</el-button>
  14. <el-button @click="handleCancel">取消</el-button>
  15. </span>
  16. </template>
  17. </el-dialog>
  18. </template>
  19. <script setup lang="ts" name="FormDialog">
  20. import { ref, ComputedRef, computed } from 'vue'
  21. import ProFrom from '@/components/ProForm/index.vue'
  22. import { ElMessage } from 'element-plus'
  23. export interface FormParameterProps {
  24. title: string // 标题
  25. width?: number // 弹框宽度
  26. labelWidth?: number // label宽度
  27. api?: (params: any) => Promise<any> // 表单提交api
  28. isEdit?: boolean // 是否编辑
  29. formOptions?: ProForm.FormOptions // 表单配置
  30. itemsOptions: ProForm.ItemsOptions[] // 动态表单字段配置
  31. model?: Record<ProForm.FormItem['prop'], ProForm.FormItem['value']> // 表单数据对象
  32. getTableList?: () => void // 获取表格数据的Api
  33. }
  34. // dialog状态
  35. const dialogVisible = ref(false)
  36. const butLoading = ref(false)
  37. // 父组件传过来的参数
  38. const parameter = ref<FormParameterProps>({
  39. title: '',
  40. width: 500,
  41. itemsOptions: [],
  42. formOptions: {},
  43. isEdit: false
  44. })
  45. const _options: ComputedRef<ProForm.FormOptions> = computed(() => {
  46. const form = {
  47. labelWidth: 120,
  48. hasFooter: false,
  49. disabled: false
  50. }
  51. return Object.assign(form, parameter.value.formOptions)
  52. })
  53. const proFormRef = ref<InstanceType<typeof ProFrom> | null>(null)
  54. // 表单提交校验
  55. const handleSubmit = () => {
  56. const formEl = proFormRef.value?.proFormRef
  57. butLoading.value = true
  58. if (!formEl) return
  59. formEl.validate(valid => {
  60. if (valid) {
  61. parameter.value.api!(parameter.value.model).then(res => {
  62. if (res.code == 200) {
  63. proFormRef.value?.resetForm(formEl)
  64. ElMessage.success('操作成功')
  65. dialogVisible.value = false
  66. parameter.value.getTableList && parameter.value.getTableList()
  67. } else {
  68. console.log('message', res.message)
  69. }
  70. })
  71. butLoading.value = false
  72. }
  73. butLoading.value = false
  74. })
  75. }
  76. // 取消按钮,重置表单,关闭弹框
  77. const handleCancel = () => {
  78. const formEl = proFormRef.value?.proFormRef
  79. if (!formEl) return
  80. proFormRef.value?.resetForm(formEl)
  81. butLoading.value = false
  82. dialogVisible.value = false
  83. }
  84. // 接收父组件参数
  85. const openDialog = (params: FormParameterProps) => {
  86. parameter.value = { ...parameter.value, ...params }
  87. _options.value.disabled = !parameter.value.isEdit
  88. butLoading.value = false
  89. dialogVisible.value = true
  90. }
  91. defineExpose({
  92. openDialog
  93. })
  94. </script>