解决ant design vue 表格a-table二次封装,slots渲染的问题


Posted in Javascript onOctober 28, 2020

目的就是对a-table进行二次封装,但是在如何显示a-table的slot时遇到了问题,原本想法是在a-table内把$slots都渲染,期望在使用该组件时能正确渲染,然而。。。并不会正确渲染

<template>
 <a-table
  bordered
  :scroll="{ x: scrollX, y: 600 }"
  v-bind="{...$attrs, ...$props, ...{dataSource: body, columns: header}}"
  :loading="loadingObj"
  v-on="listeners"
 >
  <template v-for="(val, slot) in $slots" :slot="slot">{{ this.$slots[slot] }}</template>
 </a-table>
</template>

后来,在某个写法里找到了a-table有scopedSlots这个参数,但是在template里直接赋值也不行,如下

<a-table
  bordered
  :scroll="{ x: scrollX, y: 600 }"
  v-bind="{...$attrs, ...$props, ...{dataSource: body, columns: header}}"
  :loading="loadingObj"
  v-on="listeners"
  :scopedSlots="$scopedSlots"
 >

可行方法

组件不采用template写,用render()

则变成:

render () {
  const on = {
   ...this.$listeners
  }
  const props = { ...this.$attrs, ...this.$props, ...{ dataSource: this.body, columns: this.header }}
  const table = (
   <a-table bordered props={props} scopedSlots={ this.$scopedSlots } on={on}>
   </a-table>
  )
  return (
   <div class="dc-table">
    { table }
   </div>
  )
 },
methods: () {
 
}

重点在于scopedSlots={ this.$scopedSlots }, 这样在使用组件的外部直接写slot就可以正常渲染

调用方法

<dc-table
   ref="table"
   :columns="header"
   :dataSource="body"
   :loading="loading"
   :pagination="pagination"
   @change="handleTableChange"
   class="table-fit"
  >
 
    // 这里是表头的渲染,下面会讲到
   <template v-for="title in headerSlots" :slot="'$' + title">
    <span :key="title">
     <a-tooltip placement="right" trigger="click">
      <template slot="title">{{ getHeaderTarget(title).remark }}</template>{{ getHeaderTarget(title).title }}<a-icon type="info-circle"/>
     </a-tooltip>
    </span>
   </template>
  // 这里渲染列数据
   <template v-for="(item, index) in DECIMAL_PARAMS" :slot="item" slot-scope="text">
    <span :key="index">
     <!-- <span v-if="item === 'estimated_ROI'">
      <template v-if="text === 0">{{ text }}</template>
      <template v-else>{{ (text * 100) | NumberFixed }}%</template>
     </span> -->
     <span>{{ text | NumberFixed | NumberFormat }}</span>
    </span>
   </template>
  </dc-table>

如下表格数据原本是数据,渲染成逢三断一,并2位小数

解决ant design vue 表格a-table二次封装,slots渲染的问题

this.$scopedSlots数据格式:

解决ant design vue 表格a-table二次封装,slots渲染的问题

在header中为scopedSlots: {customRender: 'consumption'} 格式

表头slot如何渲染

还是同一个表格,要求表头有提示信息,所以我在表头也做了slots渲染了a-tooltip显示提示信息

此时header格式为

[{scopedSlots: {customRender: 'consumption', title: '$consumption'} }]

表头渲染设置scopedSlots里title字段,名字自定义

此时的this.$scopedSlots也有$consumption表头slot字段,但是并不能正常渲染出来

解决ant design vue 表格a-table二次封装,slots渲染的问题

但是发现this.$slots里有且只有表头的slot

解决ant design vue 表格a-table二次封装,slots渲染的问题

此时我觉得,我应该把$slots的内容渲染在a-table里,则

render () {
  const on = {
   ...this.$listeners
  }
  const props = { ...this.$attrs, ...this.$props, ...{ dataSource: this.body, columns: this.header }}
  // slots循环
  const slots = Object.keys(this.$slots).map(slot => {
   return (
    <template slot={slot}>{ this.$slots[slot] }</template>
   )
  })
  const table = (
   <a-table bordered props={props} scopedSlots={ this.$scopedSlots } on={on}>
    {slots} // 放这里
   </a-table>
  )
  return (
   <div class="dc-table">
    { table }
   </div>
  )
 },

