react-admin 的 useGetIdentity 钩子:获取并展示当前登录用户身份(id / fullName / avatar)的完整指南

发布时间:2026/9/21 14:43:56

react-admin 的 useGetIdentity 钩子:获取并展示当前登录用户身份(id / fullName / avatar)的完整指南 react-admin 的 useGetIdentity 钩子获取并展示当前登录用户身份id / fullName / avatar的完整指南【免费下载链接】react-adminA frontend Framework for single-page applications on top of REST/GraphQL APIs, using TypeScript, React and Material Design项目地址: https://gitcode.com/gh_mirrors/re/react-adminuseGetIdentity是 react-admin 中封装authProvider.getIdentity()调用逻辑的自定义 Hook用于在应用任何位置获取当前已登录用户的身份信息用户名、头像等也是顶部导航栏用户菜单UserMenu显示登录者姓名与头像的底层实现。读完本文你将掌握useGetIdentity的返回值结构、底层 react-query 工作机制、在页面/表单中的典型实战用法以及如何通过refetch在用户修改资料后刷新身份数据还能了解其源码级实现细节与测试用例。一、useGetIdentity是什么react-admin 需要调用authProvider.getIdentity()来获取并展示当前登录用户的用户名和头像。这个调用逻辑被打包成一个自定义 Hook即useGetIdentity你可以在自己的代码中直接使用它而不必手动触碰 authProvider。它位于ra-core包中源码在 packages/ra-core/src/auth/useGetIdentity.ts同时从 packages/ra-core/src/auth/index.ts 导出并通过react-admin包统一对外暴露import { useGetIdentity } from react-admin或from ra-core。在 react-admin 的应用布局中默认的 UserMenu 组件就内部调用了useGetIdentity()并用identity?.fullName在 AppBar 上渲染用户名见packages/ra-ui-materialui/src/layout/UserMenu.tsx第 75 行与第 96-99 行的条件渲染逻辑。也就是说即使你不直接使用该 Hook它在应用中的首次调用也几乎总是由用户菜单触发。二、基本语法与返回值useGetIdentity()会在组件挂载时调用authProvider.getIdentity()并返回一个包含加载状态、错误状态与身份数据的对象const { data, isPending, error } useGetIdentity();当数据加载完成后data对象包含以下属性const { id, fullName, avatar } data;id用户的唯一标识符必填。fullName用户名/显示名可选。avatar头像 URL可选。这三项在 UserIdentity 接口中定义export interface UserIdentity { id: Identifier; fullName?: string; avatar?: string; [key: string]: any; }值得注意的是该接口带有索引签名[key: string]: any这意味着你的getIdentity可以返回任意自定义字段例如email、roles等react-admin 会原样透传。对应的 authProvider 方法签名见 packages/ra-core/src/types.ts为getIdentity?: (params?: QueryFunctionContext) PromiseUserIdentity;除了解构data外useGetIdentity还额外返回一个别名属性identity即identity与data指向同一个身份对象见源码第 94-100 行的useMemo展开因此你也可以这样写const { identity, isPending, error, refetch } useGetIdentity();三、底层实现基于 react-query 的 useQueryuseGetIdentity使用 react-query 的useQueryHook 来调用 authProvider这一点从源码packages/ra-core/src/auth/useGetIdentity.ts可以清楚看到const result useQuery({ queryKey: [auth, getIdentity], queryFn: async ({ signal }) { if ( authProvider typeof authProvider.getIdentity function ) { return authProvider.getIdentity({ signal }); } else { return defaultIdentity; } }, ...queryOptions, });三个关键实现细节值得展开固定的查询键查询键固定为[auth, getIdentity]。这意味着在同一 QueryClient 作用域内所有调用useGetIdentity的组件共享同一份缓存数据——这正是 UserMenu、页面组件等多处调用不会重复请求的底层原因。同时测试用例 useGetIdentity.spec.tsx 通过queryClient.cancelQueries({ queryKey: [auth, getIdentity] })来取消查询并验证signal的abort事件被触发说明查询取消能力对getIdentity同样生效。AbortSignal 透传queryFn收到 react-query 提供的signal参数并把它传给authProvider.getIdentity({ signal })。如果查询被取消例如组件卸载或手动取消signal会触发abort允许 authProvider 中断正在进行的网络请求避免资源浪费。缺省回退如果当前没有注册 authProvider或 authProvider 未实现getIdentity方法useGetIdentity不会抛错而是返回默认身份defaultIdentity { id: }见源码第 12-14 行。对应测试 should not throw errors when there is no authProvider.getIdentityuseGetIdentity.spec.tsx验证了这一点渲染结果既不显示 Loading 也不显示 Error而是输出{id:}。默认配置Hook 的默认staleTime为 5 分钟staleTime: 5 * 60 * 1000见源码第 15-17 行即身份数据在 5 分钟内被视为新鲜重复挂载组件不会触发重新请求。你可以通过传入选项覆盖它const { data, isPending, error } useGetIdentity({ staleTime: 60 * 1000, // 1 分钟内不重新请求 retry: false, // 失败不重试 onSuccess: (identity) { /* 数据就绪回调 */ }, onError: (err) { /* 出错回调 */ }, onSettled: (data, error) { /* 无论成败都会回调 */ }, });其中onSuccess、onError、onSettled是UseGetIdentityOptions见 useGetIdentity.ts提供的扩展回调内部通过useEvent包装以保证回调引用稳定并在数据就绪/出错/settled 时通过useEffect触发源码第 73-92 行。四、实战用法根据当前用户身份控制 UI一个典型的场景是当某条记录被其他用户锁定编辑时当前用户应看到只读的 Show 页面而非 Edit 页面。下面的PostDetail组件同时使用useGetOne获取记录、useGetIdentity获取当前用户比较post.lockedBy与identity.id来决定渲染哪个视图import { useGetIdentity, useGetOne } from ra-core; const PostDetail ({ id }) { const { data: post, isPending: isPendingPost } useGetOne(posts, { id }); const { data: identity, isPending: isPendingIdentity } useGetIdentity(); if (isPendingPost || isPendingIdentity) return Loading.../; if (!post.lockedBy || post.lockedBy identity.id) { // post isnt locked, or is locked by me return PostEdit post{post} / } else { // post is locked by someone else and cannot be edited return PostShow post{post} / } }两个数据请求并行发出必须同时等待加载完成再做出分支判断否则identity可能为undefined导致运行时错误。这正是useGetIdentity返回isPending状态的典型用法。这个场景在 Storybook 示例 useGetIdentity.stories.tsx 中也有对应的Basic演示其 mock authProvider 返回{ id: 1, fullName: John Doe }组件渲染后展示John Doe测试用例 should return the identityuseGetIdentity.spec.tsx通过screen.findByText(John Doe)断言了该行为。五、刷新身份修改用户名/头像后调用 refetch如果你的应用包含一个让当前用户更新姓名或头像的表单提交后需要刷新身份数据。由于useGetIdentity基于 react-query 的useQuery你可以直接利用其返回的refetch函数强制重新调用authProvider.getIdentity()并通知所有订阅了该查询的组件——包括 AppBar 里的 UserMenu——同步更新展示const IdentityForm () { const { isPending, error, data, refetch } useGetIdentity(); const [newIdentity, setNewIdentity] useState(); if (isPending) return Loading/; if (error) return Error/; const handleChange event { setNewIdentity(event.target.value); }; const handleSubmit (e) { e.preventDefault(); if (!newIdentity) return; fetch(/update_identity, { method: POST, headers: { Content-Type: application/json }, body: JSON.stringify({ identity: newIdentity }) }).then(() { // call authProvider.getIdentity() again and notify the listeners of the result, // including the UserMenu in the AppBar refetch(); }); }; return ( form onSubmit{handleSubmit} input defaultValue{data.fullName} onChange{handleChange} / input typesubmit valueSave / /form ); };这段代码的要点表单先通过fetch将新身份提交到后端持久化提交成功后调用refetch()重新执行getIdentity()由于查询键[auth, getIdentity]是共享的refetch会同时触发所有使用该查询键的组件更新源码注释明确提到 including the UserMenu in the AppBar。上述流程在 Storybook 的ResetIdentity示例useGetIdentity.stories.tsx和测试 should allow to update the identity after a changeuseGetIdentity.spec.tsx中均有完整验证输入框初始值为John Doe改为Jane Doe并点击 Save 后界面更新为Jane Doe。六、错误处理与注意事项错误状态当authProvider.getIdentity()返回被拒绝的 Promise 时useGetIdentity会把错误放入error字段isPending变为false。你可以据此渲染错误 UIconst { identity, isPending, error } useGetIdentity(); if (isPending) return Spinner /; if (error) return ErrorPage error{error} /; return Welcome user{identity} /;Storybook 的ErrorCaseuseGetIdentity.stories.tsx演示了getIdentity返回Promise.reject(new Error(Error))时的表现测试 should return the authProvider erroruseGetIdentity.spec.tsx断言此时渲染出 Error。注意该示例在测试中通过QueryClient的defaultOptions.queries.retry: false关闭了重试避免测试长时间等待。注意事项汇总未实现 getIdentity 时不会报错无 authProvider 或未实现getIdentity时返回{ id: }请确保代码对identity.id为空串的情况有合理处理。缓存与陈旧时间默认 5 分钟staleTime跨组件共享缓存需要实时身份数据时请调整staleTime或显式调用refetch。加载态必须处理isPending为true时data/identity为undefined在解构使用前务必先做加载态判断如第四节示例所示。取消支持getIdentity会收到 AbortSignalauthProvider 内部应监听signal以支持请求取消。七、相关资源本文核心 API 说明两个版本的官方文档docs_headless/src/content/docs/useGetIdentity.md 与 docs/useGetIdentity.md源码实现packages/ra-core/src/auth/useGetIdentity.ts身份类型定义packages/ra-core/src/types.ts单元测试packages/ra-core/src/auth/useGetIdentity.spec.tsxStorybook 示例packages/ra-core/src/auth/useGetIdentity.stories.tsx实际消费方AppBar 用户菜单packages/ra-ui-materialui/src/layout/UserMenu.tsx了解更多 authProvider 的getIdentity契约与完整身份认证体系可参阅 docs/AuthProviderWriting.md 与 docs/Authentication.md【免费下载链接】react-adminA frontend Framework for single-page applications on top of REST/GraphQL APIs, using TypeScript, React and Material Design项目地址: https://gitcode.com/gh_mirrors/re/react-admin创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
延伸阅读

