Naive UI的数据表格 Data Table 动态显示隐藏列

Naive UI的表格组件跟Element UI有点不同,template里面不需要再写每一列的组件,而是通过数组渲染每一列的数据。

<template>
  <n-data-table
    :columns="columns"
    :data="data"
    :pagination="pagination"
    :bordered="false"
  />
</template>

<script lang="ts">
import { h, defineComponent } from 'vue'
import { NButton, useMessage } from 'naive-ui'
import type { DataTableColumns } from 'naive-ui'

type Song = {
  no: number
  title: string
  length: string
}

const createColumns = ({
  play
}: {
  play: (row: Song) => void
}): DataTableColumns<Song> => {
  return [
    {
      title: 'No',
      key: 'no'
    },
    {
      title: 'Title',
      key: 'title'
    },
    {
      title: 'Length',
      key: 'length'
    },
    {
      title: 'Action',
      key: 'actions',
      render (row) {
        return h(
          NButton,
          {
            strong: true,
            tertiary: true,
            size: 'small',
            onClick: () => play(row)
          },
          { default: () => 'Play' }
        )
      }
    }
  ]
}

const data: Song[] = [
  { no: 3, title: 'Wonderwall', length: '4:18' },
  { no: 4, title: "Don't Look Back in Anger", length: '4:48' },
  { no: 12, title: 'Champagne Supernova', length: '7:27' }
]

export default defineComponent({
  setup () {
    const message = useMessage()
    return {
      data,
      columns: createColumns({
        play (row: Song) {
          message.info(`Play ${row.title}`)
        }
      }),
      pagination: false as const
    }
  }
})
</script>

刚好遇到一个需求,要根据不同状态,显示隐藏不同列,所以要动态修改columns属性的数组,看到官方githup仓库上也有这么个issue:但目前最新版本也并没有支持这个属性。能否针对 data-table 组件 增加列的显示隐藏属性? · Issue #5278 · tusen-ai/naive-ui · GitHub

下面提供一个思路,使用计算属性,动态控制某一列的显示和隐藏:

// 构建数据表格列
const columns = computed(() => {
  const { state } = params.value
  const cols: DataTableColumns<item> = [
    {
      title: '序号',
      minWidth: 55,
      key: 'index',
      render: (_, index) => {
        return `${index + 1 + (params.value.currentPage - 1) * params.value.size}`
      }
    },
    {
      title: '姓名',
      key: 'name',
      minWidth: 100
    },
    {
      title: '开始时间',
      key: 'createTime',
      minWidth: 175
    },
    {
      title: '结束时间',
      key: 'finishTime',
      minWidth: state !== 'Cancel' ? 175 : 0
    },
    {
      title: '记录条数',
      key: 'count',
      minWidth: state === 'Finish' ? 115 : 0,
    },
    {
      title: '费用/元',
      key: 'fee',
      minWidth: 90
    },
    {
      title: '原因',
      key: 'reason',
      minWidth: state === 'Refuse' ? 200 : 0
    }
  ]

  // 动态切换状态后,要动态隐藏的列,把宽度或最小宽度设置为0 ,再进行过滤
  return cols.filter(i => i.width || i.minWidth)
})

通过控制width属性,再过滤掉宽度为0的列,就可以动态切换表格每一列的显示和隐藏。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值