基于ElementUI封装可复用的表格组件

<template>
    <section class="ces-table-page">
        <!-- 表格操作按钮 -->
        <section class="ces-handle" v-if=‘isHandle‘>
            <el-button
                v-for=‘item in tableHandles‘
                :key=‘item.label‘
                :size="size || item.size"
                :type="item.type"
                :icon=‘item.icon‘
                @click="item.handle(that)">{{item.label}}
            </el-button>
        </section>
        <!-- 数据表格 -->
        <section class="ces-table">
            <el-table
                 :data=‘tableData‘
                 :size=‘size‘
                  height="100%"
                 style="width: 100%"
                 :border  =‘isBorder‘
                 @select=‘select‘
                @select-all=‘selectAll‘
                v-loading=‘loading‘
                :defaultSelections=‘defaultSelections‘
                ref="cesTable">
                // 复选框
                <!--<el-table-column v-if="isSelection" type="selection" align="center" ></el-table-column>-->
                // 序号
                <!--<el-table-column v-if="isIndex" type="index" :label="indexLabel" align="center" width="50"></el-table-column>-->
                <!-- 数据栏 -->
                <el-table-column
                     v-for="item in tableCols"
                     :key="item.id"
                     :prop="item.prop"
                     :label="item.label"
                     :width="item.width"
                     :align="item.align"
                     :render-header="item.require?renderHeader:null"
                >
                    <template slot-scope="scope" >
                        <!-- 按钮-->

                        <template v-if="item.type === ‘Button‘">
                            <el-button v-for="btnItem in item.btnList" :key="btnItem.label"
                                    :disabled="btnItem.disabled && btnItem.disabled(scope.row)"
                                   :type="btnItem.type"
                                   :size="size || btnItem.size"
                                   :icon="btnItem.icon"
                                   @click="btnItem.handle(that,scope.row)">{{btnItem.label}}
                            </el-button>
                        </template>

                        <!-- html -->
                        <span v-if="item.type===‘html‘" v-html="item.html(scope.row)"></span>
                        <!-- 下拉框 -->
                        <el-select v-if="item.type===‘select‘" v-model="scope.row[item.prop]" :size="size || btn.size"  :props="item.props"
                                   :disabled="item.isDisabled && item.isDisabled(scope.row)"
                                   @change=‘item.change && item.change(that,scope.row)‘>
                        <el-option v-for="op in item.options" :label="op.label" :value="op.value" :key="op.value"></el-option>
                        </el-select>
                        <!-- 单选 -->
                        <el-radio-group v-if="item.type===‘radio‘" v-model="scope.row[item.prop]"
                                        :disabled="item.isDisabled && item.isDisabled(scope.row)" :size="size || btn.size"
                                        @change=‘item.change && item.change(that,scope.row)‘>
                            <el-radio v-for="ra in item.radios" :label="ra.value" :key="ra.value">{{ra.label}}</el-radio>
                        </el-radio-group>
                        <!-- 复选框 -->
                        <el-checkbox-group v-if="item.type===‘checkbox‘" v-model="scope.row[item.prop]"
                                           :disabled="item.isDisabled && item.isDisabled(scope.row)" :size="size || btn.size"
                                           @change=‘item.change && item.change(that,scope.row)‘>
                            <el-checkbox v-for="ra in item.checkboxs" :label="ra.value" :key=‘ra.value‘>{{ra.label}}</el-checkbox>
                        </el-checkbox-group>
                        <!-- 评价 -->
                        <el-rate v-if="item.type===‘rate‘" v-model="scope.row[item.prop]"
                                 :disabled="item.isDisabled && item.isDisabled(scope.row)" :size="size || btn.size"
                                 @change=‘item.change && item.change(scope.row)‘></el-rate>
                        <!-- 开关 -->
                        <el-switch v-if="item.type===‘switch‘" v-model="scope.row[item.prop]" :size="size || btn.size"
                                   :active-value=‘item.values&&item.values[0]‘
                                   :inactive-value=‘item.values&&item.values[1]‘
                                   :disabled="item.isDisabled && item.isDisabled(scope.row)"
                                   @change=‘item.change && item.change(scope.row)‘></el-switch>
                        <!-- 图像 -->
                        <img v-if="item.type===‘image‘" :src="scope.row[item.prop]" @click="item.handle && item.handle(scope.row)"/>
                        <!-- 滑块 -->
                        <el-slider v-if="item.type===‘slider‘" v-model="scope.row[item.prop]"
                                   :disabled="item.isDisabled && item.isDisabled(scope.row)" :size="size || btn.size"
                                   @change=‘item.change && item.change(scope.row)‘></el-slider>
                        <!-- 默认 -->
                        <span v-if="!item.type"
                              :style="item.itemStyle && item.itemStyle(scope.row)" :size="size || btn.size"
                              :class="item.itemClass && item.item.itemClass(scope.row)">{{(item.formatter && item.formatter(scope.row)) || scope.row[item.prop]}}</span>
                    </template>
                </el-table-column>
            </el-table>
        </section>
        <!-- 分页 -->
        <section class="ces-pagination"  v-if=‘isPagination‘>
            <el-pagination style=‘display: flex;justify-content: center;height: 100%;align-items: center;margin-top: 20px;‘
                   @current-change="handleCurrentChange"
                   @size-change="handleSizeChange"
                   background
                   layout="total,sizes ,prev, pager, next, jumper"
                   :page-size="tablePage.pageSize"
                   :current-page="tablePage.pageNum"
                   :total="tablePage.total"
            ></el-pagination>
        </section>
    </section>
