后台系统,table被用的次数比较多,所以决定提出来作为组件

1.新建一个Table.vue文件

  1. <!--region 封装的分页 table-->
  2. <template>
  3.  <div class="table">
  4.  <el-table id="iTable" v-loading.iTable="options.loading" :data="list" :stripe="options.stripe"
  5.     ref="mutipleTable"
  6.     @selection-change="handleSelectionChange">
  7.   <!--region 选择框-->
  8.   <el-table-column v-if="options.mutiSelect" type="selection" style="width: 55px;">
  9.   </el-table-column>
  10.   <!--endregion-->
  11.   <!--region 数据列-->
  12.   <template v-for="(column, index) in columns">
  13.   <el-table-column :prop="column.prop"
  14. :key='column.label'
  15.        :label="column.label"
  16.        :align="column.align"
  17.        :width="column.width">
  18.    <template slot-scope="scope">
  19.    <template v-if="!column.render">
  20.     <template v-if="column.formatter">
  21.     <span v-html="column.formatter(scope.row, column)"></span>
  22.     </template>
  23.     <template v-else>
  24.     <span>{{scope.row[column.prop]}}</span>
  25.     </template>
  26.    </template>
  27.    <template v-else>
  28.     <expand-dom :column="column" :row="scope.row" :render="column.render" :index="index"></expand-dom>
  29.    </template>
  30.    </template>
  31.   </el-table-column>
  32.   </template>
  33.   <!--endregion-->
  34.   <!--region 按钮操作组-->
  35.   <el-table-column ref="fixedColumn" label="操作" align="center" :width="operates.width" :fixed="operates.fixed"
  36.       v-if="operates.list.filter(_x=>_x.show === true).length > 0">
  37.   <template slot-scope="scope">
  38.    <div class="operate-group">
  39.    <template v-for="(btn, key) in operates.list">
  40.     <div class="item" v-if="btn.show" :key='btn.id'>
  41.     <el-button :type="btn.type" size="mini" :icon="btn.icon" :disabled="btn.disabled"
  42.        :plain="btn.plain" @click.native.prevent="btn.method(key,scope.row)">{{ btn.label }}
  43.     </el-button>
  44.     </div>
  45.    </template>
  46.    </div>
  47.   </template>
  48.   </el-table-column>
  49.   <!--endregion-->
  50.  </el-table>
  51.  
  52.  </div>
  53. </template>
  54. <!--endregion-->
  55. <script>
  56.  export default {
  57.  props: {
  58.   list: {
  59.   type: Array,
  60.   default: []
  61.   }, // 数据列表
  62. columns: {
  63.   type: Array,
  64.   default: []
  65.   }, // 需要展示的列 === prop:列数据对应的属性,label:列名,align:对齐方式,width:列宽
  66.   operates: {}, // 操作按钮组 === label: 文本,type :类型(primary / success / warning / danger / info / text),show:是否显示,icon:按钮图标,plain:是否朴素按钮,disabled:是否禁用,method:回调方法
  67.   options: {
  68.   type: Object,
  69.   default: {
  70.    stripe: false, // 是否为斑马纹 table
  71.    highlightCurrentRow: false // 是否要高亮当前行
  72.   },
  73.   } // table 表格的控制参数
  74.  },
  75. //组件
  76.  components: {
  77.   expandDom: {
  78.   functional: true,
  79.   props: {
  80.    row: Object,
  81.    render: Function,
  82.    index: Number,
  83.    column: {
  84.    type: Object,
  85.    default: null
  86.    }
  87.    },
  88.   render: (h, ctx) => {
  89.    const params = {
  90.    row: ctx.props.row,
  91.    index: ctx.props.index
  92.   }
  93.    if (ctx.props.column) params.column = ctx.props.column
  94.     return ctx.props.render(h, params)
  95.   }
  96.   }
  97.  },
  98. // 数据
  99.  data () {
  100.   return {
  101.   pageIndex: 1,
  102.   multipleSelection: [] // 多行选中
  103.   }
  104.  },
  105.  mounted () {
  106.  },
  107.  computed: {
  108.  },
  109.  methods: {
  110.  
  111.   // 多行选中
  112.   handleSelectionChange (val) {
  113.   this.multipleSelection = val
  114.   this.$emit('handleSelectionChange', val)
  115.   },
  116.   // 显示 表格操作弹窗
  117.   showActionTableDialog () {
  118. console.log(4444)
  119.   this.$emit('handelAction')
  120.   }
  121.  }
  122.  }
  123. </script>
  124. <style lang="scss" >
  125.  
  126. </style>

 2.调用组件

  1. <template>
  2.  <div class="table-page">
  3.  <i-table :list="list"
  4. @handleSelectionChange="handleSelectionChange"
  5.     :options="options"
  6.     :columns="columns"
  7.     :operates="operates"
  8.   >
  9.  </i-table>
  10.  </div>
  11. </template>
  12. <script>
  13.  import iTable from '../components/Table'
  14.  export default {
  15.   components: {iTable},
  16.   data () {
  17.    return {
  18.     list: [
  19.      {
  20. id: '24',
  21. title: '编号3',
  22. state:0
  23.       },
  24.      {
  25. id: '23',
  26. title: '编号3',
  27. state:1
  28.       },
  29.      {
  30. id: '23',
  31. title: '编号3',
  32. state:2
  33.       },
  34.      {
  35. id: '2',
  36. title: '编号3',
  37. state:0
  38.       },
  39.      {
  40. id: '223',
  41. title: '编号3',
  42. state:1
  43.       },
  44.      {
  45. id: '2444',
  46. title: '编号3',
  47. state:1
  48.       },
  49. ], // table数据
  50.     options: {
  51.      stripe: true, // 是否为斑马纹 table
  52.      loading: false, // 是否添加表格loading加载动画
  53.      highlightCurrentRow: true, // 是否支持当前行高亮显示
  54.      mutiSelect: true, // 是否支持列表项选中功能
  55.     }, // table 的参数
  56.     columns: [
  57.      {
  58.       prop: 'id',
  59.       label: '编号',
  60.       align: 'center',
  61.      },
  62.      {
  63.       prop: 'title',
  64.       label: '标题',
  65.       align: 'center',
  66.       formatter: (row, column, cellValue) => {
  67.        return `<span style="white-space: nowrap;color: dodgerblue;">${row.title}</span>`
  68.       }
  69.      },
  70.      {
  71.       prop: 'state',
  72.       label: '状态',
  73.       align: 'center',
  74.       render: (h, params) => {
  75.        return h('el-tag', {
  76.        props: {type: params.row.state === 0 ? 'success' : params.row.state === 1 ? 'info' : 'danger'} // 组件的props
  77.        }, params.row.state === 0 ? '上架' : params.row.state === 1 ? '下架' : '审核中')
  78.       }
  79.      },
  80.  
  81.     ], // 需要展示的列
  82.     operates: {
  83.      width: 200,
  84.      fixed: 'right',
  85.      list: [
  86.       {
  87. id:'1',
  88.        label: '编辑',
  89.        type: 'warning',
  90.        show: true,
  91.        icon: 'el-icon-edit',
  92.        plain: true,
  93.        disabled: false,
  94.        method: (index, row) => {
  95.         this.handleEdit(index, row)
  96.        }
  97.       },
  98.       {
  99. id:'2',
  100.        label: '删除',
  101.        type: 'danger',
  102.        icon: 'el-icon-delete',
  103.        show: true,
  104.        plain: false,
  105.        disabled: false,
  106.        method: (index, row) => {
  107.         this.handleDel(index, row)
  108.        }
  109.       }
  110.      ]
  111.     } // 列操作按钮
  112.    }
  113.   },
  114.   methods: {
  115.    // 选中行
  116.    handleSelectionChange (val) {
  117.     console.log('val:', val)
  118.    },
  119.    // 编辑
  120.    handleEdit (index, row) {
  121.     console.log(' index:', index)
  122.     console.log(' row:', row)
  123.    },
  124.    // 删除
  125.    handleDel (index, row) {
  126.     console.log(' index:', index)
  127.     console.log(' row:', row)
  128.    }
  129.   }
  130.  }
  131. </script>

  https://juejin.im/post/5a6941dc518825732258e321

