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下给元素添加事件的方法与代码
Aug 13 Javascript
js利用div背景,做一个竖线的效果。
Nov 22 Javascript
js String对象中常用方法小结(字符串操作)
Jan 27 Javascript
jquery.pagination.js 无刷新分页实现步骤分享
May 23 Javascript
JS父页面与子页面相互传值方法
Mar 05 Javascript
js与C#进行时间戳转换
Nov 14 Javascript
javascript实现的固定位置悬浮窗口实例
Apr 30 Javascript
jQuery插件学习教程之SlidesJs轮播+Validation验证
Jul 12 Javascript
原生js编写2048小游戏
Mar 17 Javascript
浅析Angular2子模块以及异步加载
Apr 24 Javascript
input file样式修改以及图片预览删除功能详细概括(推荐)
Aug 17 Javascript
Vue中对拿到的数据进行A-Z排序的实例
Sep 25 Javascript
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中的内存管理问题
2011/08/31 PHP
PHP中spl_autoload_register函数的用法总结
2013/11/07 PHP
thinkphp微信开发(消息加密解密)
2015/12/02 PHP
js ondocumentready onmouseover onclick onmouseout 样式
2010/07/22 Javascript
js关于精确计算和数值格式化以及直接引js文件
2014/01/28 Javascript
jQuery中事件对象e的事件冒泡用法示例介绍
2014/04/25 Javascript
jQuery 中DOM 操作详解
2015/01/13 Javascript
jQuery Form 表单提交插件之formSerialize,fieldSerialize,fieldValue,resetForm,clearForm,clearFields的应用
2016/01/23 Javascript
Vue.js 2.0 和 React、Augular等其他前端框架大比拼
2016/10/08 Javascript
解决layUI的页面显示不全的问题
2019/09/20 Javascript
jQuery实现轮播图源码
2019/10/23 jQuery
Vue清除定时器setInterval优化方案分享
2020/07/21 Javascript
使用Webpack 搭建 Vue3 开发环境过程详解
2020/07/28 Javascript
[01:06]DOTA2亚洲邀请赛专属珍藏-荧煌之礼
2017/03/24 DOTA
[01:01:52]完美世界DOTA2联赛PWL S2 GXR vs Magma 第二场 11.25
2020/11/26 DOTA
Python中的__slots__示例详解
2017/07/06 Python
Python实现冒泡排序的简单应用示例
2017/12/11 Python
Python将图片转换为字符画的方法
2020/06/16 Python
python traceback捕获并打印异常的方法
2018/08/31 Python
详解Python 解压缩文件
2019/04/09 Python
python中aioysql(异步操作MySQL)的方法
2019/04/11 Python
python实现KNN分类算法
2019/10/16 Python
关于Flask项目无法使用公网IP访问的解决方式
2019/11/19 Python
Python urlencode和unquote函数使用实例解析
2020/03/31 Python
Python实现aes加密解密多种方法解析
2020/05/15 Python
8款使用 CSS3 实现超炫的 Loading(加载)的动画效果
2015/03/17 HTML / CSS
Amaze UI 文件选择域的示例代码
2020/08/26 HTML / CSS
大学生校园创业计划书
2014/02/08 职场文书
婚纱摄影师求职信范文
2014/04/17 职场文书
英语课前三分钟演讲稿(6篇)
2014/09/13 职场文书
党员民主生活会个人整改措施材料
2014/09/16 职场文书
授权委托书样本
2014/09/25 职场文书
县长“四风”对照检查材料思想汇报
2014/10/05 职场文书
2014年办公室主任工作总结
2014/11/12 职场文书
2015年妇产科工作总结
2015/05/18 职场文书
标准演讲稿格式结尾应该怎么书写?
2019/07/17 职场文书