基于element-ui实现table可配置化

写在前面

感谢 饿了么前端团队提供组件化框架elememt-ui,本文基础组件使用element-ui。

大背景

在开发一些系统过程中,使用table作数据展示在所难免。先来看看el-table组件。

非常简单易用的组件,根据提供的data数据,配置table每一列的数据和label。没错,这样似乎都是ok的,但是在开发大量包含table的页面,会发现每次都需要去复制el-table-column,或者你会说你已经很属性element-ui整套框架的文档。然而,重复的代码很多及代码量很大。作为一名程序员,某一天需要写自己已经写过的某段代码,是不是感觉有点不应该呢。。。

数据驱动

<el-table:data="tabledata"><el-table-columnv-for="(item,key) in columnsConfig":key="key":label="item.label":prop="item.prop"></el-table-column>
</el-table>
data () {return {columnsConfig: [{prop: 'logicCategoryId',label: '编号(ID)'}, {prop: 'name',label: '分类名称'}]}
}

这样可以很轻松的渲染出来table。

这里有个小技巧

el-table-column改造下

<el-table:data="tabledata"><el-table-columnv-for="(item,key) in columnsConfig":key="key"v-bind="item">// 这里改造</el-table-column>
</el-table>

v-bind可以绑定一个对象,这样会读取item对象的每个属性,使用到组件当中去。比如增加width: 100,只需要在columnsConfig没一项增加width即可,el-table-column不需要改动。

使用slots怎么办

<el-table-columnlabel="日期"width="120"><template scope="scope">{{ scope.row.date }}</template>
</el-table-column>

很明显,el-table-column的slots配置在columnsConfig数组不能用。 在源码找到解决办法(文件路径:node_modules_element-ui@1.3.7@element-ui\packages\table\src\table-column.js),create钩子函数代码如下:

在this.columnConfig.renderCell函数渲染每一个table cell,如果使用slots会读取,slots中的内容。 编写一个新组件使用vue extends,继承el-table-columns,重写了renderCell函数改变其返回内容,这时候用jsx将内容用return slots的函数传回来。

首先,看看columnsConfig怎么写

columnsConfig: [{cellType: 'slots',// 不是所有的列都需要重写,加个字段标记下prop: 'logicCategoryId',label: '编号(ID)',renderCell: (scope) => {return (<el-button type="text" on-click={() => that.viewGoods(scope.row)}>{ scope.row.productCount }</el-button>)}
}, {prop: 'name',label: '分类名称'
}],

其次,开发新组件 column-plus.vue,代码如下

