如何在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
相关产品推荐
相关产品推荐

