You need to enable JavaScript to run this app. 如何在List资源与Datagrid组件中显示条目ID而非对象的IRI?
优惠活动
大模型
产品
解决方案
定价
更多

如何在List资源与Datagrid组件中显示条目ID而非对象的IRI?

方案1:前端自定义字段渲染(无需修改后端,适配单字段需求)

直接在Datagrid配置中使用FunctionField自定义渲染逻辑,切割IRI字符串提取最后一段即可:

import { List, Datagrid, TextField } from '@api-platform/admin';
import { FunctionField } from 'react-admin';

export const CommentList = () => (
  <List>
    <Datagrid>
      <FunctionField
        label="ID"
        render={record => record['@id'].split('/').pop()}
      />
      {/* 其余原有字段配置保持不变 */}
      <TextField source="content" />
      <TextField source="author" />
    </Datagrid>
  </List>
);

如果ID存在特殊字符,也可以调整匹配逻辑,比如用正则提取数字ID:render={record => record['@id'].match(/\d+$/)[0]}


方案2:后端新增纯ID字段(一劳永逸,全场景适用)

在API后端的资源序列化配置中,单独暴露原生ID字段,不与JSON-LD的@id字段冲突,前端直接读取该字段即可。
以Symfony框架下的API Platform配置为例:

#[ApiResource(
    normalizationContext: ['groups' => ['comment:read']],
)]
class Comment
{
    #[ORM\Id]
    #[ORM\GeneratedValue]
    #[Groups(['comment:read'])] // 把原生ID加入序列化组
    private ?int $id = null;

    // 其余属性配置
}

前端直接使用原生ID字段渲染即可:

<TextField source="id" label="ID" />

方案3:全局统一转换ID(适配多资源批量修改需求)

如果需要所有资源的列表都默认显示纯ID,可以重写数据提供者的逻辑,统一给返回的所有记录追加纯ID字段:

import { hydraDataProvider as baseHydraDataProvider } from '@api-platform/admin';

const baseProvider = baseHydraDataProvider('你的API根地址', fetchHydra, apiDocumentationParser);

// 封装数据提供者,统一处理ID提取
export const dataProvider = {
  ...baseProvider,
  getList: async (resource, params) => {
    const res = await baseProvider.getList(resource, params);
    return {
      ...res,
      data: res.data.map(item => ({
        ...item,
        rawId: item['@id'].split('/').pop()
      }))
    };
  },
  // 按需给getOne、getMany等方法也追加同样逻辑
};

之后所有列表的ID列都可以直接使用:

<TextField source="rawId" label="ID" />

内容的提问来源于stack exchange,提问作者Andre Bellafronte

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.18 02:15:04