react-admin 软删除实战:useSoftDelete Hook 完整指南(参数、用法与源码对照)
react-admin 软删除实战useSoftDelete Hook 完整指南参数、用法与源码对照【免费下载链接】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-adminuseSoftDelete是 react-admin 企业版扩展包react-admin/ra-soft-delete提供的 mutation Hook用于在触发回调时调用dataProvider.softDelete()按id将单条记录软删除标记删除而非物理删除。本文以 docs/useSoftDelete.md 为核心骨架结合仓库内useDelete的开源实现源码完整讲解该 Hook 的签名、参数、两种调用方式、authorId自动填充机制、TypeScript 泛型以及它背后的数据提供者契约让你能在自定义按钮、表单动作或任意组件中安全可靠地实现归档/回收站能力。软删除与useSoftDelete的定位在传统 CRUD 中useDelete调用dataProvider.delete()会从数据库物理移除记录。而很多业务审计、回收站、可恢复归档需要一种软删除记录并未真正消失只是被标记为已删除可以随时浏览、恢复。useSoftDelete正是为此设计它与useDelete工作方式完全一致区别仅在于底层调用的是dataProvider.softDelete()而非dataProvider.delete()可参见 docs/useDelete.md 中的说明。该 Hook 是 Enterprise Edition 附加组件ra-soft-delete的一部分需要安装并激活企业版许可证npm install --save react-admin/ra-soft-delete # 或 yarn add react-admin/ra-soft-delete安装后在 react-admin 应用中无需额外配置即可在任意自定义组件中使用该 Hook数据提供者端的方法实现见 docs/SoftDeleteDataProvider.md。Hook 签名与参数详解useSoftDelete的完整签名如下const [softDeleteOne, { data, isPending, error }] useSoftDelete( resource, { id, authorId, previousData, meta }, options, );参数类型必填说明resourcestring是目标资源名例如postsparams.idIdentifier是待软删除记录的标识符params.authorIdIdentifier否执行删除操作的用户 ID未提供时自动填充见下文params.previousDataRecord否软删除前的记录快照用于乐观更新与回滚params.metaany否透传给 data provider 的元数据如自定义请求头optionsUseMutationOptions否react-queryuseMutation选项可含onSuccess、onError、onSettled、mutationMode等返回值是一个二元组第一个元素softDeleteOne触发软删除的回调函数可以像调用 Hook 一样接收(resource, params, options)第二个元素mutation 状态对象常用data删除成功返回的记录、isPending请求进行中、error失败原因此外还暴露 react-queryuseMutation的全部状态与方法如reset、isIdle、isSuccess、isError。从开源仓库中useDelete的实现packages/ra-core/src/dataProvider/useDelete.ts可以推断useSoftDelete的内部结构与之类似通过useDataProvider()取得 data provider将 mutation 委托给useMutationWithMutationMode并校验resource与id非空后才会调用dataProvider.softDelete()。两种参数传递方式何时传参更合理useSoftDelete的参数既可以绑定在 Hook 调用时传入也可以在触发softDeleteOne回调时传入// 方式一调用 Hook 时传参 const [softDeleteOne, { data, isPending, error }] useSoftDelete( likes, { id: record.id, previousData: record }, ); // 方式二触发回调时传参 const [softDeleteOne, { data, isPending, error }] useSoftDelete(); softDeleteOne(likes, { id: record.id, previousData: record });官方文档明确建议当两种方式都可行时优先选择在调用softDeleteOne回调时传参第二种示例。这样 Hook 与具体资源/记录解耦组件更易复用例如同一按钮组件可以在不同记录上下文下被多次使用。这一机制与useDelete的useEvent封装一致。查看 useDelete.ts 可以看到回调签名是deleteOne( callTimeResource resource, // 回调时传参优先缺省回退到 Hook 参数 callTimeParams {}, // 回调时的 params 与 Hook 时 params 合并 callTimeOptions {}, )即调用时刻传入的resource、params会覆盖 Hook 调用时刻的默认值两者通过参数展开合并这保证了两种写法行为等价。authorId自动填充的审计字段params.authorId是软删除特有的参数用于记录谁删除了这条记录是审计与追责的关键数据。官方文档给出的 Tip 是如果未显式提供authorIduseSoftDelete会自动通过authProvider.getIdentity()获取当前用户身份并取返回身份对象的id字段作为authorId若authProvider未实现getIdentity或返回对象没有id字段则该字段留空。这意味着只要你的authProvider实现了getIdentity例如返回{ id: 123, fullName: John Doe }软删除请求会自动携带authorId: 123无需手工传入authorId的填充发生在请求发出之前最终会随softDelete参数一起发送给 data provider见 docs/SoftDeleteDataProvider.md 中softDelete方法的{ id, authorId }参数解构示例建议始终保证getIdentity返回的id是稳定、可持久化的标识如用户表主键而非易变字段。实战示例自定义软删除按钮官方文档给出了两种完整的组件示例以下完整保留并补充注释// 写法一在调用 Hook 时设置参数 import { useRecordContext } from react-admin; import { useSoftDelete } from react-admin/ra-soft-delete; const SoftDeleteButton () { const record useRecordContext(); const [softDeleteOne, { isPending, error }] useSoftDelete( likes, { id: record.id, previousData: record } // authorId 可省略自动填充 ); const handleClick () { softDeleteOne(); } if (error) { return pERROR/p; } return button disabled{isPending} onClick{handleClick}Delete/button; };// 写法二官方推荐在调用 softDeleteOne 回调时设置参数 import { useRecordContext } from react-admin; import { useSoftDelete } from react-admin/ra-soft-delete; const SoftDeleteButton () { const record useRecordContext(); const [softDeleteOne, { isPending, error }] useSoftDelete(); const handleClick () { softDeleteOne( likes, { id: record.id, previousData: record } ); } if (error) { return pERROR/p; } return button disabled{isPending} onClick{handleClick}Delete/button; };示例中的关键实践点useRecordContext()从 react-admin 的 RecordContext 读取当前记录配合列表、详情页等场景无需手工传 recordpreviousData: record传入删除前的完整记录快照供乐观更新在失败时回滚 UIisPending请求期间禁用按钮防止重复提交error失败时给出明确反馈示例中直接渲染错误提示。如果只是需要现成的按钮组件也可以直接使用react-admin/ra-soft-delete提供的SoftDeleteButton默认标签为 Archive支持mutationMode、mutationOptions、redirect、successMessage、访问控制等完整 props而useSoftDelete则用于需要完全掌控触发逻辑的自定义场景。TypeScript记录类型与错误类型的泛型收窄useSoftDelete接受两个泛型参数记录类型继承RaRecord与错误类型从而让onError、onSettled等回调获得完整类型推断useSoftDeleteProduct, Error(undefined, undefined, { onError: (error) { // TypeScript 知道 error 是 Error 类型 }, onSettled: (data, error) { // TypeScript 知道 data 是 Product 类型 // TypeScript 知道 error 是 Error 类型 }, });这与开源版useDelete的泛型设计一脉相承。查看 useDelete.ts 的类型定义export const useDelete RecordType extends RaRecord any, MutationError unknown, ( resource?: string, params: PartialDeleteParamsRecordType {}, options: UseDeleteOptionsRecordType, MutationError {} ): UseDeleteResultRecordType, MutationError { ... }可以推断useSoftDeleteProduct, Error中data被推断为Product | undefinederror被推断为Error回调中的data与error会随参数顺序自动关联收窄。底层原理从useDelete源码看 mutation 机制虽然react-admin/ra-soft-delete为闭源企业包但它在开源版 packages/ra-core/src/dataProvider/useDelete.ts 的基础上扩展而来两者共享同一套 mutation 架构因此可以从useDelete的实现理解useSoftDelete的运行机制mutation 核心Hook 内部通过useMutationWithMutationMode封装 react-query 的useMutationuseDelete.ts因此options支持 react-query 的onSuccess/onError/onSettled等选项并额外支持mutationMode与自定义mutationFnmutation 模式支持pessimistic默认、optimistic、undoable。useDelete的默认值是pessimistic而SoftDeleteButton的默认值为undoable点击后 5 秒内可撤销缓存更新updateCache删除成功后useDelete会自动从getList、getInfiniteList、getMany、getManyReference四种查询缓存中移除该记录并同步递减totaluseDelete.ts。useSoftDelete预计执行类似逻辑——不过软删除场景下记录从列表消失但仍存在于回收站因此删除后通常还需要使getListDeleted相关查询失效结算处理onSettled无论成功失败都会对快照中的 query key 执行invalidateQueries强制刷新useDelete.ts保证界面与服务器状态一致。理解这层机制后你可以在options中放心使用mutationMode: undoable提供撤销能力或通过onSuccess触发通知、跳转等副作用。配套生态数据提供者契约与 Hook 家族useSoftDelete只是软删除方案中的一环。要让整个方案跑通data provider 必须实现对应的softDelete方法完整接口见 docs/SoftDeleteDataProvider.mdconst dataProviderWithSoftDelete: SoftDeleteDataProvider { ...dataProvider, softDelete: (resource, params: SoftDeleteParams): SoftDeleteResult { const { id, authorId } params; // ... return { data: deletedRecord }; }, // softDeleteMany、getOneDeleted、getListDeleted、 // restoreOne、restoreMany、hardDelete、hardDeleteMany ... };仓库中每个 data provider verb 都对应一个独立 Hook详见 docs/SoftDeleteDataProvider.mddata provider 方法对应 Hook作用softDeleteuseSoftDelete软删除单条记录softDeleteManyuseSoftDeleteMany软删除多条记录getListDeleteduseGetListDeleted获取已删除记录列表getOneDeleteduseGetOneDeleted获取单条已删除记录restoreOneuseRestoreOne恢复单条已删除记录restoreManyuseRestoreMany恢复多条已删除记录hardDeleteuseHardDelete永久删除单条记录hardDeleteManyuseHardDeleteMany永久删除多条记录这些 Hook 的签名风格与useSoftDelete完全一致支持 Hook 调用时传参或回调时传参两种方式例如useRestoreOne。此外ra-soft-delete还内置了两个 data provider 构建器addSoftDeleteBasedOnResource把已删除记录统一存入deleted_records资源与addSoftDeleteInPlace在原资源内标记deleted_at/deleted_by并让查询自动过滤可直接套在基础 data provider 上启用全套能力。软删除记录的结构理解useSoftDelete返回的data需要先知道已删除记录的数据结构见 docs/SoftDeleteDataProvider.md字段类型说明idIdentifier删除记录条目的 IDresourcestring被删除记录所属资源名deleted_atstring删除时间ISO 8601 格式deleted_byIdentifier可选执行删除的用户 ID即上文authorIddataRecord删除前的原始记录数据{ id: 123, resource: products, deleted_at: 2025-06-06T15:32:22Z, deleted_by: johndoe, data: { id: 456, title: Lorem ipsum, teaser: Lorem ipsum dolor sit amet, body: Lorem ipsum dolor sit amet, consectetur adipiscing elit, }, }因此在useSoftDelete成功回调中取到的data即为这样一个删除记录条目原始内容可通过data.data访问后续若需恢复则用条目id调用useRestoreOne注意恢复时使用的是删除记录条目的id而非原始记录 ID详见 docs/useRestoreOne.md 中的警告。小结useSoftDelete把软删除单条记录封装成了一个高可用的 mutation Hook参数可灵活绑定authorId自动审计TypeScript 类型完备且与 react-query 生态深度集成。配合ra-soft-delete提供的数据提供者契约、SoftDeleteButton组件及DeletedRecordsList界面你可以在不写任何删除逻辑样板代码的前提下为 react-admin 应用构建出归档 → 浏览回收站 → 恢复/彻底删除的完整软删除闭环。【免费下载链接】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),仅供参考

