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

以上是封装好的表格组件  table.vue

使用该组件

  1.  
  1. <template>
    <div class="ces-main">
    <table-com
    :that='that'
    size='small '
    :isSelection='true'
    :isIndex='true'
    :isHandle='true'
    :tableData='tableData'
    :tableCols='tableCols'
    :newBtnList="newBtnList"
    :isPagination='true'
    :tablePage='pagination'
    :longDatas="longDatas"
    >
    </table-com>
  2.  
  3. </div>
    </template>
  4.  
  5. <script>
    import tableCom from '../../components/tableCompnment/tableForm'
    export default {
    components : {
    tableCom
    },
    data () {
    return {
    that : this,
    // 查询表单
    searchData:{
    carNumber:null,
    },
    searchForm:[//搜索栏
    {type:'Input',prop:'carNumber',width:'180px',placeholder:'请输入车牌'},
    ],
    searchHandle:[//搜索按钮
    {label:'查询',icon:"el-icon-search",type:'primary',handle:()=>this.searchNews()},
    ],
    tableData : [
    {id:1,carNumber:'粤B555'},
    {id:2,carNumber:'粤B555'},
    {id:3,carNumber:'粤B555'},],// 表格数据
    tableCols:[// 表头
    {label:'车牌',prop:'carNumber'},
    {label:'车辆信息',type:'longData'},
    {label:'下单时间',prop:'inputTime'},
    {label:'业务类型',prop:'checkType'},
    {label:'故障描述',prop:'note'},
    {label:'发动机缸数量',prop:'carCylinder'},
    {label:'当前操作人',prop:'operatorName'},
    {label:'操作',type:'button',},
    {label:'冻结',type:'Button',btnList:[
    {type:'danger',label:'冻结工单',handle:(row,that)=>this.showRecord(row,that)},
    ]},
    ],
    newBtnList:[
    {id : 1,btnList:[
    {type:'primary',label:'上传照片',isShow:true, handle:(row,that)=>this.showEditTest(row,that)},
    {type:'success',label:'完成',isShow:false, handle:row=>''}
    ]
    },
    {id : 2,btnList:[
    {type:'primary',label:'上传照片',isShow:true, handle:(row,that)=>this.showEditTest(row,that)},
    {type:'success',label:'完成',isShow:true, handle:row=>''}
    ]
    },
    {id : 3,btnList:[
    {type:'primary',label:'上传照片',isShow:true, handle:(row,that)=>this.showEditTest(row,that)},
    {type:'success',label:'完成',isShow:true, handle:row=>''}
    ]
    }
    ],
  6.  
  7. longDatas : [],
    pagination:{//页数...
    pageSize:10,
    pageNum:1,
    total:0
    },
    orderPageShowOrgName: false,
    }
    },
    }
    </script>
  8.  
  9. <style>
    </style>
  1.  

最后效果