<script>
import { TableColumn } from 'element-ui'
// renderCell 函数,类型可扩展
const renderCell = {slots: function (h, data) {// 接受传入的renderCell函数let renderCell = () => {return this.renderCell ? this.renderCell(data) : ''}return <div class="cell">{ renderCell(h, data) }</div>}
}
export default {extends: TableColumn,// 继承el-table-columnprops: {prop: {type: [String, Number]},cellType: {type: String,validator: function (value) {let valid = ['text', 'input', 'slots'].includes(value)!valid && console.error(`columnPlus组件不适配 ${value} 类型`)return valid}},renderCell: {type: Function}},// el-table-column 先调用在调用本身的created () {if (renderCell[this.cellType]) {this.columnConfig.renderCell = renderCell[this.cellType].bind(this)}}
}
</script>

最后,组件用通过模板,配置数据即可

<el-table:data="tabledata"><column-plus v-bind="item" v-for="(item,key) in columnConfigs" :key="key"></column-plus>
</el-table>

配置数据

columnsConfig: [{cellType: 'slots',prop: 'logicCategoryId',label: '编号(ID)',renderCell: (scope) => {return (<el-button type="text" on-click={() => that.viewGoods(scope.row)}>{ scope.row.productCount }</el-button>)}
}, {prop: 'name',label: '分类名称'
}]****

写在后面

组件开发实现可配置开发,可达到快速开发的目的和简化代码。 需要说明vue extends和mixins属性,这两个属性都是继承,属性和方法重写,钩子函数是先调用父类在调用自己的,上面的例子(el-table-column 先调用在调用本身的),但是区别是:

  • extends单继承,同时使用优先级高
  • mixins多继承,同时使用优先级低

另外,vue-cli使用jsx编写需要安装三个插件。

  • babel-helper-vue-jsx-merge-props
  • babel-plugin-syntax-jsx
  • babel-plugin-transform-vue-jsx

补充

发布了一天没想到有这么小伙伴阅读,有几点需要补充下。

评论区 @hold 评论更iview如出一辙,后来去翻看iview的文档确实,一直都没用iview开发过,不知道table也是用render来实现的,确实分享之后自己学到了更多,感谢@hold。

这是iview,table组件的代码

render: (h, params) => {return h('div', [h('Button', {props: {type: 'text',size: 'small'}}, 'View'),h('Button', {props: {type: 'text',size: 'small'}}, 'Edit')]);
}

当然使用render之后,需要使用filter,就比较尴尬了。不过,vue的filter其实也是语法糖,最终编译是编译成函数处理。

那如果想使用filter怎么办?

data () {return {columns: [{renderCell: (scope) => {return ({ that.stateTxt(scope.row.state)})}}]}},methods: {stateTxt (val) {}}

写过react都知道是这么干的。

所以,一直以来前端把js写在html中,还是把html写js中,都是争论不休的话题,如何选择还开发自己拿捏。

不使用render代码是这样的

<template><el-table:data="tableData"style="width: 100%"><el-table-columnprop="date"label="日期"width="180"></el-table-column><el-table-columnprop="name"label="姓名"width="180"></el-table-column><el-table-columnprop="address"label="地址"></el-table-column></el-table></template>

使用render处理是这样的

<el-table:data="tabledata"><column-plus v-bind="item" v-for="(item,key) in columnConfigs" :key="key"></column-plus>
</el-table>data () {return {columnConfigs: [{label: '日期',width: '180',prop: 'date'}, {label: '姓名',width: '180',prop: 'name'}, {label: '地址',prop: 'address'}]}
}

更多专业前端知识,请上 【猿2048】www.mk2048.com

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/366564.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

麟龙指标通达信指标公式源码_通达信指标公式源码波段极限副图源码

做价值的传播者&#xff0c;一路同行&#xff0c;一起成长问题&#xff1a;怎样才能每天都收到这类文章&#xff01;答案&#xff1a;只需点击上方《通达信公式指标》{买卖公式}AA:(2*CHIGHLOW)/4;BB:AA-REF(C,12);CC:EMA(BB,13);DD:EMA(CC,2);EE:EMA(BB,34);FF:EMA(BB,55);GG:…

计算机系统备份的原则和策略,计算机系统数据备份机制与策略

计算机系统数据备份机制与策略20年第5 05期华中电力第 l卷 8计算机系统数据备份机制与策略耿煜(樊学院机械系&#xff0c;北襄樊襄湖 4 15 ) 4 03摘要&#xff1a;针对当今计算环境中不断增长的数据量&#xff0c;系统地分析、论述了完整的数据备份机制&#xff0c;出了相应的策…

[译] 帮助你成为一名成功的 Web 开发工程师的 21 步

前言 随着 Web 开发的蓬勃发展&#xff0c;许多人都在问这样一个问题&#xff1a;我如何才能成为一名 Web 开发者&#xff1f;我认为这个问题不应该这样问&#xff0c;而应该是&#xff1a;我如何才能成为一名成功的 Web 开发者&#xff1f;这样的问题是很有必要的&#xff0c;…

循环卷积和周期卷积的关系_基于单口RAM读写的卷积电路(下)

这是迟到很久的卷积电路verilog设计的下篇。。。你看我还有机会吗。。。上回我们给出系统的层次结构、卷积计算模块以及用于数据缓存的fifo模块&#xff0c;今天我们首先回顾一下上一次的关键内容。系统结构回顾RTL代码文件可以分为结构如下所示 ~|--top_conv_tb.v|--top_conv.…

浅析 PHP 中的 Generator

浅析 PHP 中的 Generator Miss Wang php开发案例 前天 何为 Generator 从 PHP 5.5 开始&#xff0c;PHP 加入了一个新的特性&#xff0c;那就是 Generator&#xff0c;中文译为生成器。生成器可以简单地用来实现对象的迭代&#xff0c;让我们先从官方的一个小例子说起。 xrange…

注意安全!XSS 和 XSRF

[Tips] 本文是从 jianshu 平台重新修改编辑后移植来的&#xff0c;比上一版本做了些修订。 最近在看一些关于网络安全的问题&#xff0c;当然许多是跟前端相关的&#xff0c;包括且不局限于xss和xsrf 了&#xff0c;那么小编就结合最近的学习实践谈一些粗浅的认识。&#xff08…

go分析和kegg分析_干货预警:3分钟搞定GO/KEGG功能富集分析(2)

在 3分钟了解GO/KEGG功能富集分析 一文中给大家讲解了GO和KEGG的基本概念和内涵,并且给大家介绍了DAVID这一神奇网站。今天我们就把GO/KEGG功能富集分析的详细教程按部就班地呈现给大家,有请小猎豹。 多图预警,轻点图片,查看高清大图 1 Step1: 打开DAVID官网:https://dav…

如何在本地开发环境调试微信 JS-SDK

以下篇幅将会描述不同前提下对应的调试策略&#xff0c;当然也有可能不是最优解&#xff0c;望斧正 →_→ 前言 何谓「安全域名限制」&#xff1f; 以微信 JS-SDK 的使用为例&#xff0c;每个公众号被限制最多可设置三个安全域名&#xff0c;且必须能被腾讯服务器所验证&#…

云南省农村信用社计算机岗位待遇如何,云南农村信用社薪资待遇如何?

在云南如果去存钱&#xff0c;相信大多数人都会把自己的小钱钱存在农村信用社而不是XX银行。在这一块风景秀丽&#xff0c;人美山美水美的地方&#xff0c;就金融行业来说云南农村信用社要是说自己差&#xff0c;那基本没有谁敢说自己做的好。所以在云南农信社这家企业里做一名…

小票上为啥指甲能划出印_指甲上出现竖纹,除遗传问题,或是身体在向你拉警报了,别忽视...

生活中常见女生给指甲抹上各种不同的颜色来让它变得美美的&#xff0c;指甲起着修饰人的形象的作用。而指甲的状况也能折射出身体的健康状态如何。每个人的指甲形态不一&#xff0c;有的润滑饱满&#xff0c;光滑平整&#xff0c;有月牙&#xff1b;有的坑坑洼洼&#xff0c;凸…

require.context

带表达式的 require 语句 如果你的 require参数含有表达式(expressions)&#xff0c;会创建一个上下文(context)&#xff0c;因为在编译时(compile time)并不清楚具体是哪一个模块被导入 require("./template/" name ".ejs");webpack 解析 require() 的…

使用JSF 2.2功能来开发可滚动,可延迟加载的Ajax数据表

这次&#xff0c;我想与您分享我最近从JSF 2.2功能中学到的知识。 为此&#xff0c;我决定创建一个简单的ajax&#xff0c;可滚动的延迟加载数据表。 请注意&#xff0c; 绝不这是相当大的库如Primefaces &#xff0c; RichFaces的或ICEFaces的 。 这只是为了告诉您我学到了什…

如何监视ps/查询的性能和使用

可以使用“查询管理”页面监视查询性能和使用情况。您可以获得的一些统计信息包括平均运行时、运行次数和上次运行日期。使用预定义的搜索&#xff0c;还可以选择要检查和报告的查询。查询管理还允许您取消当前在查询管理器和查询查看器中运行的查询&#xff0c;以及启用和禁用…

金融计算机怎么调成链式,FRM金融计算器使用方法

2020FRM考试计算器&#xff1a;想一想FRM一级考试基本上按计算器停不下来&#xff0c;我们就一定要买一个简单易操作的计算器&#xff0c;但是GARP对于FRM考生所使用的计算器是有规定的&#xff1a;所有参加FRM考试的考生必须使用GARP指定的计算器&#xff0c;如果考生在考试期…

参数调优为什么要采样_程序员精进之路:性能调优利器--火焰图

本文主要分享火焰图使用技巧&#xff0c;介绍 systemtap 的原理机制&#xff0c;如何使用火焰图快速定位性能问题原因&#xff0c;同时加深对 systemtap 的理解。让我们回想一下&#xff0c;曾经作为编程新手的我们是如何调优程序的&#xff1f;通常是在没有数据的情况下依靠主…

我是这么理解Vue中的响应式系统的

遇到知识&#xff0c;尤其是复杂的概念&#xff0c;我不能类比的话&#xff0c;我很难接收&#xff08;所以学习很差...&#xff09;。在看了大神染陌同学的Vue源码解析后&#xff0c;我想分享一下我所类比的Vue响应式系统&#xff0c;您得先看他的文章&#xff08;至少看他写的…

图的顺序存储(邻接矩阵存储)【摘录自严长生老师的网站】

图是表达多对多关系的一种数据结构&#xff0c;组成要素为顶点和连接顶点的边。 根据边有无方向可分为有向图和无向图 当边有权重时&#xff0c;升级为有向网和无向网 图在存储时&#xff0c;可采用邻接矩阵&#xff0c;比如下面的无向图&#xff08;A&#xff09;和&#xff0…

Neo4j:使隐式关系成为显式和双向关系

最近&#xff0c;我阅读了Michal Bachman关于 Neo4j中双向关系的文章 &#xff0c;他建议对于某些关系类型&#xff0c;我们对关系的方向不那么感兴趣&#xff0c;因此可以在查询时忽略它。 他使用以下示例显示了Neo Technology和GraphAware之间的合作关系&#xff1a; 两家公…

复旦大学计算机学院博士生王斌,复旦大学计算机科学技术学院博士生刘鹏飞荣获...

计算机科学技术学院发布时间:2017-01-04 小字体 中字体 大字体2016年12月22日,历时七个月选拔的2016年度百度奖学金获奖者揭晓,复旦大学计算机科学技术学院2014级博士生刘鹏飞以其在“自然语言处理与深度学习”上取得的突出成绩,从国内外近百所著名高校数百位竞争者中脱颖而出,…

Deno 兼容浏览器具体指的是什么?

Deno 里面有一句描述&#xff1a;"Aims to be browser compatible"&#xff0c;可以看到 Deno 的目标是兼容浏览器。那么这里的兼容浏览器到底如何是什么意思呢&#xff1f; 我简单谈谈我的理解吧。 首先这里的兼容性肯定不是 Deno 直接在浏览器端运行。因为 Deno …