vue项目中将element-ui table表格写成组件的实现代码


Posted in Javascript onJune 12, 2019

表格中我们经常需要动态加载数据, 如果有多个页面都需要用到表格, 那我希望可以有个组件, 只传数据过去显示, 不用每个页面都去写这么一段内容:

<el-table :data="tableData" border size="mini" fit highlight-current-row height="500">
  <el-table-column type="index" align="center" fixed></el-table-column>
  <el-table-column prop="DHM" min-width="140px" label="时间" align="center"></el-table-column>
  <el-table-column prop="PLAZANO" min-width="100px" label="编码" align="center"></el-table-column>
  <el-table-column prop="PLAZANAME" min-width="100px" label="名称" align="center"></el-table-column>
  <el-table-column prop="CAR_PLATE" label="号码" align="center"></el-table-column>
  <el-table-column prop="CARD_NO" min-width="120px" label="卡号" align="center"></el-table-column>
  <el-table-column prop="DATATYPE" label="数据类型" align="center" :formatter="formatDATATYPE"></el-table-column>
  <el-table-column prop="STAFFNAME" min-width="100px" label="姓名" align="center"></el-table-column>
  <el-table-column prop="MEDIATYPE" label="付款方式" align="center"></el-table-column>
  <el-table-column prop="COMP_CASH" label="计算费额" align="center"></el-table-column>
  <el-table-column prop="FACT_CASH" label="实收费额" align="center"></el-table-column>
  <el-table-column label="操作" min-width="140px" align="center">
    <template slot-scope="scope">
     <el-button @click="handleClick(scope.row)" type="text" size="small">查看</el-button>
     <el-button type="text" size="small">编辑</el-button>
    </template>
  </el-table-column>
</el-table>

 上面这段代码是一个element-ui中tabele表格的形式,这里表头都是已经固定的, 如果每个页面都写上这么一段, 不同的是表头名字和字段,这样子就有点重复,而且页面的篇幅也就比较大了,于是把这块写成一个组件, 每个页面引入这个组件, 再传入数据。

1.  表格组件:

•首先  table.vue 组件可以这样写:

<el-table :data="tableData" border size="mini" fit highlight-current-row height="500" :row-style="rowStyle" @row-dblclick="rowDblclick"
   v-loading="loading"
   element-loading-text="拼命加载中"
   element-loading-spinner="el-icon-loading"
   element-loading-background="rgba(0, 0, 0, 0.3)">
   <el-table-column type="index" align="center" fixed></el-table-column>
   <!-- prop: 字段名name, label: 展示的名称, fixed: 是否需要固定(left, right), minWidth: 设置列的最小宽度(不传默认值), oper: 是否有操作列
      oper.name: 操作列字段名称, oper.clickFun: 操作列点击事件, formatData: 格式化内容 -->
   <el-table-column v-for="(th, key) in tableHeader"
    :key="key"
    :prop="th.prop"
    :label="th.label"
    :fixed="th.fixed"
    :min-width="th.minWidth" align="center">
     <!-- 加入template主要是有操作一栏, 操作一栏的内容是相同的, 数据不是动态获取的,不过我这里操作一栏的名字定死了(oper表示是操作这一列,否则就不是) -->
     <template slot-scope="scope">
      <div v-if="th.oper">
       <el-button v-for="(o, key) in th.oper" :key="key" @click="o.clickFun(scope.row)" type="text" size="small">{{o.name}}</el-button>
      </div>
      <div v-else>
       <span v-if="!th.formatData">{{ scope.row[th.prop] }}</span>
       <span v-else>{{ scope.row[th.prop] | formatters(th.formatData) }}</span>
      </div>
     </template>
   </el-table-column>
</el-table>
// 这里是传入的数据 
props: {
  tableData: {
   type: Array,
   default: function () {
    return []
   }
  },
  rowDblclick: {
   type: Function,
   default: (row, event, column) => { console.log('default: ' + row + '---' + event + '---' + column) }
  },
  tableHeader: {
   type: Array,
   default: function () {
    return []
   }
  },
  loading: {
   type: Boolean,
   default: false
  }
 },