基于ElementUI封装可复用的表格组件的更多相关文章

  1. 如何快速为团队打造自己的组件库(下)—— 基于 element-ui 为团队打造自己的组件库

    文章已收录到 github,欢迎 Watch 和 Star. 简介 在了解 Element 源码架构 的基础上,接下来我们基于 element-ui 为团队打造自己的组件库. 主题配置 基础组件库在 ...

  2. Vue.js与ElementUI搭建无限级联层级表格组件

    前言 今天,回老家了.第一件事就是回家把大屏安排上,写作的感觉太爽了,终于可以专心地写文章了.我们今天要做的项目是怎么样搭建一个无限级联层级表格组件,好了,多了不多说,赶快行动起来吧!项目一览 到底是 ...

  3. 基于ElementUI封装Excel数据导入组件

    由于前端项目使用的是Vue-cli3.0 + TypeScript的架构,所以该组件也是基于ts语法封装的,组件的完整代码如下: <template> <div id="m ...

  4. 基于element-ui封装一个Table模板组件

    大家在做后台管理系统的时候,写的最多的可能就是表格页面了,一般分三部分:搜索功能区.表格内容区和分页器区.一般这些功能都是使用第三方组件库实现,比如说element-ui,或者vuetify.这两个组 ...

  5. 基于antd封装一个高可用form组件 减少cv代码导致的bug

    引言 在开发中台过程中 我们的原型中有很多表单,antd有表单组件,但是粒度比较细,就单纯组件而言,无可厚非,但是在开发过程中,可能会造成代码不够聚合,有些表单公共逻辑无法提取,copy paste比 ...

  6. 基于highcharts封装的组件-demo&源码

    前段时间做的项目中需要用到highcharts绘制各种图表,其实绘制图表本身代码很简单,但是由于需求很多,有大量的图形需要绘制,所以就不得不复制粘贴大量重复(默认配置等等)的代码,所以,后来抽空自己基 ...

  7. 封装Vue Element的可编辑table表格组件

    前一段时间,有博友在我那篇封装Vue Element的table表格组件的博文下边留言说有没有那种"表格行内编辑"的封装组件,我当时说我没有封装过这样的组件,因为一直以来在实际开发 ...

  8. 使用Vue CLI 3将基于element-ui二次封装的组件发布到npm

    前言:之前在网上找的好多都是基于vue-cli 2.x的,而使用vue-cli 3的文章比较少,Vue CLI 3 中文文档,所以我在自己尝试的时候把几篇文章结合了一下,调出来了我想要的模式,也就是V ...

  9. Vue + Element-ui实现后台管理系统(5)---封装一个Form表单组件和Table表格组件

    封装一个Form表单组件和Table组件 有关后台管理系统之前写过四遍博客,看这篇之前最好先看下这四篇博客.另外这里只展示关键部分代码,项目代码放在github上: mall-manage-syste ...

随机推荐

  1. 【LOJ】#3101. 「JSOI2019」精准预测

    LOJ#3101. 「JSOI2019」精准预测 设0是生,1是死,按2-sat连边那么第一种情况是\((t,x,1) \rightarrow (t + 1,y,1)\),\((t + 1,y, 0) ...

  2. (二)mybatis框架原理(图解)

    目录 mybatis 框架原理图(粗略版) mybatis 框架原理图(粗略版)

  3. GCD欧几里得的拓展算法

    欧几里得算法的拓展主要是用于求解   : 已知整数 a, b,然后我们进行  ax + by == gcd(a , b) 的问题求解 那么如何进行求解呢?和欧几里得算法一样, 我们需要进行递归的方式进 ...

  4. dedecms发布文章时间显示多少分钟前

    /**文章发布多少时间前*/function tranTime($time) { $rtime = date("m-d H:i",$time); $htime = date(&qu ...

  5. 15.Ansible安装与配置简单版

    Ansible是一个简单高效的自动化运维管理工具,用Python开发,能大批量管理N多台机器,可以并发的在多台机器上部署应用.安装软件.执行命令.配置和编排任务. 一.Ansible工作机制 从图中可 ...

  6. 【第一季】CH09_FPGA多路分频器设计

    [第一季]CH09_FPGA多路分频器设计 在第七节的学习中,笔者带大家通过一个入门必学的流水灯实验实现,快速掌握了VIVADO基于FPGA开发板的基本流程.考虑到很多初学者并没有掌握好Vivado ...

  7. 使用 backdoor 工具注入ShellCode

    backdoor-factory 顾名思义,直接翻译过来就是后门工厂的意思.其利用打补丁的方式编码加密PE文件,可以轻松的生成win32PE后门程序,从而帮助我们绕过一些防病毒软件的查杀,达到一定得免 ...

  8. 怎样在Chrome浏览器上安装 Vue Devtools 扩展程序

    第一步: 前往 GitHub 下载 Vue Devtools 项目文件 https://github.com/vuejs/vue-devtools 注意: 1. 将分支切换为 master 2. 下载 ...

  9. Django2.0 应用 Xadmin 报错解决(转载)

    原文地址:https://blog.csdn.net/GoAheadNeverTurnBack/article/details/8143362 1.TypeError at /xadmin/    l ...

  10. str.charAt()与str[]的区别

    str.charAt():只能显示当前字符,没有则显示空. str[]:当索引超出当前字符长度时,则显示undefined.