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 相关文章推荐
利用javascript解决图片缩放及其优化的代码
May 23 Javascript
jQuery表格插件ParamQuery简单使用方法示例
Dec 05 Javascript
javascript中文本框中输入法切换的问题
Dec 10 Javascript
兼容主流浏览器的JS复制内容到剪贴板
Dec 12 Javascript
JS实现网页上随机产生超链接地址的方法
Nov 09 Javascript
实例讲解jquery与json的结合
Jan 07 Javascript
jQuery实现点击后高亮背景固定显示的菜单效果【附demo源码下载】
Sep 21 Javascript
最全的JavaScript开发工具列表 总有一款适合你
Jun 29 Javascript
protractor的安装与基本使用教程
Jul 07 Javascript
基于vue-cli配置lib-flexible + rem实现移动端自适应
Dec 26 Javascript
vuex state及mapState的基础用法详解
Apr 19 Javascript
bootstrap-table后端分页功能完整实例
Jun 01 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递归遍历指定目录的文件并统计文件数量的方法
2015/03/24 PHP
javascript实现二分查找法实现代码
2007/11/12 Javascript
jquery下异步提交表单 异步跨域提交表单
2010/11/17 Javascript
一些主流JS框架中DOMReady事件的实现小结
2011/02/12 Javascript
javascript实现数字+字母验证码的简单实例
2014/02/10 Javascript
jquery实现省市select下拉框的替换(示例代码)
2014/02/22 Javascript
nodejs中转换URL字符串与查询字符串详解
2014/11/26 NodeJs
JavaScript对象反射用法实例
2015/04/17 Javascript
基于jQuery实现Ajax验证用户名是否存在实例
2016/03/30 Javascript
浅析JavaScriptSerializer类的序列化与反序列化
2016/11/22 Javascript
基于slideout.js实现移动端侧边栏滑动特效
2016/11/28 Javascript
angular写一个列表的选择全选交互组件的示例
2018/01/22 Javascript
angularjs实现table增加tr的方法
2018/02/27 Javascript
解决iview打包时UglifyJs报错的问题
2018/03/07 Javascript
Babel 入门教程学习笔记
2018/06/13 Javascript
Javascript前端下载后台传来的文件流代码实例
2020/08/18 Javascript
Python实现简单多线程任务队列
2016/02/27 Python
Python数据分析中Groupby用法之通过字典或Series进行分组的实例
2017/12/08 Python
python正则表达式实例代码
2020/03/03 Python
Python通过4种方式实现进程数据通信
2020/03/12 Python
python3 配置logging日志类的操作
2020/04/08 Python
VScode连接远程服务器上的jupyter notebook的实现
2020/04/23 Python
Python求区间正整数内所有素数之和的方法实例
2020/10/13 Python
python中lower函数实现方法及用法讲解
2020/12/23 Python
10分钟理解CSS3 Grid布局
2018/12/20 HTML / CSS
Booking.com西班牙:全球酒店预订
2018/03/30 全球购物
SQL Server笔试题
2012/01/10 面试题
办公室副主任岗位职责
2013/11/25 职场文书
小学作文评语大全
2014/04/21 职场文书
主要负责人任命书
2014/06/06 职场文书
2014年银行柜员工作总结
2014/11/12 职场文书
2014年减负工作总结
2014/12/10 职场文书
告诉你一个秘密:富人致富的五大优点
2019/07/11 职场文书
详解Javascript实践中的命令模式
2021/05/05 Javascript
教你解决往mysql数据库中存入汉字报错的方法
2021/05/06 MySQL
vue实现Toast组件轻提示
2022/04/10 Vue.js