</template>

<script>

  export default {
    props:{
      that: { type: Object, default: this },
      // 表格型号:mini,medium,small
      size:{type:String,default:‘medium‘},
      isBorder:{type:Boolean,default:true},
      loading:{type:Boolean,default:false},
      // 表格操作
      isHandle:{type:Boolean,default:false},
      tableHandles:{type:Array,default:()=>[]},
      // 表格数据
      tableData:{ type:Array,default:()=>[]},
      // 表格列配置
      tableCols:{ type:Array,default:()=>[]},
      // 是否显示表格复选框
      isSelection:{type:Boolean,default:false},
      defaultSelections:{ type:[Array,Object], default:()=>null},
      // 是否显示表格索引
      isIndex:{type:Boolean,default:false},
      indexLabel: {type:String,default:‘序号‘},
      // 是否显示分页
      isPagination:{type:Boolean,default:true},
      // 分页数据
      tablePage:{ type:Object,default:()=>({pageSize:10,pageNum:1,total:0})},

    },
    data(){
      return {
      }
    },
    watch:{
      ‘defaultSelections‘(val) {
        this.$nextTick(function(){
          if(Array.isArray(val)){
            val.forEach(row=>{
              this.$refs.cesTable.toggleRowSelection(row)
            })
          }else{
            this.$refs.cesTable.toggleRowSelection(val)
          }
        })
      }
    },
    methods:{
      // 表格勾选
      select(rows,row){
        this.$emit(‘select‘,rows,row);
      },
      // 全选
      selectAll(rows){
        this.$emit(‘select‘,rows)
      },
      //
      handleCurrentChange(val){
        this.tablePage.pageNum = val;
        this.$emit(‘CurrentChange‘,val);
      },
      handleSizeChange(val) {
        this.tablePage.pageSize = val;
        this.$emit(‘SizeChange‘,val);
      },

      // tableRowClassName({rowIndex}) {
      //     if (rowIndex % 2 === 0) {
      //         return "stripe-row";
      //     }
      //     return "";
      // }
      renderHeader(h,obj) {
        return h(‘span‘,{class:‘ces-table-require‘},obj.column.label)
      },
    },
  }
</script>
<style>
    .ces-table-require::before{
        content:‘*‘;
        color:red;
    }
    .el-table__row td {
        text-align: center;
    }
    .has-gutter tr th {
        text-align: center;
    }
    . el-table__body-wrapper {
        height: 500px !important;
    }
</style>

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

使用该组件

<template>
    <ces-table
            :that=‘that‘
            size=‘small ‘
            :isSelection=‘true‘
            :isIndex=‘true‘
            :isHandle=‘true‘
            :tableData=‘tableDataDemo‘
            :tableCols=‘tableColsDemo‘
            :newBtnList="newBtnListDemo"
            :isPagination=‘true‘
            :tablePage=‘paginationDemo‘
            :longDatas="longDatasDemo"
    >

    </ces-table>
</template>

<script>
  import cesTable from ‘./table‘
  export default {
    name: "demoTable",
    components : {cesTable},
    data () {
      return  {
that : this,
  tableColsDemo: [// 表头
    {label:‘车牌‘,prop:‘carNumber‘},
    {label:‘车辆信息‘,type:‘longData‘},
    {label:‘下单时间‘,prop:‘inputTime‘},
    {label:‘业务类型‘,prop:‘checkType‘},
    {label:‘故障描述‘,prop:‘note‘},
    {label:‘发动机数量‘,prop:‘carCylinder‘},
    {label:‘操作记录‘,type:‘Button‘,btnList:[
        {type:‘success‘,label:‘查看‘,handle:(row,that)=>this.showRecord(row,that)},
      ]},
  ],
  tableDataDemo : [],//表格数据
  newBtnListDemo : [],
  paginationDemo : {pageSize:10,pageNum:1,total:10},
      }
    },
    created(){

    },
    methods : {

    },
    computed : {

      ]),
    },
  };
</script>

<style scoped>

</style>

最后效果如图

原文地址:https://www.cnblogs.com/weiweiyeyu/p/12082907.html

时间: 2024-11-09 20:50:23

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

应用十一:Vue之基于ElementUI封装execl导入组件

针对上一篇<应用十:Vue之Vue与TypeScript集成开发>的介绍,这里给大家分享一个在近期项目中封装的导入组件,参考组件源码来更好的熟悉.vue文件中脚本的语法. 组件源码: <template> <div id="myImport"> <el-button type="primary" plain @click="importDialogVisible = true">导入</el-