• 然后在其他组件中就可以引入table组件, 将数据传给table显示

<table :tableData="tableData" :rowDblclick="rowDblclick" :tableHeader="tableHeader" :loading="loading"></table>

    其中 tableData是表格中要显示的数据内容, 这个内容我的是从后台查询出来的, rowDblclick 是双击一行做的操作,如果不需要可以删除, tableHeader 是表头显示的数据, loading 是表格加载的loading方式, 默认是没有的

表头数据格式如下: formatData 是表格里面的数据需要做处理的方法, oper是操作列,查看和编辑是两个按钮,handleClick和editClick点击按钮的方法, 自行补充。

export const tableHeader = [ // 表头数据
 { prop: 'dhm', label: '时间', minWidth: '140px' },
 { prop: 'plazano', label: '编码', minWidth: '100px' },
 { prop: 'plazano', label: '名称', minWidth: '100px', formatData: val => store.getters.allPlazano2Map.get(val) },
 { prop: 'car_plate', label: '号码' },
 { prop: 'card_no', label: '卡号', minWidth: "120px" },
 { prop: 'laneno', label: '数据类型', formatData: function(val) { return val.substr(2, 1) == '1' ? '出口' : '入口' } },
 { prop: 'staffname', label: '姓名', minWidth: '100px' },
 { prop: 'mediatype', label: '付款方式' },
 { prop: 'comp_cash', label: '计算费额' },
 { prop: 'fact_cash', label: '实收费额' },
 { prop: 'oper', label: '操作', fixed: 'right', minWidth: '140px',
  oper: [
   { name: '查看', clickFun: handleClick },
   { name: '编辑', clickFun: editClick }
  ]
 }
]

现在的代码可能会报错, 下面这处的代码是在全局注册了一个过滤器,如果不注册就找不到这个方法就会报错,所以还需要注册一个全局过滤器,如果你不需要对数据做处理可以不要这个过滤器

vue项目中将element-ui table表格写成组件的实现代码

2.  注册全局过滤器, 我的是这样写的, 先新建个文件 filter.js 然后在里面写个方法, export 出去

export function formatters(val, format) {
  if (typeof (format) === 'function') {
   return format(val)
  } else return val
}

然后再在main.js中引入进来注册全局的过滤器:

import * as filters from './filters'
Object.keys(filters).forEach(key => {
  Vue.filter(key, filters[key])
})

这个在每个页面就都可以使用 formatters 这个过滤器方法了, 不过具体的过滤方法是由 format 这个参数传进去的, 这里主要是因为不同的数据过滤的方法不一样, 所以在表头传数据的时候就一并写上处理数据的方法

vue项目中将element-ui table表格写成组件的实现代码

如果很多地方都使用了同一个方法, 可以将这个方法注册成全局方法, 那么在每个页面就可以直接使用该方法, 不用重复去写。

3.   注册全局方法

建立个js 文件(我的文件名为validate.js), 写入该方法, 这里使用 exports.install 注册全局方法,挂载到vue原型上

exports.install = (Vue, options) => {
 Vue.prototype.validator = {
  lanenoTransf(val) { return val.substr(2, 1) == '1' ? '出口' : '入口' }
 }
}

 

然后在main.js中引入

import validator from '@/utils/validate'
Vue.use(validator)

最后页面上就可以直接使用

{ prop: 'laneno', label: '数据类型', formatData: this.lanenoTransf },

最最后, 看我的表格:

vue项目中将element-ui table表格写成组件的实现代码

总结

