react-admin 软删除实践:用 `<ShowDeletedBase>` 无头组件渲染已删除记录详情
前端UI组件【免费下载链接】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点击查看免费下载导读在 react-adminEnterprise Edition的软删除soft delete功能集中ShowDeletedBase是面向已删除记录详情展示的无头headless组件它替代常规的ShowBase以完全自定义的方式渲染被删除记录的内容并向下层组件提供与ShowBase一致的ShowContext。阅读本文后你将掌握如何在自定义回收站页面中组合DeletedRecordsListBase、DeletedRecordRepresentation与ShowDeletedBase复现并扩展官方文档中的完整示例同时理解其底层数据流dataProvider.getOneDeleted()与 react-query与权限约束。一、功能定位为什么要用ShowDeletedBase在 react-admin 的软删除生态中常规的ShowBase通过dataProvider.getOne()获取记录并放入ShowContext用于构建完全自定义的展示页参见 ShowBase 文档。而删除后的记录无法再通过getOne()读取——它需要专用的dataProvider.getOneDeleted()数据方法。ShowDeletedBase正是为这一场景设计的替代品它替代ShowBase专门用于展示一条已删除记录它向下层 children 提供与ShowBase完全相同的ShowContext因此ShowBase能用的 children 组件如WithRecord、TextField等在这里同样可用作为无头组件它不渲染任何默认布局、标题或操作按钮把展示方式完全交给开发者。与同系列的ShowDeleted见 docs/ShowDeleted.md对应完整版Show的替代品相比ShowDeletedBase更轻量、更灵活前者适合配合DeletedRecordsList的detailComponents弹窗使用而ShowDeletedBase适合嵌入DeletedRecordsListBase的自定义列表以纯手写 UI 展示详情。注意ShowDeletedBase属于 react-admin Enterprise Edition 功能需要有效的企业版订阅才能使用源码位于闭源的react-admin/ra-core-ee包中本文档为其官方文档见 docs_headless/src/content/docs/ShowDeletedBase.md。二、安装react-admin/ra-core-eeShowDeletedBase、DeletedRecordsListBase、DeletedRecordRepresentation以及DeletedRecordType类型均从react-admin/ra-core-ee导出。安装方式与其他 react-admin 包一致npm install --save react-admin/ra-core-ee # 或 yarn add react-admin/ra-core-ee该包是 Enterprise Editionreact-admin/*系列的组成部分与开源版 react-admin 中的ra-core、ra-ui-materialui等包协同工作。示例中还会从开源包导入CoreAdmin、CustomRoutes、WithRecord、WithListContext等基础组件。三、完整用法示例自定义回收站详情视图官方文档给出了一个端到端可运行的示例完整覆盖了删除记录列表 → 点击查看详情 → 展示已删除记录内容的完整链路import { CoreAdmin, CustomRoutes, WithRecord } from ra-core; import { Route } from react-router-dom; import { DeletedRecordsListBase, DeletedRecordRepresentation, ShowDeletedBase, type DeletedRecordType } from react-admin/ra-core-ee; export const App () ( CoreAdmin ... CustomRoutes Route path/deleted element{ DeletedRecordsListBase WithListContext render{({ isPending, data }) isPending ? null : ( ul {data.map(record ( li key{record.id} DeletedItem record{record} / /li ))} /ul )} / /DeletedRecordsListBase } / /CustomRoutes /CoreAdmin ); const DeletedItem ({ record }: { record: DeletedRecordType }) { const [showDetails, setShowDetails] React.useState(false); return ( divstrong{record.resource}/strong/div DeletedRecordRepresentation record{record} / div button onClick{() setShowDetails(true)}Details/button /div {showDetails ? ( ShowDeletedBase record{record} WithRecord render{record p{record.title}/p} / WithRecord render{record p{record.description}/p} / button onClick{() setShowDetails(false)}Close/button /ShowDeletedBase ) : null} / ) }示例的关键点拆解列表层DeletedRecordsListBase通过dataProvider.getListDeleted()获取已删除记录列表并以ListContext提供给 childrenWithListContext从中解构出isPending与data进行渲染。它自带排序、筛选与分页能力详见 DeletedRecordsListBase 文档。单条摘要层record的类型是DeletedRecordType其结构与useDeletedRecordsListController的返回值一致形如{ id: 123, resource: posts, deleted_at: 2025-03-25T12:32:22Z, deleted_by: test, data: { ...原记录字段 } }——resource标识来源资源data保存被删除时的原始记录内容deleted_by/deleted_at记录操作者与删除时间参见 useDeletedRecordsListController 文档。DeletedRecordRepresentation负责渲染记录的表征record representation详见 DeletedRecordRepresentation 文档。详情层点击 Details 后将record传入ShowDeletedBase record{record}其内部会建立ShowContext使WithRecord能够读取到被删除记录的原始字段record.title、record.description。注意由于data字段存放原记录内容WithRecord中回调收到的record参数即为原始记录对象可直接按字段名访问。四、Props 全解官方文档对ShowDeletedBase的 Props 给出了精炼的表格完整整理如下PropRequiredTypeDefaultDescriptionchildrenRequiredElement用于渲染已删除记录内容的组件如WithRecord、SimpleShowLayout等。recordOptionalRaRecord要展示的已删除记录。若未提供则使用最近的RecordContext中的记录。4.1children必填children是渲染已删除记录的实际内容。由于ShowDeletedBase建立的是与ShowBase相同的ShowContext你可以自由组合各类上下文感知组件WithRecord以 render prop 形式接收当前记录实现完全自定义的字段渲染开源版展示组件如TextField、SimpleShowLayout它们通过useRecordContext()读取记录只要包在ShowDeletedBase内即可正常工作任意自定义按钮、交互元素在官方示例中Details / Close 按钮就与字段渲染混排在同一 children 树中。4.2record可选record用于显式指定要展示的已删除记录。两个常见使用场景列表详情联动像官方示例那样从WithListContext的data中取出DeletedRecordType对象后直接传入省略传参若组件外层已经存在RecordContext例如在DeletedRecordsList的行上下文中可省略record组件会自动从最近的RecordContext读取记录。五、底层原理数据从哪来ShowDeletedBase本身是展示型无头组件它自身的记录数据通过recordprop 或RecordContext提供但在更常见的场景中不手动传入 record按 id 获取已删除记录这一数据获取动作由配套 hook 完成底层数据方法为dataProvider.getOneDeleted()对应 hook 为useGetOneDeleted。该 hook 在组件挂载时调用dataProvider.getOneDeleted()按 id 查询单条已删除记录并返回{ data, isPending, error, refetch }它的 react-query query key 为[getOneDeleted, { id: String(id), meta }]meta参数可选可向 data provider 传递字段选择等附加信息返回的data同样符合DeletedRecordType结构可通过deletedRecord.data.username、deletedRecord.deleted_by等方式访问原始记录与删除元信息ShowDeletedBase提供的ShowContext与开源版ShowBase其背后是useShowControllerhook保持同一形态这正是 children 组件可以无差别复用的根本原因——从组件树契约上看展示一条被删除的记录与展示一条普通记录对 UI 层是透明的。从源码结构看可以推断react-admin/ra-core-ee内部会将record/RecordContext的记录放入ShowContext并复用 react-admin 的上下文机制完成数据下发由于该包闭源具体实现细节以官方文档描述为准。六、安全与权限约束虽然ShowDeletedBase本身只负责渲染但它所在的删除记录页面整体受到 react-admin 企业版的访问控制约束。以同系列的useDeletedRecordsListController/DeletedRecordsListBase为例两者同属ra-soft-delete能力集默认要求用户已认证匿名访问会被重定向到登录页可通过disableAuthentication关闭见 DeletedRecordsListBase 文档若 authProvider 实现了访问控制Access Control列表控制器会调用authProvider.canAccess()参数为{ resource: ra-soft-delete, action: list_deleted_records }无权限用户将被重定向到 Access Denied 页面见 useDeletedRecordsListController 文档。因此在部署ShowDeletedBase时建议将详情展示路由同样纳入上述鉴权体系确保查看已删除记录与列出已删除记录的权限口径一致。七、与相关组件的协作全景ShowDeletedBase不是孤立组件它处于 react-admin 软删除功能集的详情展示一环。一张完整的能力地图如下环节组件 / Hook数据方法上下文文档已删除记录列表DeletedRecordsListBase/useDeletedRecordsListControllergetListDeleted()ListContextDeletedRecordsListBase单条获取useGetOneDeletedgetOneDeleted()直接返回值useGetOneDeleted单条表征DeletedRecordRepresentation读取recordRecordContextDeletedRecordRepresentation详情展示无头ShowDeletedBase读取record/RecordContextShowContextShowDeletedBase详情展示完整版ShowDeleted上下文注入ShowContextShowDeleted软删除 data providerSoftDeleteDataProvidergetListDeleted/getOneDeleted等-SoftDeleteDataProvider选型建议追求完全自定义、嵌入式的详情视图如手写ulWithRecord或内嵌在列表行中展开时选ShowDeletedBase希望开箱即用的弹窗详情配合DeletedRecordsList的detailComponents与DeletedRecordsTable行点击时选ShowDeleted。两条路线共用同一ShowContext契约迁移成本很低——children 组件可以原样复用。八、小结ShowDeletedBase是 react-admin Enterprise Edition 软删除能力中详情展示一环的轻量选择它以ShowBase同款的无头形态与ShowContext契约为已删除记录提供完全自定义的渲染入口配合DeletedRecordsListBase、DeletedRecordRepresentation与WithRecord即可在不依赖任何默认布局的前提下构建出贴合业务需求的回收站详情页。理解其record来源 ShowContext下发 getOneDeleted数据通路的三角结构是安全、正确地使用它的关键。赞分享前端UI组件【免费下载链接】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点击查看免费下载相关推荐react-admin ShowDeleted 组件指南在删除记录列表中安全展示已删除数据react admin ShowDeleted 组件指南在删除记录列表中安全展示已删除数据 ShowDeleted 是 react admin 软删除s前端UI组件react-admin 软删除实战深入掌握 DeletedRecordsList 组件react admin 软删除实战深入掌握 DeletedRecordsList 组件 DeletedRecordsList 是 react admin前端UI组件Wuthering Waves Model Importer终极3D模型加载工具完整指南Wuthering Waves Model Importer终极3D模型加载工具完整指南 Wuthering Waves Model Importer简称W前端UI组件上一篇Blackbone深度解析Windows内存操作与进程防护技术实现原理下一篇Effect ManagedRuntime 支持 await usingSymbol.asyncDispose 变更集与资源自动释放机制解读创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