大功告成!

补充知识:Ant Design of Vue中 的a-table一些使用问题

1.添加行点击及复选框

<template>
 <div>
  <a-table
   :rowSelection="{selectedRowKeys: selectedRowKeys, onChange: onSelectChange}"
   :columns="columns"
   :dataSource="data"
   :customRow="onClickRow"
  />
 </div>
</template>
<script>
 const columns = [
  {
   title: 'Name',
   dataIndex: 'name',
  },
  {
   title: 'Age',
   dataIndex: 'age',
  },
  {
   title: 'Address',
   dataIndex: 'address',
  },
 ];

 const data = [];
 for (let i = 0; i < 46; i++) {
  data.push({
   key: i,
   name: `Edward King ${i}`,
   age: 32,
   address: `London, Park Lane no. ${i}`,
  });
 }

 export default {
  data() {
   return {
    data,
    columns,
    selectedRowKeys: [], // Check here to configure the default column
    selectedRows: [] // 选中的整行数据
    loading: false,
   };
  },
  methods: {
   onSelectChange (selectedRowKeys, selectedRows) {
    this.selectedRowKeys = selectedRowKeys;
    this.selectedRows = selectedRows
   },
   onClickRow (record) {
    return {
     on: {
      click: () => {
       const rowKeys = this.selectedRowKeys
       const rows = this.selectedRows
       if (rowKeys.length > 0 && rowKeys.includes(record.key)) {
        rowKeys.splice(rowKeys.indexOf(record.key), 1)
        rows.splice(rowKeys.indexOf(record.key), 1)
       } else {
        rowKeys.push(record.key)
        rows.push(record)
       }
       this.selectedRowKeys = rowKeys
       this.selectedRows = rows
      }
     }
    }
   }
  },
 };
</script>

2.固定列重叠问题

官方给的建议

对于列数很多的数据,可以固定前后的列,横向滚动查看其它数据,需要和 scroll.x 配合使用。

若列头与内容不对齐或出现列重复,请指定固定列的宽度 width。

建议指定 scroll.x 为大于表格宽度的固定值或百分比。注意,且非固定列宽度之和不要超过 scroll.x。

const columns = [
  { title: 'Full Name', width: 100, dataIndex: 'name', key: 'name', fixed: 'left' },
  { title: 'Age', width: 100, dataIndex: 'age', key: 'age', fixed: 'left' },
  { title: 'Column 1', dataIndex: 'address', key: '1' },
  { title: 'Column 2', dataIndex: 'address', key: '2' },
  { title: 'Column 3', dataIndex: 'address', key: '3' },
  { title: 'Column 4', dataIndex: 'address', key: '4' },
  { title: 'Column 5', dataIndex: 'address', key: '5' },
  { title: 'Column 6', dataIndex: 'address', key: '6' },
  { title: 'Column 7', dataIndex: 'address', key: '7' },
  { title: 'Column 8', dataIndex: 'address', key: '8' },
  {
   title: 'Action',
   key: 'operation',
   fixed: 'right',
   width: 100,
   scopedSlots: { customRender: 'action' },
  },
 ];

我在项目中为其他列添加width,scroll x设置为这些width之和,添加一个空列,让这列自适应宽度

{
 title: ''
},

3.纵向滚动条(表格高度随屏幕高度改变而改变)

<a-table
  :scroll={y: scrollY}
   :rowSelection="{selectedRowKeys: selectedRowKeys, onChange: onSelectChange}"
   :columns="columns"
   :dataSource="data"
   :customRow="onClickRow"
  />
data(){
 return {
 scrollY: document.body.clientHeight - 386, // 表格竖向滚动条,386是页面其他元素的高度
 screenHeight: document.body.clientHeight, // 屏幕的高度
 }
} 

watch: {
  // 监听屏幕高度改变表格高度
  screenHeight (val) {
   // 初始化表格高度
   this.scrollY = val - 386
  }

 },

mounted () {
  // 监听屏幕高度
  window.onresize = () => {
   return (() => {
    window.screenHeight = document.body.clientHeight
    this.screenHeight = window.screenHeight
   })()
  }
 },

