element-ui table组件如何使用render属性的实现


Posted in Javascript onNovember 04, 2019

前言

起因:

在使用 element-ui table组件时,由于表列比较多一个个写特别麻烦,所以想通过将所有表头定义成一个数组,通过遍历多方式去实现。这样解决了手写很多 el-table-column 的情况。

障碍:

类似于下面自定义表列的样式,它是通过 slot-scope 去覆盖 el-table-column 内部slot的样式实现的。那我们在遍历表头数组的时候如何实现呢?

element-ui table组件如何使用render属性的实现

参考:

用过 react 开发会经常用到 ant design ,其中它的 table 组件是可以接受 render属性的,下面使用table组件时,只需要定义好,columns(表头列) data(表的具体数据)即可。整体看起来很简洁 去渲染自定义的组件的。 点击查看 antdesign

demo:

codepen demo地址

const columns = [
 {
 title: 'Name',
 dataIndex: 'name',
 render: (text, row, index) => {
  if (index < 4) {
  return <a>{text}</a>;
  }
  return {
  children: <a>{text}</a>,
  props: {
   colSpan: 5,
  },
  };
 },
 }]
 const const data = [
 {
 key: '1',
 name: 'John Brown',
 age: 32,
 tel: '0571-22098909',
 phone: 18889898989,
 address: 'New York No. 1 Lake Park',
 }]
ReactDOM.render(<Table columns={columns} dataSource={data} bordered />, mountNode);

在 Vue 中实现 render 属性

接下来我们要实现下图的table的样式,但是这一次我们采用 render 传参数的方式

element-ui table组件如何使用render属性的实现 

思路

  1. 父组件将需要渲染的列表通过 props 传递给子组件
  2. 子组件使用 slot 并填充默认渲染的 el-table-column 方式为 prop 渲染 data 中传递的值
  3. 子组件通过 slot 将值传回给父组件,父组件通过 slot-scope 接受到子组件的值,判断该项是否有 render 属性,有的话在组件标签添加 render 属性返回的 html 去覆盖 slot 中默认的值。

子组件定义默认值

有了上面的思路,去实现子组件。我们需要知道一点,每个 el-table-column 只是定义了一列的表头和数据,而 :data="tableList" 中的每项值是定义了一行的数据。所以 el-table-column 是按列来分,data 是按行来分

  • 通过props 去接受表头列表,数据列表
  • 遍历表头数据,并且将 el-table-column 作为默认数据,使用 slot 包裹起来
  • 通过 slot 想父组件传递当前项的数据
<template>
 <el-table :data="tableList" style="width:500px">
  <template v-for="item in propList">
  <slot :content="item">
   <el-table-column :key="item.id" :prop="item.prop" :label="item.label"></el-table-column>
  </slot>
  </template>
 </el-table>
</template>
<script>
 export default {
  props:{
   propList:{
   type:Array,
   default:()=>[]
   },
   tableList:{
   type:Array,
   default:()=>[]
   },
  }
 }
</script>

父组件定义

父组件通过 slot-scope 来接受到子组件传递过来的数据,然后判断是否有 render 属性来确定是否用要去自定义样式覆盖默认的 slot

  • 首先看传递给子组件的表头数据,可以看到,第二,三行列表中有一个render属性,它是一个函数并返回一个 html 的字符串。
  • tableList就是普通的数据,也就是数据的 key 值去渲染对应的数据
  • 图片这列举例子,当父组件通过 props 将 {label,prop,id,render} 传递给子组件后,子组件有通过 slot 将值传递回父组件。
    • 到这里有些人会有疑问,为什么要将数据这样传来传去,因为我们在子组件中定义好了默认样式,而父组件中需要判断该值是否需要自定义样式,去覆盖子组件中的样式。
    • 这些自定义样式就是一开始,在render函数中返回的 html 字符串
    • 为啥 React 直接返回 jsx ,而Vue需要返回 html 字符串,因为react本身就是使用 JSX 来渲染模版的,最终都会通过 babel 编译成 React.createElement ,而Vue是通过 template 来渲染模版的,这里通过定义 template 模版字符串,最终通过 v-html 来解析
  • 为什么这里有两个 slot-scope ,第一个是 slot-item 的,组件内部通过 slot-scope 将值传递出来。而第二个是 el-table-item 的,ui组件内部同样将数据通过 slot-scope 传递传来。
  • 通过第一个 slot-scope 拿到 propList 中的定义的 render 函数,通过第二个 slot-scope 拿到 table 组件内部传递出来的数据,将数据传递给 render 函数去生成自定义模版

最终通过 v-html 去解析生成的字符串模版

<slot-item :propList="propList" :tableList="tableList">
 <template slot-scope="{content}" v-if="content.render">
  <el-table-column :label="content.label">
   <template slot-scope="{$index,row}">
    <div v-html="content.render(row)"></div>
   </template>
  </el-table-column>
 </template>