更多相关文章

2026/9/21 14:38:56

Intel HEX转BIN原理与生产级C#实现

1. 项目概述:为什么一个“hex转bin”工具值得花时间重做一遍在嵌入式开发、固件升级、硬件调试这些真实场景里,我几乎每天都要和.hex文件打交道——Keil编译完的输出、STM32CubeProgrammer导出的烧录镜像、甚至Proteus仿真时加载的程序映像,十…

2026/9/21 14:38:56

MyBatis入门指南:从零开始掌握持久层框架

1. 文件操作三剑客概述在编程开发中,文件操作是最基础也是最重要的功能之一。无论是数据处理、日志记录还是配置管理,都离不开文件的读写操作。Claude Code提供的Read、Edit、Write三个核心工具,构成了一个完整的文件操作闭环,让开…

2026/9/21 17:54:18

3个技巧搞定kris实战项目性能优化

3个技巧搞定kris实战项目性能优化 官方文档翻了三遍还是没看懂?别慌,kris 的文档确实厚,光看配置项就能让人头皮发麻。很多应届生在做 实战项目 时,一上来就照抄示例,结果线上环境一压测,CPU…

2026/9/21 17:54:18

3天搞定曳尾于涂配置,保姆级教程避坑指南

3天搞定曳尾于涂配置,保姆级教程避坑指南 配置环境就卡半天?别慌,这种“曳尾于涂”式的部署困境,老手都见过。很多刚入行的兄弟,对着文档一步步敲命令,结果报错满天飞,心态直接崩了。 这篇 保姆级教程…

