今天学习使用elementplus虚拟化表格时,遇到了一个问题,就是需要在表格项中自定义渲染内容比如渲染一个Tag标签,渲染一个下拉框组件等) 可见官网示例:Virtualized Table 虚拟化表格 | Element Plus (element-plus.org)

        关于jsx / tsx 可以自行搜索相关文档去学习,我是因为之前学习过react所以了解。

        但是官方给的示例中,只示例了一些普通的组件的使用,并没有告诉如何使用插槽(原本在vuetemplate中写,是直接写template插槽即可,但是在tsx中不能这么写)。经过多方查找,终于找到了方法,就是在组件标签中有个vslots属性,给里面传入一个对象键是插槽名,值是render函数

        比如elementplus中的Popover组件,就有两个插槽,一个是默认插槽,一个是具名插槽。要想在tsx中使用,需要这样:

下面这个是在vuetemplate标签中的写法

<template>
    <el-popover :width="300" >
        <template #reference>
            这里是普通内容
        </template>
        <template #default>
            这里悬浮之后,弹出提示框内容
        </template>
    </el-popover>
</template>

但是在tsx中,不能这样写,会报错我们需要这样:

<script lang="tsx" setup>
import { Column, ElPopover } from 'element-plus';
const columns: Column<any>[] = [
    {
        key: 'id',
        title: '',
        dataKey: 'id',
        width: 40,
        align: 'center',
        cellRenderer: ({ cellData: id }) => (
            <ElPopover width={300} v-slots={{
                reference: () => <div>这里是普通内容</div>,
                default: () => <div>这里悬浮之后,弹出提示框内容</div>
            }}>
            </ElPopover>
        )
    }
]
</script>

解释tsx注意事项

1. 首先注意script标签的 lang 写的是 tsxjsx,才能在里面写tsx代码

2. vue不一样的是,jsx / tsx中,想使用变量是单花括号 { xxxvue是双花括号 {{ }} 或者属性前加上冒号)。所以在vslots属性中,虽然用了双括号,但是实际上传递的其实是一个对象里面写的东西要遵循对象写法键值对)。v-slots中:键是插槽名,值是render函数

3. 组件名不能用 elpopover写法需要使用双驼峰命名法 ElPopover

4. tsx中给事件绑定函数,使用 onXxxx = { } 的写法比如onClick={ },括号里面函数名字(不是字符串)。如果想传递参数,则这样写 onClick={ () => xxx(id) }。传递一个高阶箭头函数

下面给出我用element-plus虚拟化表格的代码示例  (基于Nuxt3,所以额外嵌套了一个clientonly标签)

<template>
    <div class="list">
        <client-only>
            <el-table-v2 :columns="columns" :data="list" :width="1300" :height="600"/>
        </client-only>
    </div>
</template>
<script lang="tsx" setup> 
import { ElDropdown, ElDropdownMenu, ElTag, ElTooltip, ElDropdownItem, } from 'element-plus'
import { Loading as LoadingIcon } from '@element-plus/icons-vue'
import type { Column } from 'element-plus'
/**表头数据 */
const columns: Column<any>[] = [ 
    {
        key: '_name',
        title: '歌名',
        dataKey: '_name',
        width: 500, 
    },
    {
        key: '_artists',
        title: '歌手',
        dataKey: '_artists',
        width: 275,
    },
    {
        key: '_album',
        title: '专辑',
        dataKey: '_album',
        width: 275,
    },
    {
        key: 'fee',
        title: '标签',
        dataKey: 'fee',
        width: 100,
        align: 'center',
        cellRenderer: ({ cellData: fee }) => (
            <ElTooltip content={fee === 0 ?
                '免费' : fee === 1 ?
                    'VIP' : fee === 4 ?
                        '专辑' : '可听'}>
                {
                    fee === 0 ?
                        <ElTag type="success">免费</ElTag> : fee === 1 ?
                            <ElTag type="warning">VIP</ElTag> : fee === 4 ?
                                <ElTag type="info">专辑</ElTag> : <ElTag type="success">可听</ElTag>
                }

            </ElTooltip>
        ),
    },
    {
        key: '_time',
        title: '时长',
        dataKey: '_time',
        width: 70,
    },
    {
        key: 'id',
        title: '',
        dataKey: 'id',
        width: 40,
        cellRenderer: () => <ElDropdown v-slots={{
            dropdown: ({ cellData: id }: { cellData: number }) => <ElDropdownMenu>
                <ElDropdownItem onClick={() => del(id)}>
                    删除
                </ElDropdownItem>
                <ElDropdownItem disabled>待添加</ElDropdownItem>
            </ElDropdownMenu>
        }}>
            <span style={{ color: 'var(--center-color)' }}>...</span>
        </ElDropdown>
    },
]
const del = (id: number)=>{ }
/** 测试列表 */
const list: Array<tableData> = [
    {
        _name: '歌曲名',
        _album: '专辑名',
        _artists: '歌手名',
        _time: '时长'
        id: 0,
        fee: 0
    }
]
</script>

原文地址:https://blog.csdn.net/m0_64130892/article/details/131638404

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_25708.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注