element-ui table表格+分页器封装

淩亂°似流年 2023-02-11 08:45 36阅读 0赞

表格组件代码:Table.vue

  1. <!--表格组件 -->
  2. <template>
  3. <section class="ces-table-page">
  4. <!-- 表格操作按钮 -->
  5. <section class="ces-handle" v-if='isHandle'>
  6. <el-button v-for='item in tableHandles' :size="item.size || size" :type="item.type" :icon='item.icon' @click="item.handle()">{ { item.label}}</el-button>
  7. </section>
  8. <!-- 数据表格 -->
  9. <section class="ces-table">
  10. <el-table :data='tableData' :size='size' height="100%"
  11. :border ='isBorder'
  12. @select='select'
  13. @select-all='selectAll'
  14. v-loading='loading'
  15. :defaultSelections='defaultSelections'
  16. ref="cesTable">
  17. <el-table-column v-if="isSelection" type="selection" align="center" ></el-table-column>
  18. <el-table-column v-if="isIndex" type="index" :label="indexLabel" align="center" width="50"></el-table-column>
  19. <!-- 数据栏 -->
  20. <el-table-column v-for="item in tableCols"
  21. :key="item.id"
  22. :prop="item.prop"
  23. :label="item.label"
  24. :width="item.width"
  25. :align="item.align"
  26. :render-header="item.require?renderHeader:null"
  27. >
  28. <template slot-scope="scope" >
  29. <!-- html -->
  30. <span v-if="item.type==='Html'" v-html="item.html(scope.row)"></span>
  31. <!-- 按钮 -->
  32. <span v-if="item.type==='Button'" >
  33. <el-button v-for="btn in item.btnList"
  34. v-if="!btn.isShow || (btn.isShow && btn.isShow(scope.row))"
  35. :disabled="btn.isDisabled && btn.isDisabled(scope.row)"
  36. :type="btn.type"
  37. :size="btn.size || size"
  38. :icon="btn.icon"
  39. @click="btn.handle(scope.row)">{ { btn.label}}</el-button>
  40. </span>
  41. <!-- 输入框 -->
  42. <el-input v-if="item.type==='Input'" v-model="scope.row[item.prop]" :size="size"
  43. :disabled="btn.isDisabled && btn.isDisabled(scope.row)"
  44. @focus="item.focus && item.focus(scope.row)"></el-input>
  45. <!-- 下拉框 -->
  46. <el-select v-if="item.type==='Select'" v-model="scope.row[item.prop]" :size="size" :props="item.props"
  47. :disabled="btn.isDisabled && btn.isDisabled(scope.row)"
  48. @change='item.change && item.change(scope.row)'>
  49. <el-option v-for="op in item.options" :label="op[item.props.label]" :value="op[item.props.value]" :key="op[item.props.value]"></el-option>
  50. </el-select>
  51. <!-- 单选 -->
  52. <el-radio-group v-if="item.type==='Radio'" v-model="scope.row[item.prop]"
  53. :disabled="btn.isDisabled && btn.isDisabled(scope.row)"
  54. @change='item.change && item.change(scope.row)'>
  55. <el-radio v-for="ra in item.radios" :label="ra.value">{ { ra.label}}</el-radio>
  56. </el-radio-group>
  57. <!-- 复选框 -->
  58. <el-checkbox-group v-if="item.type==='Checkbox'" v-model="scope.row[item.prop]"
  59. :disabled="btn.isDisabled && btn.isDisabled(scope.row)"
  60. @change='item.change && item.change(scope.row)'>
  61. <el-checkbox v-for="ra in item.checkboxs" :label="ra.value">{ { ra.label}}</el-checkbox>
  62. </el-checkbox-group>
  63. <!-- 评价 -->
  64. <el-rate v-if="item.type==='Rate'" v-model="scope.row[item.prop]"
  65. :disabled="btn.isDisabled && btn.isDisabled(scope.row)"
  66. @change='item.change && item.change(scope.row)'></el-rate>
  67. <!-- 开关 -->
  68. <el-switch v-if="item.type==='Switch'" v-model="scope.row[item.prop]"
  69. :disabled="btn.isDisabled && btn.isDisabled(scope.row)"
  70. @change='item.change && item.change(scope.row)'></el-switch>
  71. <!-- 图像 -->
  72. <img v-if="item.type==='Image'" :src="scope.row[item.prop]" @click="item.handle && item.handle(scope.row)"/>
  73. <!-- 滑块 -->
  74. <el-slider v-if="item.type==='Slider'" v-model="scope.row[item.prop]"
  75. :disabled="btn.isDisabled && btn.isDisabled(scope.row)"
  76. @change='item.change && item.change(scope.row)'></el-slider>
  77. <!-- 默认 -->
  78. <span v-if="!item.type"
  79. :style="item.itemStyle && item.itemStyle(scope.row)"
  80. :class="item.itemClass && item.item.itemClass(scope.row)">{ { (item.formatter && item.formatter(scope.row)) || scope.row[item.prop]}}</span>
  81. </template>
  82. </el-table-column>
  83. </el-table>
  84. </section>
  85. <!-- 分页 -->
  86. <section class="ces-pagination" v-if='isPagination'>
  87. <el-pagination style='display: flex;justify-content: center;height: 100%;align-items: center;'
  88. @current-change="handleCurrentChange"
  89. @size-change="handleSizeChange"
  90. layout="total,sizes ,prev, pager, next,jumper"
  91. :page-size="pagination.pageSize"
  92. :current-page="pagination.pageNum"
  93. :total="pagination.total"
  94. ></el-pagination>
  95. </section>
  96. </section>
  97. </template>
  98. <script>
  99. export default {
  100. props:{
  101. // 表格型号:mini,medium,small
  102. size:{ type:String,default:'medium'},
  103. isBorder:{ type:Boolean,default:true},
  104. loading:{ type:Boolean,default:false},
  105. // 表格操作
  106. isHandle:{ type:Boolean,default:false},
  107. tableHandles:{ type:Array,default:()=>[]},
  108. // 表格数据
  109. tableData:{ type:Array,default:()=>[]},
  110. // 表格列配置
  111. tableCols:{ type:Array,default:()=>[]},
  112. // 是否显示表格复选框
  113. isSelection:{ type:Boolean,default:false},
  114. defaultSelections:{ type:[Array,Object], default:()=>null},
  115. // 是否显示表格索引
  116. isIndex:{ type:Boolean,default:false},
  117. indexLabel: { type:String,default:'序号'},
  118. // 是否显示分页
  119. isPagination:{ type:Boolean,default:true},
  120. // 分页数据
  121. pagination:{ type:Object,default:()=>({ pageSize:10,pageNum:1,total:0})},
  122. },
  123. data(){
  124. return {
  125. }
  126. },
  127. watch:{
  128. 'defaultSelections'(val) {
  129. this.$nextTick(function(){
  130. if(Array.isArray(val)){
  131. val.forEach(row=>{
  132. this.$refs.cesTable.toggleRowSelection(row)
  133. })
  134. }else{
  135. this.$refs.cesTable.toggleRowSelection(val)
  136. }
  137. })
  138. }
  139. },
  140. methods:{
  141. // 表格勾选
  142. select(rows,row){
  143. this.$emit('select',rows,row);
  144. },
  145. // 全选
  146. selectAll(rows){
  147. this.$emit('select',rows)
  148. },
  149. //
  150. handleCurrentChange(val){
  151. this.pagination.pageNum = val;
  152. this.$emit('refresh');
  153. },
  154. handleSizeChange(val) {
  155. this.pagination.pageSize = val;
  156. this.$emit('refresh');
  157. },
  158. // tableRowClassName({ rowIndex}) {
  159. // if (rowIndex % 2 === 0) {
  160. // return "stripe-row";
  161. // }
  162. // return "";
  163. // }
  164. renderHeader(h,obj) {
  165. return h('span',{ class:'ces-table-require'},obj.column.label)
  166. },
  167. },
  168. }
  169. </script>
  170. <style>
  171. .ces-table-require::before{
  172. content:'*';
  173. color:red;
  174. }
  175. </style>