2026/9/21 17:54:18

3招吃透四虎影视WWW在线观看免费源码解析

3招吃透四虎影视WWW在线观看免费源码解析 面试被问核心原理答不上来,现场直接黑脸?别慌。很多兄弟在四虎影视WWW在线观看免费这类高并发场景的源码解析上,只背了八股文,没真动手拆过代码。结果一问底层缓存击穿怎么防、视频流如何切片,脑子瞬间空…

2026/9/21 17:49:18

V型调频信号在ISAR成像中的关键技术解析

1. 项目背景与研究意义在现代雷达信号处理领域,调频信号脉冲压缩技术和逆合成孔径雷达(ISAR)成像技术一直是研究热点。国防科技大学这篇硕士论文选题具有鲜明的工程应用背景和理论创新价值。我曾在某研究所参与过类似项目,深知这类…

2026/9/21 3:28:31

GAMP 5 基于风险的计算机化系统验证:软件分类与审计追踪实践

简介:《A Risk-Based Approach to Compliant GxP Computerized Systems》即业内熟知的GAMP 5指南,面向制药企业质量与IT合规人员、验证工程师及计算机化系统管理者,用于解决GxP法规环境下系统合规性难以科学落地的问题。文档以风险管理为主线…

2026/9/21 3:33:19

安全托管MSSP实战:从静态防御到人机协同的攻防运营与应急响应

简介:这份PPT围绕互联网业务安全托管服务展开,面向企业安全负责人、IT运维人员及关注MSSP/MSS选型的读者,重点回应传统安全过度依赖人工、碎片化静态防御难以对抗产业化攻击等痛点。资源共1个pptx文件,包体约30.63MB,以…

2026/9/21 0:02:23

OpenResearch:构建可复现的开放式研究工作流

第一次看到“OpenResearch”这个名字,我脑子里冒出的不是某个具体软件,而更像一种研究方式的宣言:开放、可复现、可验证。这三件事放在一起,其实比大多数人想象中难得多。过去几年我一直在折腾自己的研究工作流,从纯纸…

2026/9/20 4:54:47

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/20 5:01:23

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/21 10:29:02

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
咨询二维码