React Admin 是否支持在Resource名称中使用路径变量配置动态路由?
React Admin Resource路径变量配置问题解答
React Admin 原生不支持 在Resource组件的name属性中直接配置experts/:email/requests这类带路径变量的格式。name属性是资源的唯一标识,会直接映射到路由规则和dataProvider的调用入参,无法识别占位符逻辑。
两种可行解决方案
方案1:自定义路由+改造dataProvider(邮箱数量较多时推荐)
- 仅定义一个统一的资源,
name设置为expertRequests这类固定标识 - 借助react-admin的自定义路由能力,新增
/experts/:email/requests路由规则,绑定到RequestList、RequestEdit组件 - 在列表/编辑组件内用
useParams()钩子获取路径中的email参数,调用dataProvider时传入;也可直接在dataProvider层拦截expertRequests类型的请求,从当前路由提取email拼接为最终的接口请求路径
方案2:优化现有动态Resource实现(邮箱数量较少时推荐)
你当前代码的问题是邮箱列表拉取逻辑放在了App根组件,认证前就会执行。只需调整逻辑将拉取逻辑移到Admin组件的render props回调内,仅在用户认证完成、拿到身份信息后再拉取邮箱列表、生成对应Resource即可符合要求。
改造后代码示例:
function App() { return ( <Admin authProvider={authProvider} dataProvider={dataProvider} > {(props) => { const [emails, setEmails] = useState<string[]>([]); const [loading, setLoading] = useState(true); useEffect(() => { // 仅管理员身份才拉取邮箱列表 if (!props.admin) { setLoading(false); return; } (async () => { const experts = await firebase.firestore().collection("experts").get(); const docIds: string[] = experts.docs.map((doc) => doc.id); setEmails(docIds); setLoading(false); })(); }, [props.admin]); if (loading) return <div>加载中...</div>; if (props.admin) { return [ emails.map((email) => { return ( <Resource key={email} options={{ label: `${email}` }} name={`experts/${email}/requests`} list={RequestList} edit={RequestEdit} /> ); }), <Resource name={`experts`} list={ExpertList} />, ]; } else { return [ <Resource options={{ label: `${props.email}` }} name={`experts/${props.email}/requests`} list={RequestList} edit={RequestEdit} />, ]; } }} </Admin> ); }
内容的提问来源于stack exchange,提问作者Pietro
相关产品推荐
相关产品推荐