相关新闻

WTF终端仪表盘10个必装模块精选:从GitHub到天气,打造你的终极信息中枢

WTF终端仪表盘10个必装模块精选:从GitHub到天气,打造你的终极信息中枢

WTF终端仪表盘10个必装模块精选:从GitHub到天气,打造你的终极信息中枢 【免费下载链接】wtf The personal information dashboard for your terminal 项目地址: https://gitcode.com/gh_mirrors/wt/wtf WTF(wtfutil)是一款免费开源的终端个人仪表盘,专为开发者和技术爱好…

2026/9/21 2:28:22 阅读更多 →
CodeIgniter XML Helper 完全指南:xml_convert 用法、原理与实战

CodeIgniter XML Helper 完全指南:xml_convert 用法、原理与实战

后端Web框架 【免费下载链接】CodeIgniter Open Source PHP Framework (originally from EllisLab) 项目地址: https://gitcode.com/gh_mirrors/co/CodeIgniter 点击查看 免费下载 XML Helper 是 CodeIgniter 框架中用于辅助处理 XML 数据的函数集合,其…

2026/9/21 2:28:22 阅读更多 →
rrweb 控制台日志录制插件 @rrweb/rrweb-plugin-console-record:从配置实战到源码级原理与版本演进

rrweb 控制台日志录制插件 @rrweb/rrweb-plugin-console-record:从配置实战到源码级原理与版本演进

