当前位置:   article > 正文

vue基于ElementUI二次封装Table+分页_element封装表格分页器组件

element封装表格分页器组件

话不多说直接上代码,首先我们先封装el-table组件,里面的item都是日常用到的基本el-table-column,对于复杂的el-table-column 我们可以定义插槽进行自定义扩展

  1. // SimpleTable
  2. <!--
  3. * @FileDescription: 基于elementUI的表格二次封装
  4. * @Author: wz
  5. * @Date: 2023-02-27 15:17
  6. * @remakrs:
  7. data:表格数据源
  8. loading:表格加载状态
  9. columns:表格表头配置项
  10. pagination: 分页配置项
  11. -->
  12. <template>
  13. <div class="simple_table">
  14. <el-table
  15. :data="data"
  16. border
  17. style="width: 100%"
  18. v-loading="loading"
  19. element-loading-text="数据加载中"
  20. element-loading-spinner="el-icon-loading"
  21. element-loading-background="rgba(6, 91, 91,0.9)"
  22. @selection-change="handleTableCurrentChange"
  23. :row-style="{ height: '55px' }"
  24. :cell-style="{ padding: '0px' }"
  25. :header-cell-style="headStyle"
  26. :cell-class-name="rowClass"
  27. >
  28. <template v-for="(item,index) in columns">
  29. <!-- 选择多行数据时使用 Checkbox。 -->
  30. <el-table-column v-if="item.type === 'selection'" :align="'center'" :fixed="item.fixed" :key="item.type+index" type="selection" ></el-table-column>
  31. <!-- 序号 -->
  32. <el-table-column v-if="item.type === 'index'" :align="'center'" :fixed="item.fixed" :label="item.label || '序号'" :width="item.width || 60" :key="item.type+index" type="index"></el-table-column>
  33. <!-- 常规文本内容 -->
  34. <el-table-column v-if="item.type ==='text'" :align="'center'" :width="item.width || ''" :formatter="item.formatter || null" :fixed="item.fixed" show-overflow-tooltip :label="item.label" :key="item.type+index" :prop="item.key"></el-table-column>
  35. <!-- 日期内容 -->
  36. <el-table-column v-if="item.type ==='date'" :align="'center'" :fixed="item.fixed" :width="item.width || 150" show-overflow-tooltip :label="item.label" :key="item.type+index">
  37. <template slot-scope="scope">
  38. <div>{{ scope.row[item.key] | formateDate }}</div>
  39. </template>
  40. </el-table-column>
  41. <!-- 自定义内容 -->
  42. <slot v-if="item.type ==='slot'" show-overflow-tooltip :name="item.name"></slot>
  43. </template>
  44. </el-table>
  45. <!-- 分页 -->
  46. <div class="pagination_box">
  47. <el-pagination
  48. v-if="isPaginationShow && pagination.total"
  49. style="margin-top: 10px"
  50. background
  51. :page-size="pagination.size"
  52. :current-page.sync="pagination.current"
  53. :total="pagination.total"
  54. layout="total, sizes,prev, pager, next,jumper"
  55. @size-change="handleSizeChange"
  56. @current-change="handleCurrentChange"
  57. >
  58. </el-pagination>
  59. </div>
  60. </div>
  61. </template>
  62. <script>
  63. // 根据自己的业务进行日期转换
  64. import { formatDateTime } from '@/utils/date'
  65. export default {
  66. name:'simpleTable',
  67. props:{
  68. data:{
  69. type:Array,
  70. default:()=> []
  71. },
  72. columns: {
  73. type: Array,
  74. default: () => [],
  75. },
  76. stripe:{
  77. type:Boolean,
  78. default:true
  79. },
  80. border:{
  81. type:Boolean,
  82. default:true
  83. },
  84. loading:{
  85. type:Boolean,
  86. default:false
  87. },
  88. isPaginationShow: {
  89. type: Boolean,
  90. default: true,
  91. },
  92. rowClass:{
  93. type: Function,
  94. default: ()=>'',
  95. },
  96. pagination: {
  97. type: Object,
  98. default: () => ({
  99. current: 1,
  100. size: 10,
  101. total: 0,
  102. }),
  103. },
  104. },
  105. data() {
  106. return {
  107. }
  108. },
  109. filters: {
  110. formateDate(val) {
  111. return formatDateTime(val)
  112. }
  113. },
  114. methods:{
  115. headStyle(){
  116. return "text-align:center"
  117. },
  118. // 切换页码
  119. handleCurrentChange(val) {
  120. this.$emit('handleCurrentChange',val);
  121. },
  122. // 切换每页条数
  123. handleSizeChange(value) {
  124. // current-page和 page-size都支持 .sync修饰符,用了.sync修饰符,就不需要手动给 this.pagination赋值了
  125. this.pagination.size = value;
  126. this.$emit('getData');
  127. },
  128. // 切换选择
  129. // handleSelectionChange(val) {
  130. // this.$emit('changeSelection', val);
  131. // },
  132. // 单选
  133. handleTableCurrentChange(currentRow) {
  134. this.$emit('changeCurrent', currentRow);
  135. },
  136. }
  137. }
  138. </script>
  139. <style lang="scss" scoped>
  140. </style>

