在React Admin中如何将同一个API调用映射到不同的资源名称
实现步骤
1. 新增虚拟资源配置
首先创建images资源对应的文件夹和组件(和你已有的videos结构对齐),然后在Admin组件中注册两个虚拟资源:
// 顶部导入对应配置和图标 import { images } from './images'; import { videos } from './videos'; import ImageIcon from '@mui/icons-material/Image'; import VideoIcon from '@mui/icons-material/VideoLibrary'; // Admin组件内新增资源声明 <Admin layout={MyLayout} theme={theme} dataProvider={dataProvider} > <Resource name="Post" {...posts} icon={ImageIcon} /> {/* 新增两个虚拟资源 */} <Resource name="Image" {...images} icon={ImageIcon} /> <Resource name="Video" {...videos} icon={VideoIcon} /> <Resource name="Comment" {...comments} icon={ChatIcon} /> <Resource name="User" {...users} icon={PeopleIcon} /> </Admin>
其中src/images/index.js参考配置:
import ImageList from './ImageList'; import ImageShow from './ImageShow'; export const images = { list: ImageList, show: ImageShow, // 需要编辑/创建能力可自行添加edit、create配置 };
2. 补全DataProvider的代理逻辑
你已经写了getList的资源转换逻辑,只需要补全所有数据请求方法的转换,同时自动添加类型过滤即可(假设你的Post表有type字段区分图片/视频,可替换为你实际的字段名):
const dataProvider = await buildHasuraProvider({ client: myClientWithAuth, // 列表查询 getList: (resource, params) => { // 资源名转换 const actualResource = ['Image', 'Video'].includes(resource) ? 'Post' : resource; // 自动加类型过滤 const extraFilter = resource === 'Image' ? { type: 'image' } : resource === 'Video' ? { type: 'video' } : {}; const mergedParams = { ...params, filter: { ...params.filter, ...extraFilter } }; // 调用默认Hasura查询逻辑,传入实际资源和合并后的参数 return buildHasuraProvider.defaultGetList(actualResource, mergedParams); }, // 单条查询 getOne: (resource, params) => { const actualResource = ['Image', 'Video'].includes(resource) ? 'Post' : resource; return buildHasuraProvider.defaultGetOne(actualResource, params); }, // 批量查询 getMany: (resource, params) => { const actualResource = ['Image', 'Video'].includes(resource) ? 'Post' : resource; return buildHasuraProvider.defaultGetMany(actualResource, params); }, // 关联查询 getManyReference: (resource, params) => { const actualResource = ['Image', 'Video'].includes(resource) ? 'Post' : resource; const extraFilter = resource === 'Image' ? { type: 'image' } : resource === 'Video' ? { type: 'video' } : {}; const mergedParams = { ...params, filter: { ...params.filter, ...extraFilter } }; return buildHasuraProvider.defaultGetManyReference(actualResource, mergedParams); }, // 新增数据 create: (resource, params) => { const actualResource = ['Image', 'Video'].includes(resource) ? 'Post' : resource; // 自动填充类型字段 const extraData = resource === 'Image' ? { type: 'image' } : resource === 'Video' ? { type: 'video' } : {}; const mergedParams = { ...params, data: { ...params.data, ...extraData } }; return buildHasuraProvider.defaultCreate(actualResource, mergedParams); }, // 剩余update、updateMany、delete、deleteMany方法按相同逻辑做资源名转换即可 })
3. 效果说明
配置完成后:
- 点击
Images/Videos菜单会自动跳转到对应路由/dashboard/Image//dashboard/Video,不会再出现404 - 所有两个虚拟资源的数据请求都会自动转发到Post接口,同时携带类型过滤参数,返回对应类型的数据
- 列表、详情、增删改逻辑都可以正常复用react-admin的原生能力,不需要额外改造组件
内容的提问来源于stack exchange,提问作者theKid
相关产品推荐
相关产品推荐

