table.vue 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  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. <ProTable
  12. ref="proTable"
  13. height="50vh"
  14. :tool-button="parameter.toolButton"
  15. :columns="parameter.columns"
  16. row-key="roleId"
  17. :request-api="parameter.getTableList"
  18. :init-param="initParam"
  19. />
  20. <template #footer>
  21. <span class="dialog-footer">
  22. <el-button type="primary" :loading="butLoading" @click="handleSubmit">确认</el-button>
  23. <el-button @click="handleCancel">取消</el-button>
  24. </span>
  25. </template>
  26. </el-dialog>
  27. </template>
  28. <script setup lang="ts" name="FormDialog">
  29. import { ref, reactive } from 'vue'
  30. import ProTable from '@/components/ProTable/index.vue'
  31. import { ElMessage } from 'element-plus'
  32. import { ProTableInstance, ColumnProps } from '@/components/ProTable/interface'
  33. export interface TableParameterProps {
  34. title?: string // 标题
  35. width?: number // 弹框宽度
  36. top?: string // 离顶部距离
  37. toolButton?: boolean
  38. api?: (params: any) => Promise<any> // 表单提交api
  39. columns?: ColumnProps[] // 动态表单字段
  40. getTableList?: (params: any) => Promise<any> // 获取表格数据的Api
  41. backTableList?: (params: any) => Promise<any> // 返回主表表格数据的Api
  42. }
  43. // dialog状态
  44. const dialogVisible = ref(false)
  45. const butLoading = ref(false)
  46. // 接受父组件参数,配置默认值
  47. // const parameter = ref<TableParameterProps>({
  48. // title: '',
  49. // width: 600,
  50. // top: '5vh',
  51. // toolButton: false,
  52. // columns: [] as ColumnProps[]
  53. // })
  54. let parameter = withDefaults(defineProps<TableParameterProps>(), {
  55. title: '',
  56. width: 600,
  57. top: '5vh',
  58. toolButton: false,
  59. columns: () => []
  60. })
  61. // ProTable 实例
  62. const proTable = ref<ProTableInstance>()
  63. const initParam = reactive({ deptId: '' })
  64. // 定义 emit 事件
  65. const emit = defineEmits<{
  66. submitForm: []
  67. }>()
  68. // 表单提交校验
  69. const handleSubmit = () => {
  70. butLoading.value = true
  71. let tableNames: any[] | undefined = proTable.value?.selectedList.map(item => item.tableName)
  72. parameter.api!(tableNames).then(res => {
  73. if (res.code == 200) {
  74. ElMessage.success('操作成功')
  75. dialogVisible.value = false
  76. emit('submitForm')
  77. } else {
  78. console.log('message', res.message)
  79. }
  80. })
  81. butLoading.value = false
  82. }
  83. // 取消按钮,重置表单,关闭弹框
  84. const handleCancel = () => {
  85. butLoading.value = false
  86. dialogVisible.value = false
  87. }
  88. // 接收父组件参数
  89. const openDialog = (params: TableParameterProps) => {
  90. parameter = { ...parameter, ...params }
  91. butLoading.value = false
  92. dialogVisible.value = true
  93. }
  94. defineExpose({
  95. openDialog
  96. })
  97. </script>
  98. <style scoped lang="scss"></style>