具体如何使用呢,我这里也把几个场景的代码贴出来,

首先先引入并注册组件,这里贴上template中使用的代码

  1. <SimpleTable :data="tableData" :columns="columns" :rowClass="rowClass" :pagination="pagination" @handleCurrentChange="handleCurrentChange" @changeCurrent="changeCurrent">
  2. <el-table-column slot="action" :align="'center'" :label="'操作'" width="150">
  3. <template slot-scope="scope">
  4. <el-button type="text" size="small" @click="operationStation(6,scope.row)" class="qgreen" >查看
  5. </el-button>
  6. <el-divider
  7. direction="vertical"
  8. ></el-divider>
  9. <!-- <el-button type="text" size="small" @click="editRecord(scope.row)" class="qgreen">
  10. 修改
  11. </el-button>
  12. <el-divider direction="vertical" ></el-divider> -->
  13. <el-button type="text" size="small" @click="batchDel(1,scope.row.cardNo)" class="color-danger" >
  14. 删除
  15. </el-button>
  16. </template>
  17. </el-table-column>
  18. </SimpleTable>

这是date里的数据,type:'selection' 是表单多选checkbox,formatter是定义每列数据的格式化,

slot则是定义的具名插槽,这里的name:"action"要和上面的slot="action"保持一致

  1. tableData:[],
  2. columns:[
  3. { type:'selection'},
  4. { type:'index'},
  5. { type:'text',key:'cardNo',label:'卡号'},
  6. { type:'text',key:'batchId',label:'批次号'},
  7. { type:'text',key:'firstSubjectName',label:'合作机构名称'},
  8. { type:'text',key:'cardStatus',label:'会员卡状态',formatter:this.cellFormatter},
  9. { type:'text',key:'cardType',label:'会员卡类型',formatter:this.cellFormatter},
  10. { type:'text',key:'durationDays',label:'可用时间(天)'},
  11. { type:'text',key:'qrCodeGenerated',label:'二维码生成',formatter:this.cellFormatter},
  12. { type:'date',key:'lastActivityTime',label:'最后激活时间'},
  13. { type:'slot',name:"action"}
  14. ]
  15. pagination: {
  16. current: 1,
  17. size: 10,
  18. total: 1,
  19. },

这里是methods代码

  1. // 根据列的值动态显示样式 仅为示例,具体根据自身业务更改
  2. rowClass(col){
  3. if(col.column.property === 'qrCodeGenerated'){
  4. return col.row.qrCodeGenerated === 'NO' ? 'color-danger' : 'color-success'
  5. }
  6. },
  7. // 每列对应需要格式化的内容
  8. cellFormatter(row, column, cellValue, index){
  9. let showLabel =''
  10. if(column.property === 'cardStatus'){
  11. this.cardStatus.forEach(x=>{
  12. if(x.value === cellValue){
  13. showLabel= x.label
  14. }
  15. })
  16. }
  17.     ……
  18. if(column.property === 'qrCodeGenerated'){
  19. showLabel= cellValue === 'YES'? '是':'否'
  20. }
  21. return showLabel || '-'
  22. },

至此二次封装的table就可以愉快的使用了,有什么问题给我留言吧...

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

闽ICP备14008679号