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

本文介绍了在Ant Design Vue的a-table组件上进行二次封装时遇到的slots渲染问题,详细讨论了解决方案。通过使用`scopedSlots`参数,并结合`render()`方法,成功实现了组件外部定义的slot在封装后的组件中正确渲染。同时,文章还展示了如何处理表头的slot,包括逢三断一的数据显示和a-tooltip提示信息的添加。
部署运行你感兴趣的模型镜像

目的就是对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位小数

 this.$scopedSlots数据格式:

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

表头slot如何渲染

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

此时header格式为[{scopedSlots: {customRender: 'consumption', title: '$consumption'} }]

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

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

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

此时我觉得,我应该把$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>
    )
  },

大功告成

您可能感兴趣的与本文相关的镜像

Qwen-Image

Qwen-Image

图片生成
Qwen

Qwen-Image是阿里云通义千问团队于2025年8月发布的亿参数图像生成基础模型,其最大亮点是强大的复杂文本渲染和精确图像编辑能力,能够生成包含多行、段落级中英文文本的高保真图像

评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值