VUE element-ui 写个复用Table组件的示例代码


Posted in Javascript onNovember 18, 2017

饿了么的table组件功能很强大,对于项目中的各种表格基本够用,但是……个人对于它以列为单位的操作不习惯 =。=所以改成了另一种方式(我不会告诉你其实本质没变)。

项目中表格较多,所以复用性最重要

步骤一

先来个基本的表格展示

官例的tableData

tableData: [{
 date: '2016-05-02',
 name: '王小虎',
 address: '上海市普陀区金沙江路 1518 弄'
}, {
 date: '2016-05-04',
 name: '王小虎',
 address: '上海市普陀区金沙江路 1517 弄'
}, {
 date: '2016-05-01',
 name: '王小虎',
 address: '上海市普陀区金沙江路 1519 弄'
}, {
 date: '2016-05-03',
 name: '王小虎',
 address: '上海市普陀区金沙江路 1516 弄'
}]

table.vue

<template>
 <el-table :data="tableData" border>
  <el-table-column prop="date" label="日期"></el-table-column>
  <el-table-column prop="name" label="姓名"></el-table-column>
  <el-table-column prop="address" label="地址"></el-table-column>
 </el-table>
</template>

步骤二

简化一下表格:

//table.vue
<template>
 <el-table :data="tableData" border>
  <el-table-column v-for="(item,key) in tableKey" 
  :key="key"
  :prop="item.value"
  :label="item.name"></el-table-column>
 </el-table>
</template>
<script>
export default{
 name: 'table',
 data(){
  return{
   tableData:[...],
   tableKey: [{
    name: 'date',
    value: '日期'
   },{
    name: '姓名',
    value: 'name'
   },{
    name: '地址',
    value: 'address'
   }]
  }
 }
}
</script>

步骤三

复用table.vue就是————给它数据的同时告诉它我的字段名呗

新建一个父组件sl_table.vue

//sl_table.vue
<template>
 <sl-table :tableData="tableData" :tableKey="tableKey"></sl-table>
</template>
<script>
import Table from '@/components/table'
export default{
 name: 'sl-table',
 data(){
  return {
   tableData: [...]
   tableKey: [{
    name: 'date',
    value: '日期'
   },{
    name: '姓名',
    value: 'name'
   },{
    name: '地址',
    value: 'address'
   }]
  }
 },
 components: {
  'sl-table': Table
 }
}
</script>

table.vue就更简单了

//table.vue
<template>
 <el-table :data="tableData" border>
  <el-table-column v-for="(item,key) in tableKey" 
  :key="key"
  :prop="item.value"
  :label="item.name"></el-table-column>
 </el-table>
</template>
<script>
export default{
 name: 'table',
 data(){
  return{
   
  }
 },
 props:['tableData','tableKey'],
}
</script>

步骤四

可以根据需求修改table的形式

列宽度

这个较为简单,可以直接加个属性

//sl_table.vue
...
 data(){
  return {
   tableData: [...]
   tableKey: [{
    name: 'date',
    value: '日期',
    width: 80
   },{
    name: '姓名',
    value: 'name',
    width: 80
   },{
    name: '地址',
    value: 'address'
   }]
  }
 },
...

table.vue

//table.vue
...
<el-table-column v-for="(item,key) in tableKey" 
:key="key"
:prop="item.value"
:label="item.name"
:width="item.width"></el-table-column>
...

自定义模板列

如果我们需要告诉组件哪个是自定义的列,所以添加一个属性operate

table.vue

<el-table-column v-for="(item,key) in tableKey" 
v-if="!item.operate"
:key="key"
:prop="item.value"
:label="item.name"
:width="item.width"></el-table-column>

<!-- 自定义 -->
<el-table-column v-else>
 <template scope="scope">
  <slot :name="item.value" :$index="scope.$index" :row="scope.row"></slot>
 </template>
</el-table-column>
//sl_table.vue
<sl-table :tableData="tableData" :tableKey="tableKey">
 <template slot="date" scope="scope">
  <span>{{ scope.row.date | DateFilter }}</span>
 </template>
</sl-table>
...
  data(){
   return {
    tableData: [...]
    tableKey: [{
     name: 'date',
     value: '日期',
     operate: true
    },{
     name: '姓名',
     value: 'name',
     operate: false
    },{
     name: '地址',
     value: 'address',
     operate: false
    }]
   }
  },
  filters: {
   DateFilter(){...}
  }
...

表格展开行

类似宽度,只要sl_table.vue传入一个isExpand的属性。这里加个每次只能展开一行的效果:

//sl_table.vue

<sl-table :tableData="tableData" :tableKey="tableKey" :isExpand="true" :isExpandOnly="true">
 <template slot="expand" scope="scope">
  {{...expand something}}
 </template>
 ...