vue封装element中table组件的更多相关文章

  1. Vue. 之 Element获取table中选中的行

    Vue. 之 Element获取table中选中的行 问题描述: 如下截图,在Table中选择数据后,然后在点击“统计”按钮,获取Table表中选择的行 解决方案: 1. 给“统计”这个按钮添加一个点 ...

  2. VUE -- 对 Element UI table中数据进行二次处理

    时间——日期 后台经常给我们返回的是 时间戳 (例如:1535620671) 这时候我们页面展现的时候需要将时间戳转换为我们要的格式 例如 (YYYY-MM-DD HH:mm:ss) 如果是在Elem ...

  3. Element UI table组件源码分析

    本文章从如下图所示的最基本的table入手,分析table组件源代码.本人已经对table组件原来的源码进行削减,源码点击这里下载.本文只对重要的代码片段进行讲解,推荐下载代码把项目运行起来,跟着文章 ...

  4. react ,ant Design UI中table组件合并单元格并展开详情的问题

    需求:购物车订单列表,如图: 一:单元格合并 遇到这种你会怎么办呢?  单元格合并?  还是其他的方法? 下面是我的处理方式,就是在table 组件的columns上处理,这里拿商品举例,其余的类似, ...

  5. element ui table组件自定义合计栏,后台给的数据

    合计的数据是后台传的,所以用table组件自定义一行用来合计 <el-table border fit v-loading.body="listLoading" elemen ...

  6. vue封装一个弹框组件

    这是一个提示框和对话框,例:   这是一个组件 eject.vue <template> <div class='kz-cont' v-show='showstate'> &l ...

  7. vue+element ui table组件封装,使用render渲染

    后台管理经常会用到表格,一开始封装了一个常用的功能性表格,点击这里: 后来由于需求增加,在表格中还会用到switch,select,input等多种组件,每次都要在html中增加<el-tabl ...

  8. 纯生js实现Element中input组件的部分功能(慢慢完善)并封装成组件

    现在实现的有基础用法.可清空.密码框,参考链接:https://element.eleme.cn/#/zh-CN/component/input HTML代码:想要测试哪个组件,直接将对应组件解开注释 ...

  9. 普通element ui table组件的使用

    1.使用基础的element ui 的table的基础使用 首先,使用前要先引用element库到项目中,可以直接引入element的js和css或者在vue项目下按需加载不同的组件 废话不多说,直接 ...