在线ocr性能优化保姆级教程:面试原理答不上来的坑

在线ocr性能优化保姆级教程:面试原理答不上来的坑

在线ocr性能优化保姆级教程:面试原理答不上来的坑 上周有个老哥来找我,说刚结束一场大厂后端面试,挂了。挂的原因特别尴尬:面试官问在线ocr服务在高并发下为什么响应慢,他愣了半分钟,只说了句“网络波动吧”。这场景我太熟了,很多人以为ocr就…

2026/9/21 19:31:02 阅读更多 →
装修招标网实战:2026最新源码拆解与职业进阶指南

装修招标网实战:2026最新源码拆解与职业进阶指南

装修招标网实战:2026最新源码拆解与职业进阶指南 看了一堆教程还是不会写项目?这是很多转行做后端开发的兄弟最真实的写照。别慌,2026最新的实战思路已经变了,光懂语法没用,得懂业务怎么落地。今天我们就拿一个极具代表性的业务场景——…

2026/9/21 19:31:02 阅读更多 →
AirSim+ROS2集成实战指南:airsim_ros_pkgs配置与话题桥接全流程

AirSim+ROS2集成实战指南:airsim_ros_pkgs配置与话题桥接全流程

AirSimROS2集成实战指南:airsim_ros_pkgs配置与话题桥接全流程 【免费下载链接】AirSim Open source simulator for autonomous vehicles built on Unreal Engine / Unity, from Microsoft AI & Research 项目地址: https://gitcode.com/gh_mirrors/ai/AirSim…

