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 相关文章推荐
如何在标题栏显示框架内页面的标题
Feb 03 Javascript
用简洁的jQuery方法toggleClass实现隔行换色
Oct 22 Javascript
原生javascript实现DIV拖拽并计算重复面积
Jan 02 Javascript
jquery实现点击展开列表同时隐藏其他列表
Aug 10 Javascript
jQuery中bind(),live(),delegate(),on()绑定事件方法实例详解
Jan 19 Javascript
jQuery解析json格式数据简单实例
Jan 22 Javascript
详解vue服务端渲染(SSR)初探
Jun 19 Javascript
js中split()方法得到的数组长度问题
Jul 19 Javascript
微信小程序支付PHP代码
Aug 23 Javascript
详解vue-cli3多页应用改造
Jun 04 Javascript
vue.js循环radio的实例
Nov 07 Javascript
详解微信小程序(Taro)手动埋点和自动埋点的实现
Mar 02 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
写一个用户在线显示的程序
2006/10/09 PHP
可以在线执行PHP代码包装修正版
2008/03/15 PHP
PHP+swoole实现简单多人在线聊天群发
2016/01/19 PHP
php安装扩展mysqli的实现步骤及报错解决办法
2017/09/23 PHP
自写的利用PDO对mysql数据库增删改查操作类
2018/02/19 PHP
PHP使用CURL实现下载文件功能示例
2019/06/03 PHP
打开超链需要“确认”对话框的方法
2007/03/08 Javascript
JavaScript DOM学习第八章 表单错误提示
2010/02/19 Javascript
让jQuery与其他JavaScript库并存避免冲突的方法
2013/12/23 Javascript
引用其它js时如何同时处理多个window.onload事件
2014/09/02 Javascript
bootstrap datepicker限定可选时间范围实现方法
2016/09/28 Javascript
使用Angular.js开发的注意事项
2016/10/19 Javascript
nodejs个人博客开发第七步 后台登陆
2017/04/12 NodeJs
angularjs指令之绑定策略(@、=、&amp;)
2017/04/13 Javascript
p5.js入门教程之平滑过渡(Easing)
2018/03/16 Javascript
解决Vue.js父组件$on无法监听子组件$emit触发事件的问题
2018/09/12 Javascript
多个vue子路由文件自动化合并的方法
2019/09/03 Javascript
如何在postman测试用例中实现断言过程解析
2020/07/09 Javascript
[02:10]三分钟回顾完美世界城市挑战赛
2019/01/24 DOTA
Python操作列表之List.insert()方法的使用
2015/05/20 Python
Python函数式编程
2017/07/20 Python
python中从str中提取元素到list以及将list转换为str的方法
2018/06/26 Python
利用Python实现原创工具的Logo与Help
2018/12/03 Python
详解pandas使用drop_duplicates去除DataFrame重复项参数
2019/08/01 Python
python使用beautifulsoup4爬取酷狗音乐代码实例
2019/12/04 Python
如何基于python对接钉钉并获取access_token
2020/04/21 Python
关于Keras Dense层整理
2020/05/21 Python
简单的Python人脸识别系统
2020/07/14 Python
python自动打开浏览器下载zip并提取内容写入excel
2021/01/04 Python
建议书的格式
2014/05/12 职场文书
羽毛球比赛策划方案
2014/06/13 职场文书
一份关于丢失公司财物的检讨书
2014/09/19 职场文书
交通事故委托书范本精选
2014/10/04 职场文书
夫妻双方自愿离婚协议书
2014/10/24 职场文书
2015高三毕业寄语赠言
2015/02/27 职场文书
导游词之澳门玫瑰圣母堂
2019/12/03 职场文书