</slot-item>
 export default {
  components:{
   SlotItem
  },
  data () {
   return { 
    propList:[
     {label:'姓名',prop:'name',id:1},
     {label:'图片',prop:'pic',id:2,render:({pic})=>{
      return `<img style="width:30px;height:30px" src='${pic}' />`
     }},
     {label:'操作',prop:'operate',id:3,render:({text})=>{
      return `<div style="color:#999">${text}</div>`
     }},
    ],
    tableList:[
     {name:'章三',pic:'https://zh-static-files.oss-cn-hangzhou.aliyuncs.com//karazhan/content/poster/2019/11/16e30c192f6.png',text:'新增'},
     {name:'里斯',pic:'https://zh-static-files.oss-cn-hangzhou.aliyuncs.com//karazhan/content/poster/2019/11/16e30c2797e.png',text:'删除'},
     {name:'网舞',pic:'https://zh-static-files.oss-cn-hangzhou.aliyuncs.com//karazhan/content/poster/2019/11/16e30c33144.png',text:'跳转'},
    ]
   }
  }
 }
</script>

结尾

有了render属性,可以想 ant-design 那样简洁的属性 ui组件模版了!

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JQuery自适应IFrame高度(支持嵌套 兼容IE,ff,safafi,chrome)
Mar 28 Javascript
jQuery在html有效在jsp无效的原因及解决方法
Aug 02 Javascript
js 判断控件获得焦点的示例代码
Mar 04 Javascript
AngularJS HTML编译器介绍
Dec 06 Javascript
JavaScript中常用的六种互动方法示例
Mar 13 Javascript
两种JS实现屏蔽鼠标右键的方法
Aug 20 Javascript
jquery+CSS3模拟Path2.0动画菜单效果代码
Aug 31 Javascript
微信小程序scroll-view实现横向滚动和上拉加载示例
Mar 06 Javascript
使用jQuery实现鼠标点击左右按钮滑动切换
Aug 04 jQuery
基于elementUI使用v-model实现经纬度输入的vue组件
May 12 Javascript
详解vue-cli项目开发/生产环境代理实现跨域请求
Jul 23 Javascript
Javascript实现单选框效果
Dec 09 Javascript
Vue 解决多级动态面包屑导航的问题
Nov 04 #Javascript
vue+elementUI动态生成面包屑导航教程
Nov 04 #Javascript
VUE+elementui面包屑实现动态路由详解
Nov 04 #Javascript
Vuex,iView UI面包屑导航使用扩展详解
Nov 04 #Javascript
vue双向绑定数据限制长度的方法
Nov 04 #Javascript
使用p5.js临摹动态图片
Nov 04 #Javascript
p5.js绘制创意自画像
Nov 04 #Javascript
You might like
PHP 基于文件头的文件类型验证类函数
2012/05/01 PHP
PHP 简易输出CSV表格文件的方法详解
2013/06/20 PHP
一个漂亮的php验证码类(分享)
2013/08/06 PHP
php实现的太平洋时间和北京时间互转的自定义函数分享
2014/08/19 PHP
php实现阿拉伯数字和罗马数字相互转换的方法
2015/04/17 PHP
Yii2创建控制器(createController)方法详解
2016/07/23 PHP
PHP缓存工具XCache安装与使用方法详解
2018/04/09 PHP
jQuery formValidator表单验证插件开源了 含API帮助、源码、示例
2008/08/14 Javascript
Javascript 面试题随笔
2011/03/31 Javascript
使用jquery的ajax需要注意的地方dataType的设置
2013/08/12 Javascript
在父页面调用子页面的JS方法
2013/09/29 Javascript
jQuery中:lt选择器用法实例
2014/12/29 Javascript
详细分析JavaScript函数定义
2015/07/16 Javascript
javascript如何实现360度全景照片问题汇总
2016/04/04 Javascript
js实现StringBuffer的简单实例
2016/09/02 Javascript
jQuery简单获取DIV和A标签元素位置的方法
2017/02/07 Javascript
node.js+captchapng+jsonwebtoken实现登录验证示例
2017/08/17 Javascript
JS小球抛物线轨迹运动的两种实现方法详解
2017/12/20 Javascript
js canvas实现5张图片合成一张图片
2019/07/15 Javascript
用于统计项目中代码总行数的Python脚本分享
2015/04/21 Python
Python如何import文件夹下的文件(实现方法)
2017/01/24 Python
老生常谈Python序列化和反序列化
2017/06/28 Python
Python3之简单搭建自带服务器的实例讲解
2018/06/04 Python
Python学习笔记之图片人脸检测识别实例教程
2019/03/06 Python
Python数据类型之String字符串实例详解
2019/05/08 Python
Pycharm新手教程(只需要看这篇就够了)
2019/06/18 Python
python 在sql语句中使用%s,%d,%f说明
2020/06/06 Python
python使用建议技巧分享(三)
2020/08/18 Python
北美三大旅游网站之一:Travelocity加拿大
2016/08/20 全球购物
Clarks鞋法国官方网站:英国其乐鞋品牌
2018/02/11 全球购物
在线购买世界上最好的酒:BoozeBud
2018/06/07 全球购物
出纳担保书范文
2014/04/02 职场文书
质量月活动总结
2014/08/26 职场文书
民主生活会意见
2015/06/05 职场文书
七一活动主持词
2015/06/29 职场文书
基于Python编写一个监控CPU的应用系统
2022/06/25 Python