【element plus】虚拟dom表格中cellRenderer如何使用v-for循环渲染item

news/2025/1/16 13:25:56/

在Element Plus中,cellRenderer 通常用于自定义表格(el-table)中单元格的渲染方式。然而,cellRenderer 本身并不直接支持 Vue 的 v-for 指令,因为 cellRenderer 是一个函数,它接收单元格的数据和其他上下文信息,并返回一个 VNode(虚拟节点)或字符串来渲染单元格。

目标效果:
在这里插入图片描述
本案例中,设备信息deviceInfos是一个数组,需要循环渲染每个设备。

要在 cellRenderer 中实现类似 v-for 的效果,需要使用 JavaScript 的数组方法来迭代数据,并在迭代过程中生成相应的 VNode(如果你使用的是 JSX)或字符串(如果你使用的是模板字符串或普通的 HTML 字符串)。

错误写法:

javascript">cellRenderer: ({ cellData: deviceInfos }) => {deviceInfos.forEach((item) => {const deviceObj = deviceTypes.filter(e => e.value === item.deviceType)item.name = deviceObj?.name});return (<><ElTag v-for="(item, index) in deviceInfos" key={item.deviceId}>{item.name}</ElTag></>)}

报错:ReferenceError: item is not defined

正确写法:使用 JavaScript 的数组方法来迭代数据,并在迭代过程中生成相应的 VNode

javascript">cellRenderer({ cellData }) {return (<div>{cellData.map(item => {const device = deviceTypes.find(d => d.value === item.deviceType);console.log('device ', device)return device ? (<el-tag key={item.deviceId}>{device.label}</el-tag>) : null;})}</div>);}

在这个示例中,cellRenderer 方法接收一个对象作为参数,该对象包含 cellData(当前单元格的数据)。然后,它使用 map 方法来迭代 cellData 数组,并为每个元素生成一个 el-tag 组件。注意,这里使用了 JSX 语法。

columns全部代码:

javascript">// table列数据
const columns = ref([{key: 'index', dataKey: 'index', title: t('setting.index'), width: 60,cellRenderer: ({ rowIndex }) => `${rowIndex + 1}`,},{ key: 'no', dataKey: 'no', title: t('setting.key') },{ key: 'name', dataKey: 'name', title: t('setting.name') },{ key: 'mapNo', dataKey: 'mapNo', title: t('setting.map'), width: 150 },{key: 'status',dataKey: 'status',title: t('setting.status'),cellRenderer: (row) => {return (<><el-switch v-model={row.rowData.status} active-value={0} inactive-value={1} onClick={() => handleStatusChange(row)} /></>)},},{ key: 'businessType', dataKey: 'businessType', title: t('setting.businessType'),cellRenderer: ({ cellData: businessType}) => {const text = businessTypes.filter(item => item.value === businessType);return ({text})}},{ key: 'deviceId', dataKey: 'deviceId', title: t('setting.robotId') },{ key: 'username', dataKey: 'username', title: t('setting.loginPerson') },{key: 'workStatus', dataKey: 'workStatus', title: t('setting.loginStatus'),cellRenderer: ({ cellData: workStatus }) => {const type = workStatus === 0 ? 'success' : 'warning';return (<ElTag type={type}>{workStatus === 0 ? t('setting.work') : t('setting.away')}</ElTag>)}},{key: 'deviceInfos', dataKey: 'deviceInfos', title: t('setting.deviceInfo'),cellRenderer({ cellData }) {return (<div>{cellData.map(item => {const device = deviceTypes.find(d => d.value === item.deviceType);console.log('device ', device)return device ? (<el-tag key={item.deviceId}>{device.label}</el-tag>) : null;})}</div>);},},{ key: 'remark', dataKey: 'remark', title: t('common.remark') },{ key: 'updateTime', dataKey: 'updateTime', title: t('setting.modifiedTime') },{ key: 'updateBy', dataKey: 'updateBy', title: t('setting.modifiedBy') },{key: 'operate', dataKey: 'operate', title: t('common.operate'),fixed: 'right',width: 50,cellRenderer: (row) => {return (<><ElButton link type="primary" onClick={() => handleUpdate(row)} icon="Edit"></ElButton></>)},},
])

http://www.ppmy.cn/news/1563606.html

相关文章

校园跑腿小程序---任务界面 发布以及后端模板下载

hello hello~ &#xff0c;这里是 code袁~&#x1f496;&#x1f496; &#xff0c;欢迎大家点赞&#x1f973;&#x1f973;关注&#x1f4a5;&#x1f4a5;收藏&#x1f339;&#x1f339;&#x1f339; &#x1f981;作者简介&#xff1a;一名喜欢分享和记录学习的在校大学生…

响应式 Vue 页面布局组件-Element Plus

用户对于界面的体验要求越来越高&#xff0c;而响应式设计正是为了让我们的产品能够适应各种设备与屏幕尺寸而应运而生。在这篇文章中&#xff0c;我们将深入探讨如何利用 Vue.js 和 Element Plus 框架创建高效的响应式页面布局组件。除了技术功能与亮点&#xff0c;我们还将给…

【Uniapp-Vue3】uni-api交互反馈showToast的使用方法

如果想要显示弹窗&#xff0c;就可以使用showToast去显示弹窗。 uni.showToast({ title:"显示内容", icon:"标志样式" }) 其中&#xff0c;title只能显示7个字符的内容&#xff0c;如果想要显示全&#xff0c;只能不设置icon。 icon默认是success&#xf…

Hack The Box-Starting Point系列Archetype

答案 Which TCP port is hosting a database server?&#xff08;哪个端口托管了数据库服务?&#xff09; 1433 What is the name of the non-Administrative share available over SMB? &#xff08;SMB 上可用的非管理共享的名称是什么&#xff1f;&#xff09; backups…

更新用户密码功能

总说 过程参考黑马程序员SpringBoot3Vue3全套视频教程&#xff0c;springbootvue企业级全栈开发从基础、实战到面试一套通关_哔哩哔哩_bilibili 又是写了一半开始懒散不想写了&#xff0c;9天没写了。 博客仅记录过程&#xff0c;可能解释不详细&#xff0c;因为我也有点一知…

如何在前端给视频进行去除绿幕并替换背景?-----Vue3!!

最近在做这个这项目奇店桶装水小程序V1.3.9安装包骑手端V2.0.1小程序前端 最近&#xff0c;我在进行前端开发时&#xff0c;遇到了一个难题“如何给前端的视频进行去除绿幕并替换背景”。这是一个“数字人项目”所需&#xff0c;我一直在冥思苦想。终于有了一个解决方法…

在vscode中已经安装了插件Live Server,但是在命令面板确找不到

​​​​​ 1、VS Code缓存问题&#xff1a; 有时VS Code的缓存可能导致插件无法正确加载。尝试删除VS Code缓存文件夹&#xff08;如C:\Users\你的用户名\AppData\Roaming\Code&#xff09;中的文件&#xff0c;并重启VS Code。 2、重新安装插件&#xff1a; 尝试卸载Live S…

Pycharm 使用教程

一、基本配置 1. 切换Python解释器 pycharm切换解释器版本 2. pycharm虚拟环境配置 虚拟环境的目的&#xff1a;创建适用于该项目的环境&#xff0c;与系统环境隔离&#xff0c;防止污染系统环境&#xff08;包括需要的库&#xff09;虚拟环境配置存放在项目根目录下的 ven…