当前位置:   article > 正文

Vue2/Vue3 el-table动态实现生成一级表头或多级表头_vue3封装table 多级表头

vue3封装table 多级表头

效果图

核心代码,封装成单独的组件,持续复用

appElTableMultistage.vue

  1. <template>
  2. <el-table :data="tableData" @row-click="rowClick">
  3. <el-table-column v-if="isSelection"
  4. type="selection"
  5. width="55">
  6. </el-table-column>
  7. <template v-for="item in tableHeader">
  8. <TableColumn v-if="item.children && item.children.length"
  9. :key="item.id"
  10. :coloumn-header="item"
  11. :row-id="rowId" />
  12. <el-table-column :key="item.id"
  13. v-else
  14. :label="item.label"
  15. :prop="item.prop" />
  16. </template>
  17. </el-table>
  18. </template>
  19. <script lang="ts" setup>
  20. import TableColumn from './tableColumn.vue'
  21. import { defineProps, defineEmits, ref} from 'vue'
  22. const props = defineProps({
  23. tableData: {
  24. type: Array,
  25. required: true,
  26. },
  27. // 多级表头的数据
  28. tableHeader: {
  29. type: Array,
  30. required: true,
  31. },
  32. isSelection: {
  33. type: Boolean,
  34. default: false,
  35. },
  36. })
  37. let rowId: string = ref('')
  38. const rowClick = (row: any) => {
  39. rowId.value = row.id
  40. }
  41. </script>

这是第二个组件,需要在第一个组件里面引入的,主要是处理多级表头

 name="TableColumn"很重要,name和文件名得一样,不然多级表头就会出不来

tableColumn.vue

  1. <template>
  2. <el-table-column :label="coloumnHeader.label"
  3. :prop="coloumnHeader.label"
  4. align="center">
  5. <template v-for="item in coloumnHeader.children">
  6. <tableColumn v-if="item.children && item.children.length"
  7. :key="item.id"
  8. :coloumn-header="item" />
  9. <el-table-column :key="item.name"
  10. v-else
  11. :label="item.label"
  12. :prop="item.prop"
  13. align="center"
  14. width="80px">
  15. </el-table-column>
  16. </template>
  17. </el-table-column>
  18. </template>
  19. <script lang="ts" setup name="TableColumn">
  20. import { defineProps, defineEmits, ref, inject } from 'vue'
  21. const props = defineProps({
  22. coloumnHeader: {
  23. type: Object,
  24. required: true,
  25. },
  26. rowId: {
  27. type: Number,
  28. required: true,
  29. },
  30. })
  31. </script>

使用

app.vue

  1. <template>
  2. <div>
  3. <app-el-table-multistage
  4. :table-data="form.giftsTableData"
  5. :table-header="tableHeaderConfig"
  6. :isSelection="isRejected"
  7. />
  8. </div>
  9. </template>
  10. <script lang="ts" setup>
  11. import { reactive, ref} from 'vue'
  12. // 记得把表格组件引入
  13. import AppElTableMultistage from "./components/appElTableMultistage.vue"
  14. // 表头
  15. let tableHeaderConfig = reactive([
  16. {
  17. id: 100,
  18. label: '一级表头',
  19. prop: 'date',
  20. },
  21. {
  22. id: 200,
  23. label: '一级表头',
  24. prop: 'date',
  25. },
  26. {
  27. id: 300,
  28. label: '一级表头',
  29. prop: 'date',
  30. },
  31. {
  32. id: 400,
  33. label: '一级表头',
  34. prop: '',
  35. children: [
  36. {
  37. id: 401,
  38. label: '二级表头',
  39. prop: '',
  40. children: [
  41. {
  42. id: 402,
  43. label: '三级表头',
  44. prop: 'name',
  45. },
  46. {
  47. id: 402,
  48. label: '三级表头',
  49. prop: 'name',
  50. },
  51. {
  52. id: 403,
  53. label: '三级表头',
  54. prop: 'phone',
  55. },
  56. ],
  57. },
  58. {
  59. id: 401,
  60. label: '二级表头',
  61. prop: '',
  62. children: [
  63. {
  64. id: 402,
  65. label: '三级表头',
  66. prop: 'name',
  67. },
  68. {
  69. id: 402,
  70. label: '三级表头',
  71. prop: 'name',
  72. },
  73. ],
  74. },
  75. ],
  76. },
  77. {
  78. id: 404,
  79. label: '二级表头',
  80. prop: 'state',
  81. },
  82. ])
  83. // 是否展示多选框
  84. let isRejected: boolean = ref(true)
  85. // 表格数据
  86. let form = reactive({
  87. giftsTableData: Array.from(new Array(3), (_, i) => ({
  88. id: i,
  89. date: '档次' + (i + 1),
  90. name: i,
  91. phone: i,
  92. province: 0,
  93. city: 0,
  94. state: 0,
  95. number: 1,
  96. })),
  97. })
  98. </script>

注:vue2写法和vue3大差不差,把vue3的写法转成vue2就可以,整体架子是一样的

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号