</sl-table>

table.vue

//table.vue
<el-table :data="tableData" border @expand="handleExpand" ref="raw_table">
 <el-table-column v-if="isExpand" type="expand">
  <template scope="scope">
   <slot name="expand" :$index="scope.$index" :row="scope.row"></slot>
  </template>
 </el-table-column>
</el-table>
...
props: ['tableData','tableKey','isExpand','isExpandOnly'],
methods: {
 handleExpand(row,is_expand){
  if(this.isExpand && this.isExpandOnly){
   this.$refs.raw_table.store.states.expandRows = expanded ? [row] : [] 
  }
 }
}

其他的(排序、多选)操作也是类似添加。。。多不赘述。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
多浏览器兼容的获取元素和鼠标的位置的js代码
Dec 15 Javascript
简单实现兼容各大浏览器的js复制内容到剪切板
Sep 09 Javascript
jquery如何获取元素的滚动条高度等实现代码
Oct 19 Javascript
基于jQuery的AJAX和JSON实现纯html数据模板
Aug 09 Javascript
Angular JS数据的双向绑定详解及实例
Dec 31 Javascript
老生常谈js数据类型
Aug 03 Javascript
html中通过JS获取JSON数据并加载的方法
Nov 30 Javascript
JavaScript实现连连看连线算法
Jan 05 Javascript
9102了,你还不会移动端真机调试吗
Mar 25 Javascript
微信小程序云开发使用方法新手初体验
May 16 Javascript
JS实现基本的网页计算器功能示例
Jan 16 Javascript
uniapp开发小程序的经验总结
Apr 08 Javascript
jQuery实现checkbox的简单操作
Nov 18 #jQuery
浅谈Emergence.js 检测元素可见性的 js 插件
Nov 18 #Javascript
基于jquery实现五星好评
Nov 18 #jQuery
基于JavaScript实现五子棋游戏
Aug 26 #Javascript
JavaScript canvas实现围绕旋转动画
Nov 18 #Javascript
Vue2.0设置全局样式(less/sass和css)
Nov 18 #Javascript
五步轻松实现JavaScript HTML时钟效果
Mar 25 #Javascript
You might like
php学习笔记 面向对象的构造与析构方法
2011/06/13 PHP
php压缩HTML函数轻松实现压缩html/js/Css及注意事项
2013/01/27 PHP
PHP+jQuery 注册模块开发详解
2014/10/14 PHP
php实现倒计时效果
2015/12/19 PHP
smarty学习笔记之常见代码段用法总结
2016/03/19 PHP
php有效防止图片盗用、盗链的两种方法
2016/11/01 PHP
Node.js开发指南中的简单实例(mysql版)
2013/09/17 Javascript
JavaScript中访问节点对象的方法有哪些如何使用
2013/09/24 Javascript
JS中如何设置readOnly的值
2013/12/25 Javascript
Jquery Uploadify上传带进度条的简单实例
2014/02/12 Javascript
javascript转换日期字符串为Date日期对象的方法
2015/02/13 Javascript
javascript使用递归算法求两个数字组合功能示例
2017/01/03 Javascript
再谈Angular4 脏值检测(性能优化)
2018/04/23 Javascript
vue-router history模式下的微信分享小结
2018/07/05 Javascript
ionic使用angularjs表单验证(模板验证)
2018/12/12 Javascript
vue添加class样式实例讲解
2019/02/12 Javascript
Nuxt.js nuxt-link与router-link的区别说明
2020/11/06 Javascript
[37:02]OG vs INfamous 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/17 DOTA
Python编程实现二叉树及七种遍历方法详解
2017/06/02 Python
Python实现的桶排序算法示例
2017/11/29 Python
Python计算一个给定时间点前一个月和后一个月第一天的方法
2018/05/29 Python
selenium + python 获取table数据的示例讲解
2018/10/13 Python
Python面向对象之类的定义与继承用法示例
2019/01/14 Python
Python目录和文件处理总结详解
2019/09/02 Python
python实现两个字典合并,两个list合并
2019/12/02 Python
The Outnet亚太地区:折扣设计师时装店
2019/12/05 全球购物
垃圾回收的优点和原理。并考虑2种回收机制
2016/10/16 面试题
护理自荐信范文
2013/10/05 职场文书
办理护照介绍信
2014/01/16 职场文书
高三体育教学反思
2014/01/29 职场文书
医学生自我鉴定范文
2014/03/26 职场文书
入党函调证明材料
2015/06/19 职场文书
监护人证明
2015/06/19 职场文书
python opencv人脸识别考勤系统的完整源码
2021/04/26 Python
总结高并发下Nginx性能如何优化
2021/11/01 Servers
python超详细实现完整学生成绩管理系统
2022/03/17 Python