以上所述是小编给大家介绍的vue项目中将element-ui table表格写成组件的实现代码 ,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Javascript 相关文章推荐
关于javascript中this关键字(翻译+自我理解)
Oct 20 Javascript
jQuery 定时局部刷新(setInterval)
Nov 19 Javascript
15款优秀的jQuery导航菜单插件分享
Jul 19 Javascript
js转义字符介绍
Nov 05 Javascript
js获取对象、数组的实际长度,元素实际个数的实现代码
Jun 08 Javascript
seajs学习之模块的依赖加载及模块API的导出
Oct 20 Javascript
JS取数字小数点后两位或n位的简单方法
Oct 24 Javascript
Vue路由跳转问题记录详解
Jun 15 Javascript
Node.js readline 逐行读取、写入文件内容的示例
Mar 01 Javascript
js实现input密码框显示/隐藏功能
Sep 10 Javascript
如何基于原生javaScript生成带图片的二维码
Nov 21 Javascript
一起来看看Vue的核心原理剖析
Mar 24 Vue.js
React 全自动数据表格组件——BodeGrid的实现思路
Jun 12 #Javascript
详解如何提升JSON.stringify()的性能
Jun 12 #Javascript
基于vue-cli搭建多模块且各模块独立打包的项目
Jun 12 #Javascript
浅谈webpack 四个核心概念之Entry
Jun 12 #Javascript
vue安装遇到的5个报错及解决方法
Jun 12 #Javascript
深入学习JavaScript 高阶函数
Jun 11 #Javascript
javascript防抖函数debounce详解
Jun 11 #Javascript
You might like
PHP中GET变量的使用
2006/10/09 PHP
Discuz 模板语句分析及知识技巧
2009/08/21 PHP
PHP获取音频文件的相关信息
2015/06/22 PHP
php实现简单爬虫的开发
2016/03/28 PHP
Javascript图像处理—平滑处理实现原理
2012/12/28 Javascript
jQuery动画效果animate和scrollTop结合使用实例
2014/04/02 Javascript
jquery鼠标放上去显示悬浮层即弹出定位的div层
2014/04/25 Javascript
简介JavaScript中的setHours()方法的使用
2015/06/11 Javascript
Node.js中Request模块处理HTTP协议请求的基本使用教程
2016/03/31 Javascript
一个字符串中出现次数最多的字符 统计这个次数【实现代码】
2016/04/29 Javascript
深入浅析JS的数组遍历方法(推荐)
2016/06/15 Javascript
JS简单获取客户端IP地址的方法【调用搜狐接口】
2016/09/05 Javascript
最原始的jQuery注册验证方式
2016/10/11 Javascript
浅谈JavaScript的函数及作用域
2016/12/30 Javascript
canvas绘图不清晰的解决方案
2017/02/28 Javascript
JS ES6中setTimeout函数的执行上下文示例
2017/04/27 Javascript
Javascript实现页面滚动时导航智能定位
2017/05/06 Javascript
js实现图片上传预览原理分析
2017/07/13 Javascript
node文件批量重命名的方法示例
2017/10/23 Javascript
JS获取子节点、父节点和兄弟节点的方法实例总结
2018/07/06 Javascript
Cookbook组件形式:优化 Vue 组件的运行时性能
2018/11/25 Javascript
使用webpack4编译并压缩ES6代码的方法示例
2019/04/24 Javascript
一条命令解决mac版本python IDLE不能输入中文问题
2018/05/15 Python
Python实现ping指定IP的示例
2018/06/04 Python
Python基于DB-API操作MySQL数据库过程解析
2020/04/23 Python
python使用建议技巧分享(三)
2020/08/18 Python
python将下载到本地m3u8视频合成MP4的代码详解
2020/11/24 Python
Html5 webRTC简单实现视频调用的示例代码
2020/09/23 HTML / CSS
日本即尚网:JSHOPPERS.com(支持中文)
2019/12/03 全球购物
internal修饰符起什么作用
2013/12/16 面试题
如何利用XMLHTTP检测URL及探测服务器信息
2013/11/10 面试题
将相和教学反思
2014/02/04 职场文书
小学生操行评语大全
2014/04/22 职场文书
农民工预备党员思想汇报
2014/09/14 职场文书
SQL Server2019数据库之简单子查询的具有方法
2021/04/27 SQL Server
聊聊mysql都有哪几种分区方式
2022/04/13 MySQL