页面调用和搜索框组件同用:

  1. <template>
  2. <div class="ces-main">
  3. <search-form
  4. size='mini'
  5. labelWidth = '80px'
  6. :searchData = "searchData"
  7. :searchForm = "searchForm"
  8. :searchHandle="searchHandle"></search-form>
  9. <ces-table
  10. size='mini'
  11. :isSelection='true'
  12. :isIndex='true'
  13. :isPagination='true'
  14. :isHandle='true'
  15. :tableData='tableData'
  16. :tableCols='tableCols'
  17. :tableHandles='tableHandles'
  18. :pagination='pagination'
  19. >
  20. </ces-table>
  21. </div>
  22. </template>
  23. <script>
  24. import SearchForm from '@/components/common/Form/searchForm'
  25. import cesTable from '@/components/common/Table/Table'
  26. export default {
  27. data () {
  28. let sexs=[{ label:'男',value:'M'},{ label:'女',value:'F'}]
  29. let sexProps={ label:'label',value:'value'}
  30. let intersts=[{ label:'羽毛球',value:'badminton'},{ label:'篮球',value:'basketball'}]
  31. let interstProps={ label:'label',value:'value'}
  32. return {
  33. // 查询表单
  34. searchData:{
  35. name:null,
  36. age:null,
  37. sex:null,
  38. interst:null
  39. },
  40. searchForm:[
  41. { type:'Input',label:'姓名',prop:'name',width:'180px',placeholder:'请输入姓名...'},
  42. { type:'Input',label:'年龄',prop:'age',width:'180px',placeholder:'请输入年龄...'},
  43. { type:'Select',label:'性别',prop:'sex',width:'180px',options:sexs,props:sexProps,change:row=>'',placeholder:'请选择性别...'},
  44. { type:'Checkbox',label:'爱好',width:'180px',prop:'interst',checkboxs:intersts,props:interstProps}
  45. ],
  46. searchHandle:[
  47. { label:'查询',type:'primary',handle:()=>''},
  48. { label:'重置',type:'primary',handle:()=>''}
  49. ],
  50. // 表格
  51. tableData:[
  52. { name:'张三',age:'12',sex:'男',interst:'女'},
  53. { name:'筱华',age:'27',sex:'女',interst:'羽毛球'},
  54. { name:'张三',age:'12',sex:'男',interst:'女'},
  55. { name:'筱华',age:'27',sex:'女',interst:'羽毛球'},
  56. { name:'筱华',age:'27',sex:'女',interst:'羽毛球'},
  57. { name:'筱华',age:'27',sex:'女',interst:'羽毛球'},
  58. { name:'筱华',age:'27',sex:'女',interst:'羽毛球'}
  59. ],
  60. tableCols:[
  61. { label:'姓名',prop:'name'},
  62. { label:'年龄',prop:'age'},
  63. { label:'性别',prop:'sex'},
  64. { label:'爱好',prop:'interst'},
  65. { label:'操作',type:'Button',btnList:[
  66. { type:'primary',label:'编辑',handle:row=>''},
  67. { type:'danger',label:'删除',handle:row=>''}
  68. ]}
  69. ],
  70. tableHandles:[
  71. { label:'新增',type:'primary',handle:row=>''}
  72. ],
  73. pagination:{
  74. pageSize:10,
  75. pageNum:1,
  76. total:7
  77. }
  78. }
  79. },
  80. components:{
  81. cesTable,
  82. SearchForm
  83. }
  84. }
  85. </script>
  86. <style>
  87. </style>

发表评论

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

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

相关阅读

    相关 ElementUI

    一、概述 当我们向后台请求大量数据的时候,并要在页面展示出来,请求的数据可能上百条数据或者更多的时候,并不想在一个页面展示,这就需要使用分页功能来去完成了。 本次所使用