以上这篇解决ant design vue 表格a-table二次封装,slots渲染的问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
javascript操作excel生成报表全攻略
May 04 Javascript
js实现获取当前时间是本月第几周的方法
Aug 11 Javascript
浅谈JavaScript变量的自动转换和语句
Jun 12 Javascript
jQuery简单实现遍历单选框的方法
Mar 06 Javascript
vue-resouce设置请求头的三种方法
Sep 12 Javascript
浅谈React之状态(State)
Sep 19 Javascript
微信小程序实现点击图片放大预览
Oct 21 Javascript
layUI的验证码功能及校验实例
Oct 25 Javascript
Vue实现base64编码图片间的切换功能
Dec 04 Javascript
jQuery模仿ToDoList实现简单的待办事项列表
Dec 30 jQuery
ES6的循环与可迭代对象示例详解
Jan 31 Javascript
nestjs返回给前端数据格式的封装实现
Feb 22 Javascript
ant design vue中表格指定格式渲染方式
Oct 28 #Javascript
vue实现一个矩形标记区域(rectangle marker)的方法
Oct 28 #Javascript
ant design vue datepicker日期选择器中文化操作
Oct 28 #Javascript
微信小程序picker组件两列关联使用方式
Oct 27 #Javascript
解决ant Design中this.props.form.validateFields未执行的问题
Oct 27 #Javascript
解决antd Form 表单校验方法无响应的问题
Oct 27 #Javascript
Antd表格滚动 宽度自适应 不换行的实例
Oct 27 #Javascript
You might like
php header Content-Type类型小结
2011/07/03 PHP
php中将网址转换为超链接的函数
2011/09/02 PHP
(PHP实现)只使用++运算实现加法,减法,乘法,除法
2013/06/27 PHP
PHP定时更新程序设计思路分享
2014/06/10 PHP
ThinkPHP中使用Ueditor富文本编辑器
2015/09/02 PHP
php项目开发中用到的快速排序算法分析
2016/06/25 PHP
Centos PHP 扩展Xchche的安装教程
2016/07/09 PHP
Thinkphp实现站点静态化的方法详解
2017/03/21 PHP
浅谈PHP5.6 与 PHP7.0 区别
2019/10/09 PHP
Z-Blog中用到的js代码
2007/03/15 Javascript
JavaScript Distilled 基础知识与函数
2010/04/07 Javascript
基于jQuery捕获超链接事件进行局部刷新代码
2012/05/10 Javascript
网页加载时页面显示进度条加载完成之后显示网页内容
2012/12/23 Javascript
如何使用jQuery Draggable和Droppable实现拖拽功能
2013/07/05 Javascript
Node.js中使用计时器定时执行函数详解
2014/08/15 Javascript
jQuery中next()方法用法实例
2015/01/07 Javascript
小巧强大的jquery layer弹窗弹层插件
2015/12/06 Javascript
js显示动态时间的方法详解
2016/08/20 Javascript
基于Layer+jQuery的自定义弹框
2020/05/26 Javascript
JavaScript获取当前时间向前推三个月的方法示例
2017/02/04 Javascript
JavaScript ES6中的简写语法总结与使用技巧
2018/12/30 Javascript
Vue动态创建注册component的实例代码
2019/06/14 Javascript
[01:35:13]DOTA2-DPC中国联赛 正赛 DLG vs PHOENIX BO3 第一场 1月18日
2021/03/11 DOTA
python 统计一个列表当中的每一个元素出现了多少次的方法
2018/11/14 Python
Python基于Tkinter模块实现的弹球小游戏
2018/12/27 Python
Python生命游戏实现原理及过程解析(附源代码)
2019/08/01 Python
Python如何使用Gitlab API实现批量的合并分支
2019/11/27 Python
CSS实现的一闪而过的图片闪光效果
2014/04/23 HTML / CSS
英国最大的在线快递公司之一:ParcelHero
2019/11/04 全球购物
材料物理专业大学毕业生求职信
2013/10/15 职场文书
房地产还款计划书
2014/01/10 职场文书
计算机实训报告总结
2014/11/05 职场文书
2014年教研组工作总结
2014/11/26 职场文书
个人委托函范文
2015/01/29 职场文书
城南旧事读书笔记
2015/06/29 职场文书
手术室消毒隔离制度
2015/08/05 职场文书