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

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

目标效果:
在这里插入图片描述

本案例中,设备信息deviceInfos是一个数组,需要循环渲染每个设备。

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

错误写法:

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

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全部代码:

// 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>
        </>
      )
    },
  },
])
如果你想在 ag-grid-vue3 中使用 element-plus 作为 cellRenderer,你可以按照以下步骤进行操作: 1. 安装 element-plus 你需要先安装 element-plus,可以通过 npm 或者 yarn 进行安装。具体安装方式可以参考 element-plus 的官方文档。 2. 创建 cellRenderer 在 ag-grid-vue3 中,你可以通过创建一个 Vue 组件来作为 cellRenderer。因此,你需要创建一个 Vue 组件,并在其中使用 element-plus 组件来渲染单元格内容。例如,你可以创建一个名为 `MyCellRenderer` 的组件,代码如下: ``` <template> <el-button type="primary" size="small" @click="onButtonClick">{{ params.value }}</el-button> </template> <script> import { defineComponent } from 'vue' export default defineComponent({ props: ['params'], methods: { onButtonClick() { // 在这里可以处理按钮点击事件 } } }) </script> ``` 在这个组件中,我们使用element-plus 的 `el-button` 组件来渲染单元格内容。当用户点击按钮时,我们可以在 `onButtonClick` 方法中进行相应的处理。 3. 在 ag-grid-vue3 中使用 cellRenderer 最后,你需要在 ag-grid-vue3 中使用刚才创建的 cellRenderer。具体做法是,在 `columnDefs` 中指定 `cellRendererFramework` 属性为你创建的组件。例如,你可以这样定义一个列: ``` { field: 'name', headerName: 'Name', cellRendererFramework: MyCellRenderer } ``` 在这个例子中,我们将 `cellRendererFramework` 属性指定为 `MyCellRenderer` 组件,这样在单元格中就会渲染我们定义的 element-plus 组件了。 希望这个回答能够帮助到你!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值