前端可观测性开发工具 【免费下载链接】rrweb record and replay the web 项目地址: https://gitcode.com/gh_mirrors/rr/rrweb 点击查看 免费下载 本篇技术指南以 rrweb 官方控制台录制插件 rrweb/rrweb-plugin-console-record 的 CHANGELOG 为主线,结…

2026/9/21 2:27:22 阅读更多 →

最新新闻

项目管理软件选型实战:从需求分析到红黑榜避坑指南

项目管理软件选型实战:从需求分析到红黑榜避坑指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/21 3:05:41 阅读更多 →
电子电工产品测试标准:安规、EMC与环境可靠性指南

电子电工产品测试标准:安规、EMC与环境可靠性指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/21 3:05:41 阅读更多 →
Egg 单元测试实战指南:基于 egg-unittest 技能与 @eggjs/mock 的完整测试方案

Egg 单元测试实战指南:基于 egg-unittest 技能与 @eggjs/mock 的完整测试方案

后端Web框架 【免费下载链接】egg 🥚🥚🥚🥚 Born to build better enterprise frameworks and apps with Node.js & Koa. https://307.run/eggcode 项目地址: https://gitcode.com/gh_mirrors/eg/egg 点击查看 免费…

2026/9/21 3:05:41 阅读更多 →
2026研发管理工具横评:九款主流平台对比与选型指南

2026研发管理工具横评:九款主流平台对比与选型指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/21 3:05:41 阅读更多 →
Realtek Ameba IoT芯片全解析:九款型号选型指南与实战避坑

Realtek Ameba IoT芯片全解析:九款型号选型指南与实战避坑

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/21 3:05:41 阅读更多 →
人工智能Python基础学习路径:从环境搭建到机器学习实战

人工智能Python基础学习路径:从环境搭建到机器学习实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/21 3:04:41 阅读更多 →

日新闻

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/20 0:00:46 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

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

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

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

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

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

2026/9/20 0:00:46 阅读更多 →

月新闻

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

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

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

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

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

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

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

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

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

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