index.vue 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  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. <slot name="default" :parameter="parameter"></slot>
  12. <template #footer>
  13. <span class="dialog-footer">
  14. <slot name="footer" :parameter="parameter"></slot>
  15. </span>
  16. </template>
  17. </el-dialog>
  18. </template>
  19. <script setup lang="ts" name="FormDialog">
  20. export interface FormParameterProps {
  21. title: string // 标题
  22. width?: number // 弹框宽度
  23. isEdit?: boolean // 是否编辑
  24. top?: string // 离顶部距离
  25. model: Record<string, any>
  26. api?: (params: any) => Promise<any> // 提交api
  27. }
  28. // dialog状态
  29. const dialogVisible = ref(false)
  30. const butLoading = ref(false)
  31. // 父组件传过来的参数
  32. const parameter = ref<FormParameterProps>({
  33. title: '',
  34. width: 1250,
  35. top: '8vh',
  36. isEdit: true,
  37. model: {},
  38. api: undefined
  39. })
  40. // 取消按钮,重置表单,关闭弹框
  41. const handleCancel = () => {
  42. butLoading.value = false
  43. dialogVisible.value = false
  44. }
  45. // 接收父组件参数
  46. const openDialog = (params: FormParameterProps) => {
  47. parameter.value = { ...parameter.value, ...params }
  48. butLoading.value = false
  49. dialogVisible.value = true
  50. }
  51. defineExpose({
  52. openDialog,
  53. handleCancel
  54. })
  55. </script>