随机推荐

  1. Axiso解决跨域访问

    问题: 在项目中需要需要讲本地项目去请求一个URL接口获取数据 例如: 本地请求地址:http://127.0.0.1:19323/site/info.json 请求Url地址:http://www. ...

  2. Java基础学习(2)

    Java基础学习(二) 面向对象 对象:客观存在的事物 面向对象:人具体关注的事物的某些信息 类:是模子,确定对象会拥有的特征(属性)和行为(方法) 对象的属性:对象具有的各种特征 对象的方法:对象能 ...

  3. windows无法安装.net framework 3.5解决方法

    windows server 12r2 或 win10 安装.netframework 3.5方法: 一. 直接在“启用或关闭windows功能”中可以启用,需联网.但是经常会出错,可能安装过程中需要 ...

  4. 使用量产工具合并U盘空间一例

      1.问题提出: 朋友拿到一只别人赠送的广告U盘,上面印刷有产品广告.插入电脑后,在系统的磁盘管理中,显示为两块“硬盘”,其中一块“硬盘”中有广告视频.产品介绍等,占用大概6GB,这块“硬盘”中的这 ...

  5. Netty学习--第一章 JDK自带的BIO

    一.什么是BIO BIO是传统的通信技术,在BIO通信模型中,客户端发送请求给服务器,服务器每次都是会单独创建一个线程来监控客户端的请求,会为每个客户端创建一个线程来处理请求.当前服务器处理完成后,通 ...

  6. uoj280 【UTR #2】题目难度提升 堆维护中位数+set

    题目传送门 http://uoj.ac/problem/280 题解 这道题很妙啊. 这种题目如果给予选手足够的时间,每一个选手应该都能做出来. 大概就是核心思路看上去很简单,但是想要推出来并不简单. ...

  7. 前端之JavaScript:JS之DOM对象一

    js之DOM对象一 一.什么是HTML  DOM HTML  Document Object Model(文档对象模型) HTML DOM 定义了访问和操作HTML文档的标准方法 HTML DOM 把 ...

  8. SOJ 一句话题解整理

    #50 离线+按位考虑 #99 %6拆成%2和%3合并+将图定向为DAG的方案数为 (-1)^n P(-1) #123 储存分数最后求逆元 #124 $\binom{2n}{n}$大概在25的时候就已 ...

  9. java:序列化Serializable 接口

    java:序列化Serializable 接口 public class SerializePerson implements Serializable { private String name; ...

  10. Ldap 从入门到放弃(一)

    OpenLDAP 2.4版本 快速入门 本文内容是自己通过官网文档.网络和相关书籍学习和理解并整理成文档,其中有错误或者疑问请在文章下方留言. 一.Introduction to OpenLDAP D ...