封装 vue + element-ui 表格组件

川长思鸟来 2023-09-24 16:16 119阅读 0赞

1.介绍

首先,我们项目中用的表格一般会很多,有的数据也很大,这样每一个模块中都会有一个表格,甚至弹窗中也有,大大增加了代码量,根据这一点,我们来封装一个表格,只需要传入相应的数据,就可以全局使用了,大大减轻了代码量。

封装如下:
在这里插入图片描述

2.封装完整代码

  1. <template>
  2. <section>
  3. <div class="common-table">
  4. <el-table :data="tableData" stripe style="width: 100%" @selection-change="commonSelect">
  5. <el-table-column type="selection" width="55" v-hasPermi="['anno:image:transmission']" v-if="deveops === true">
  6. </el-table-column>
  7. <template v-for="column in column">
  8. <el-table-column :width="column.width ? column.width : 'auto'" :prop="column.prop" :label="column.label">
  9. <template #default="scope">
  10. <slot v-if="column.imageId" :name="column.prop" :row="scope.row">
  11. </slot>
  12. <template v-else-if="column.prop === 'imagePreview'">
  13. <div class="overview">
  14. <common-errimg :srcImg="scope.row.thumbUrl"/>
  15. </div>
  16. </template>
  17. // 权限管理配置想要显示的操作按钮
  18. <template v-else-if="column.label === '操作'" v-hasPermi="['anno:image:deletedevops'] && deletedevops">
  19. <el-button v-for="(item, index) in buttons" :key="index" :type="item.type"
  20. @click="$emit('commonDel', scope.row)" @keyup.prevent @keydown.enter.prevent>
  21. {
  22. {
  23. item.text }}
  24. </el-button>
  25. </template>
  26. <template v-else-if="column.label === '操作'" v-hasPermi="['anno:image:updatemark'] && updatemark">
  27. <el-button v-for="(item, index) in buttons" :key="index" :type="item.type"
  28. @click="$emit('commonDel', scope.row)" @keyup.prevent @keydown.enter.prevent>
  29. {
  30. {
  31. item.text }}
  32. </el-button>
  33. </template>
  34. </template>
  35. </el-table-column>
  36. </template>
  37. </el-table>
  38. </div>
  39. </section>
  40. </template>
  41. <script setup>
  42. import commonErrimg from '@/components/errImg/index'
  43. const emit = defineEmits()
  44. const prop = defineProps({
  45. tableData: {
  46. type: Array
  47. },
  48. column: {
  49. type: Array
  50. },
  51. buttons: {
  52. type: Array
  53. },
  54. deveops: {
  55. type: Boolean
  56. },
  57. deletedevops: {
  58. type: String
  59. },
  60. updatemark: {
  61. type: String
  62. }
  63. })
  64. // 表格多选
  65. const commonSelect = (row) => {
  66. emit("commonRows", row)
  67. }
  68. onMounted(() => {
  69. })
  70. </script>
  71. <style lang="scss" scoped>
  72. .overview {
  73. display: inline-block;
  74. }
  75. .overview img {
  76. max-width: 100px;
  77. height: auto;
  78. max-height: 60px;
  79. }
  80. </style>

3.使用

在要用的vue文件中引入组件

  1. <template>
  2. <div class="image-show app-container">
  3. <common-table
  4. :buttons="buttons"
  5. :column="column"
  6. :tableData="tableData"
  7. @commonDel="commonDel"
  8. ref="refreshTable"
  9. :deveops="deveops"
  10. :deletedevops="deletedevops"
  11. ></common-table>
  12. <pagination
  13. v-show="total > 0"
  14. :total="total"
  15. v-model:page="queryParams.pageNum"
  16. v-model:limit="queryParams.pageSize"
  17. @pagination="getImageData"
  18. />
  19. </div>
  20. </template>
  21. <script setup>
  22. import commonTable from '@/components/table/index'
  23. const buttons = reactive([
  24. {
  25. type: 'text',
  26. text: '删除',
  27. methods: 'del'
  28. }
  29. ])
  30. const column = reactive([
  31. {
  32. label: '序号',
  33. prop: 'imageId',
  34. width: '200'
  35. },
  36. {
  37. label: '图像预览',
  38. prop: 'imagePreview'
  39. },
  40. {
  41. label: '文件名',
  42. prop: 'imageName'
  43. },
  44. {
  45. label: '创建时间',
  46. prop: 'createTime'
  47. },
  48. {
  49. label: '文件大小',
  50. prop: 'size'
  51. },
  52. {
  53. label: '文件状态',
  54. prop: 'fileStatus'
  55. },
  56. {
  57. label: '操作',
  58. width: '80'
  59. }
  60. ])
  61. const total = ref(0)
  62. const queryParams = reactive({
  63. pageNum: 1,
  64. pageSize: 10
  65. })
  66. </script>

希望能帮助小伙伴们,有建议可以在评论区留言。

发表评论

表情:
评论列表 (有 0 条评论,119人围观)

还没有评论,来说两句吧...

相关阅读

    相关 封装 vue + element-ui 表格组件

    1.介绍 首先,我们项目中用的表格一般会很多,有的数据也很大,这样每一个模块中都会有一个表格,甚至弹窗中也有,大大增加了代码量,根据这一点,我们来封装一个表格,只需要传入