2026/9/21 19:31:02 阅读更多 →

最新新闻

猴子摘鲜果源码解析:新手避坑与多语言选型实战指南

猴子摘鲜果源码解析:新手避坑与多语言选型实战指南

猴子摘鲜果源码解析:新手避坑与多语言选型实战指南 配置环境就卡半天,是不是你的常态?很多刚入行的应届生朋友,面对经典的“猴子摘鲜果”算法题,还没开始写逻辑,就在 Python 和 Java 的环境切换中耗尽了耐心。这种 新手避坑…

2026/9/21 20:05:17 阅读更多 →
3个不可能的任务性能优化方案,面试必问实战拆解

3个不可能的任务性能优化方案,面试必问实战拆解

3个不可能的任务性能优化方案,面试必问实战拆解 看了一堆教程还是不会写项目?这是不是你的常态?视频里代码跑得飞快,自己一动手就报错。更扎心的是,面试官抛出一个性能优化场景,你愣在原地,脑子里全是 for 循环和 map…

2026/9/21 20:05:17 阅读更多 →
乔布斯癌症面试真题完整示例:3步拆解考点与避坑

乔布斯癌症面试真题完整示例:3步拆解考点与避坑

乔布斯癌症面试真题完整示例:3步拆解考点与避坑 刚拿到“乔布斯癌症”相关的面试题,复制网上的答案背了半小时,结果面试官问第二层逻辑时直接卡壳。那种感觉就像你手里攥着一把生锈的钥匙,硬插进锁孔,怎么都拧不动。别慌,这种“复制来的代码跑不通不知…

