vue3 虚拟table组件el-table-v2使用jsx渲染自定义组件

背景

最近一直在用 Element Plus 虚拟 Table 组件渲染自定义组件,在此记录一下

有关于 Element Plus 的虚拟 Table 组件的例子和各类属性事件等,请查看官网,

这里只说下注意事项

注意事项

在使用 Element Plus 的虚拟 Table 组件时,需要注意以下几点:

  1. Table必须设置 width、height 属性,手动设置或者使用 AutoResizer 组件包裹表格组件
  1. 在设置 columns 属性时,必须为每一列设置一个 width 属性,width属性的值必须是数字类型,否则会导致表格中的数据无法完全显示

开始

我们在虚拟 Table 组件中,渲染自定义单元格组件需要用到 cellRenderer 函数

以下是 CellRenderProps 的参数

yaml 复制代码
type CellRenderProps<T> = {
  cellData: T
  column: Column<T>
  columns: Column<T>[]
  columnIndex: number
  rowData: any
  rowIndex: number
}

环境配置

由于 vite 搭建的项目默认不支持 jsx ,所以需要先配置环境

  1. 安装 @vitejs/plugin-vue-jsx 插件
bash 复制代码
    //yarn
    yarn add @vitejs/plugin-vue-jsx -D
    //npm
    npm install @vitejs/plugin-vue-jsx -D
  1. vite.config.js 配置
javascript 复制代码
    import { defineConfig } from "vite";
    import vue from "@vitejs/plugin-vue";
    import vueJsx from '@vitejs/plugin-vue-jsx';

    export default defineConfig({
      plugins: [vue(),vueJsx()]
    })

代码

我们这里使用官网上的例子- 自定义单元格渲染器。不过官网的上的是 tsx ,我们这里是 jsx

我们可以在 cellRenderer 函数中可以直接使用 jsx 的语法和 UI 组件、自定义组件

一定要记得在 script 标签设置 lang 属性,如果使用的是 ts ,那么就是 lang=tsx ,如果是 js ,那就是 lang=jsx ,不然还是会报错

之前没有设置 lang=jsx 的话,也会自动设置为 jsx 。之所以现在需要取消了自动设置,是因为在特定情况下,手动设置和自动设置会冲突导致报错,详情可查看这个issue

xml 复制代码
<template>
  <el-table-v2
    :columns="columns"
    :data="data"
    :width="700"
    :height="400"
    fixed
  />
</template>

<script lang="jsx" setup>
import { ref } from 'vue'
import dayjs from 'dayjs'
import {
  ElButton,
  ElIcon,
  ElTag,
  ElTooltip,
  TableV2FixedDir,
} from 'element-plus'
import { Timer } from '@element-plus/icons-vue'


let id = 0

const dataGenerator = () => ({
  id: `random-id-${++id}`,
  name: 'Tom',
  date: '2020-10-1',
})

const columns = [
  {
    key: 'date',
    title: 'Date',
    dataKey: 'date',
    width: 150,
    fixed: TableV2FixedDir.LEFT,
    cellRenderer: ({ cellData: date }) => (
      <ElTooltip content={dayjs(date).format('YYYY/MM/DD')}>
        {
          <span class="flex items-center">
            <ElIcon class="mr-3">
              <Timer />
            </ElIcon>
            {dayjs(date).format('YYYY/MM/DD')}
          </span>
        }
      </ElTooltip>
    ),
  },
  {
    key: 'name',
    title: 'Name',
    dataKey: 'name',
    width: 150,
    align: 'center',
    cellRenderer: ({ cellData: name }) => <ElTag>{name}</ElTag>,
  },
  {
    key: 'operations',
    title: 'Operations',
    cellRenderer: () => (
      <>
        <ElButton size="small">Edit</ElButton>
        <ElButton size="small" type="danger">
          Delete
        </ElButton>
      </>
    ),
    width: 150,
    align: 'center',
  },
]

const data = ref(Array.from({ length: 200 }).map(dataGenerator))
</script>

这样就大功告成了

结尾

记录一下在 vite 中使用 jsx 所需的配置

最后,祝大家变得更强!

参考

element-plus虚拟化表格组件el-table-v2渲染自定义组件的其中两种方式(js和jsx)及注意事项

相关推荐
开开心心就好3 小时前
竖式除法出题工具,整除余数混合模式
运维·服务器·前端·javascript·ocr·perl·1024程序员节
起个名字费劲死了3 小时前
Halcon学习一:骰子识别
前端·python·学习
大江东去浪淘尽千古风流人物4 小时前
【HexVIO】DSP卸载双目惯性VIO:Hexagon向量化前端与单帧融合调度深度解析
前端·状态模式·slam·dsp·vio·hexagon·移动端加速
এ慕ོ冬℘゜4 小时前
JS 事件循环、宏任务微任务:单线程底层原理 + 执行顺序
开发语言·javascript·ecmascript
其实防守也摸鱼4 小时前
Chrome 扩展安全攻防实录:从攻击面到防御实践
开发语言·前端·网络·chrome·安全·web安全·php
web打印社区4 小时前
Lodop排障总纲-常见报错一张表
开发语言·前端·javascript·chrome·websocket
李剑一4 小时前
为什么几乎所有的知名开源项目都是外国人写的?
前端·ai编程·deepseek
小郎君6584 小时前
(一)为什么表单需要第三种状态:disabled、readonly 与纯文本展示
前端·vue.js
计算机魔术师4 小时前
1.4万亿没人接,OpenAI自己砍了1500亿
前端
程序员大阳4 小时前
副队长JavaScript教程(56)-DOM之表单操作
javascript·dom·表单操作