index.vue 3.2 KB

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