2026/9/21 20:05:17 阅读更多 →
xxxsss常见报错与解决

xxxsss常见报错与解决

3个核心避坑指南:培训机构选型与通过率真相 刚拿到那份“高薪就业”的推荐名单?别急着交钱。 你是不是也遇到过这种情况:网上搜了一堆“最佳实践”,复制下来的代码在本地环境里跑不通,报错信息看得人头大,完全不知道从哪开始调。…

2026/9/21 20:05:17 阅读更多 →
5步搞定搜索快捷键:源码解析背后的性能优化实战

5步搞定搜索快捷键:源码解析背后的性能优化实战

5步搞定搜索快捷键:源码解析背后的性能优化实战 看了一堆教程还是不会写项目?这种挫败感我太懂了。你盯着屏幕上的代码,明明每个字符都认识,合起来就是跑不通。问题往往不在语法,而在你对底层逻辑的“黑盒”认知缺失。今天我们就拿【搜索快捷键】这个看…

2026/9/21 20:05:17 阅读更多 →
欲练此功必先自宫:后端开发最佳实践与面试避坑指南

欲练此功必先自宫:后端开发最佳实践与面试避坑指南

欲练此功必先自宫:后端开发最佳实践与面试避坑指南 面试被问原理答不上来,是不是觉得脑子里一片浆糊?别慌,这不是你笨,而是你一直只记结论,没摸透底层逻辑。很多新人学编程,就像练绝世武功,光背招式口诀,连内力运行路线都没搞清,遇到变招直接卡壳。…

2026/9/21 20:04:17 阅读更多 →

日新闻

agents-generator 决策矩阵全解析:从项目检测到 AGENTS.md 规则生成的 16 步判定流程

agents-generator 决策矩阵全解析:从项目检测到 AGENTS.md 规则生成的 16 步判定流程

agents-generator 决策矩阵全解析:从项目检测到 AGENTS.md 规则生成的 16 步判定流程 【免费下载链接】agentic-awesome-skills AAS Core is the local, agent-first control plane for complete catalog discovery, agent-owned selection, stack validation, and …

2026/9/21 0:00:01 阅读更多 →
gin-vue-admin 前端工具函数全景指南:src/utils 复用规范与源码级解析

gin-vue-admin 前端工具函数全景指南:src/utils 复用规范与源码级解析

gin-vue-admin 前端工具函数全景指南:src/utils 复用规范与源码级解析 【免费下载链接】gin-vue-admin 🚀ViteVue3Gin拥有AI辅助的基础开发平台,企业级业务AI开发解决方案,内置mcp辅助服务,内置skills管理,…

2026/9/21 0:00:01 阅读更多 →
Wox 全功能插件开发实战指南:基于 Python / Node.js 宿主与 WebSocket 的持久化插件体系

Wox 全功能插件开发实战指南:基于 Python / Node.js 宿主与 WebSocket 的持久化插件体系

桌面应用AI 应用插件系统 【免费下载链接】Wox A cross-platform launcher that simply works 项目地址: https://gitcode.com/gh_mirrors/wo/Wox 点击查看 免费下载 全功能插件(Full-featured Plugin)是 Wox 三类插件实现方式中能力最完整的…

2026/9/21 0:00:01 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/21 3:13:20 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/21 2:19:36 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/21 4:51:05 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/21 15:36:51 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/21 15:36:51 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/19 23:35:34 阅读更多 →