基于element-ui的多选下拉框和tag标签的二次封装

前言: 今年这大半年我主要负责公司的后台教务管理的开发,这个管理系统目前主要是给公司的内部人员去配置公司的核心项目(例如:熊猫小课)的所有数据,例如课程的配置.课程期数的配置.课程版本的配置.活动的配置.课程安排表.管理员的权限配置.物流的管理.退款管理.学员咨询管理等功能.因为一开始这个教务系统的原型设计就是基于element-ui 1.4.13的版本设计的,前端一开始为了和设计稿给的原型保持一致,项目中也是基于element-ui 1.4.13在开发,现在这个版本官方已经停止维护了,我们曾经

[Unity3D]Unity3D游戏开发之基于2D贴图实现血条组件的开发

各位朋友,大家好,欢迎大家关注我的博客,我是秦元培,我的博客地址是blog.csdn.net/qinyuanpei. 在上一篇文章中,我们以经典的打砖块游戏为例,讲解了一个Unity3D游戏的完整实现过程.今天呢,我们来做一个在游戏中十分重要的组成元素:血条.血条是什么呢?血条是生命值的一种体现,就像<仙剑奇侠传三>电视剧中,当景天说他想让那些被邪剑仙害死的人活过来的时候,天帝说需要等量的生命值来换,所以电视剧中的结局就变成了景天留在世上的时间并不多了,雪见依偎着他坐在新安当门口的时候,天上忽

【AmazeUI】折叠式卡片布局,整合内容列表、表格组件

折叠式卡片布局在PC版网站中可能不常见,但是在手机版,小屏幕的网页浏览会大发异彩. AmazeUI也提供了折叠式卡片布局,虽然官网上有例子,但是这种折叠式卡片布局,整合内容列表.表格组件还是需要一番功夫. 比如如下图,利用AmazeUI的折叠式卡片布局,整合其提供的内容列表与表格组件. 整个页面的代码如下: <!--使用HTML5开发--> <!doctype html> <html class="no-js"> <html> <h

打通前后端全栈开发node+vue进阶【课程学习系统项目实战详细讲解】(3):用户添加/修改/删除 vue表格组件 vue分页组件

第三章 建议学习时间8小时      总项目预计10章 学习方式:详细阅读,并手动实现相关代码(如果没有node和vue基础,请学习前面的vue和node基础博客[共10章] 演示地址:后台:demoback.lalalaweb.com  前台:demo.lalalaweb.com 演示过程中可能会发现bug,希望即时留言反馈,谢谢 源码下载:https://github.com/sutianbinde/classweb               //不是全部的代码,每次更新博客才更新代码 学

基于 ECharts 封装甘特图并实现自动滚屏

项目中需要用到甘特图组件,之前的图表一直基于 EChart 开发,但 EChart 本身没有甘特图组件,需要自行封装 经过一番鏖战,终于完成了... 我在工程中参考 v-chart 封装了一套图表组件,所以这里只介绍甘特图组件的实现,图表的初始化.数据更新.自适应等不在这里介绍 一.约定数据格式 EChart 本身没有甘特图,但可以通过 EChart 提供的“自定义”方法 type: 'custom' 开发 const option = { series: [{ type: 'custom',

一个基于RabbitMQ的可复用的事务消息方案

原文:一个基于RabbitMQ的可复用的事务消息方案 前提# 分布式事务是微服务实践中一个比较棘手的问题,在笔者所实施的微服务实践方案中,都采用了折中或者规避强一致性的方案.参考Ebay多年前提出的本地消息表方案,基于RabbitMQ和MySQL(JDBC)做了轻量级的封装,实现了低入侵性的事务消息模块.本文的内容就是详细分析整个方案的设计思路和实施.环境依赖如下: JDK1.8+ spring-boot-start-web:2.x.x.spring-boot-start-jdbc:2.x.x.

DataGrid( 数据表格) 组件[3]

本节课重点了解 EasyUI 中 DataGrid(数据表格)组件的使用方法,这个组件依赖于Panel(面板).Resizeable(调整大小).LinkButton(按钮).Pageination(分页)组件. 一. 样式设置 //样式设置$('#box').datagrid({url : 'user.php',title : '用户列表',width : 500,iconCls : 'icon-search',striped : true,nowrap : true,fitColumns :

JS组件系列——表格组件神器:bootstrap table(三:终结篇,最后的干货福利)

前言:前面介绍了两篇关于bootstrap table的基础用法,这章我们继续来看看它比较常用的一些功能,来个终结篇吧,毛爷爷告诉我们做事要有始有终~~bootstrap table这东西要想所有功能覆盖似乎不太现实,博主挑选了一些自认为比较常用的功能在此分享给各位园友.源码也在这篇统一给出.好了,不多说废话,开始我们的干货之旅吧. bootstrap table系列: JS组件系列——表格组件神器:bootstrap table JS组件系列——表格组件神器:bootstrap table(二