Refine v5 + shadcn/ui:打造可复用的 ErrorComponent 404 错误页
Refine v5 shadcn/ui打造可复用的 ErrorComponent 404 错误页【免费下载链接】refineA React Framework for building internal tools, admin panels, dashboards B2B apps with unmatched flexibility.项目地址: https://gitcode.com/GitHub_Trending/re/refine在 Refine v5 的 shadcn/ui 技术栈中ErrorComponent是 refine-ui 组件注册表registry提供的一个 404 错误页组件当用户访问了不存在的链接或导航到了尚未实现的资源页面时它会展示一个带有清晰文案、404 视觉图形和返回首页按钮的错误页帮助用户优雅地从错误中恢复而不是面对浏览器默认的 404 提示。读完本文你将掌握通过 shadcn CLI 安装该组件、将其接入路由作为 catch-all 404 页面的完整流程并能基于源码理解其国际化文案、资源缺失提示Tooltip与useGo导航跳转的实现机制以及它与refinedev/core内置ErrorComponent的差异。组件概览根据文档 shadcn/ui ErrorComponent该组件的定位是为管理后台提供一个打磨过的错误页面包含明确的错误消息、视觉图形和导航选项且会自动适配你的主题设置与仪表盘其余部分保持视觉一致。在仓库中该组件的源码实现位于 error-component.tsx其 shadcn registry 元数据安装清单位于 error-component.json。从 registry 清单可以确认它的关键属性属性值说明nameerror-componentregistry 中的组件名typeregistry:component作为 shadcn 组件被安装dependenciesrefinedev/core、lucide-react安装时自动加入 npm 依赖registryDependenciesbutton、tooltip安装时一并拉取的 shadcn 基础组件files[0].targetsrc/components/refine-ui/layout/error-component.tsx落地到项目中的目标路径categorieserror、layout、404、pages分类标签也就是说它依赖refinedev/core提供的useGo、useResourceParams、useTranslate三个 Hook依赖lucide-react提供ChevronLeft、InfoIcon图标并复用 shadcn 的Button与Tooltip组件。安装文档给出的安装命令是npx shadcnlatest add https://ui.refine.dev/r/error-component.json这条命令会从 refine 的 shadcn registry 拉取 error-component.json 清单自动安装refinedev/core与lucide-react两个包依赖以及button、tooltip两个 registry 基础组件将组件文件写入项目的src/components/refine-ui/layout/error-component.tsx对应清单中的target字段。安装完成后你得到的就是一个带返回首页导航的完整 404 错误页无需再手写任何布局代码。使用将组件作为 404 页面直接使用import { ErrorComponent } from /components/refine-ui/layout/error-component; export default function NotFoundPage() { return ErrorComponent /; }组件会自动提供友好的错误消息和返回应用首页的按钮并适配主题设置保持与仪表盘其他部分的视觉一致性。与路由集成作为 catch-all 404 路由在大多数 React Router 项目中可以把该组件用作通配路由catch-all route// In your routing configuration import { ErrorComponent } from /components/refine-ui/layout/error-component; function App() { return ( Routes {/* Your other routes */} Route path* element{ErrorComponent /} / /Routes ); }这个catch-all 写法并不是孤立的示例。从源码结构看Refine CLI 在检测到项目已有 React Router 配置时就会自动生成完全相同的路由形态react-router.ts 会向App中注入refinedev/core的ErrorComponent并添加Route path* element{ErrorComponent /} /其测试夹具 with-existing-react-router-setup.ts 中展示的正是这一结构。对于 shadcn 技术栈只是把导入源换成了 refine-ui registry 中样式更精致的这个实现。另外需要注意 v5 的导入位置变化v5 的 codemod 测试 rename-themed-v2-imports.test.ts 显示旧版本中ErrorComponent从refinedev/antd、refinedev/mui等 UI 包导出v5 迁移时会被自动改写导入路径。如果你在老项目中看到import { ErrorComponent } from refinedev/antd可以运行 codemod 或手动改为从 core / refine-ui 导入。源码深潜shadcn 版 ErrorComponent 如何工作下面结合 error-component.tsx 的完整实现逐段拆解。三个核心 HookuseTranslate、useGo、useResourceParamsconst [errorMessage, setErrorMessage] useStatestring(); const translate useTranslate(); const go useGo(); const { resource, action } useResourceParams();useResourceParams()从当前路由中解析出resource资源如posts与action动作如create、list。这是 Refine 路由约定/:resource/:action的直接产物useGo()Refine 的跨路由导航 Hook底层委托给路由 providerReact Router、Next.js Router 等的go实现useTranslate()国际化 Hook所有可见文案都通过它渲染未配置 i18n 时使用传入的英文默认值。资源缺失提示Tooltip 的显示逻辑组件通过useEffect监听路由参数决定是否需要显示一条开发者提示源码 L28-L41useEffect(() { if (resource action) { setErrorMessage( translate( pages.error.info, { action: action, resource: resource?.name, }, You may have forgotten to add the ${action} component to ${resource?.name} resource., ), ); } }, [resource, action, translate]);这里体现了一个很有价值的错误页设计思路访问的是任意不存在的路径如/foo/barresource与action都为空只显示通用 404 文案访问的是符合 Refine 约定但组件缺失的页面如路由解析出了resource: posts、action: create却没有注册对应的 Create 页面错误页会在描述文案旁显示一个InfoIcon图标悬停 Tooltip 提示You may have forgotten to add the create component to posts resource.直接告诉开发者缺的是哪个资源的哪个页面大幅缩短排障时间。对应源码 L98-L117 的渲染结构为TooltipProvider Tooltip TooltipTrigger(asChild, InfoIcon) TooltipContent且只有errorMessage存在时才渲染图标上还带有data-testiderror-component-tooltip便于 E2E 测试定位。视觉与布局组件使用 Tailwind 类名通过cn工具函数合并见源码 L43-L52构建外层容器flex items-center justify-center bg-background my-auto让 404 页面在整个视口中垂直水平居中并使用主题 tokenbg-background保证深浅色主题下都正确中间的404字样是一个内联 SVGL55-L81使用#D4D4D8 - #E4E4E7的线性渐变填充宽度固定w-48、高度自适应标题text-2xl font-semibold text-foreground描述文案text-muted-foreground同样全部使用语义化颜色 token天然跟随主题切换。返回首页按钮按钮实现源码 L121-L129Button onClick{() { go({ to: / }); }} className{cn(flex, items-center, gap-2, mx-auto)} ChevronLeft className{cn(h-4, w-4)} / {translate(pages.error.backHome, Back to hompeage)} /Button点击后调用go({ to: / })导航回应用根路径。由于useGo抽象了具体路由实现同一段代码在 React Router、Next.js、Remix 等任何 Refine 支持的路由器下都能工作。国际化文案键shadcn 版组件使用以下翻译键第二个参数为无 i18n 配置时的英文回退值翻译键默认文案出现位置pages.error.titlePage not found.页面标题h1pages.error.descriptionThe page youre looking for does not exist.描述段落pages.error.infoYou may have forgotten to add the {action} component to {resource} resource.资源缺失时的 Tooltippages.error.backHomeBack to hompeage返回按钮如果你的应用配置了i18nProvider只需在语言包中提供这些键的翻译整个错误页即可完全本地化。与 refinedev/core 内置 ErrorComponent 的关系Refine core 一直内置一个无样式的ErrorComponentpackages/core/src/components/pages/error/index.tsx逻辑与 shadcn 版几乎一致同样使用useTranslate/useGo/useResourceParams同样在存在resource与action时生成资源缺失提示文案按钮同样执行go({ to: / })。两者的差异主要在呈现层core 版仅输出原生h1、p、button翻译键为pages.error.404/pages.error.info/pages.error.backHome适合 headless 场景或自定义 UI 的基础shadcn 版使用 shadcnButton/Tooltip、内联 404 SVG 与 Tailwind 主题 token标题与描述拆分为pages.error.title/pages.error.description两个键视觉更精致且自带交互提示。core 版的行为有完整测试佐证index.spec.tsx当 mock 路由 provider 给出action: create、resource: { name: posts }时页面会渲染You may have forgotten to add the create component to posts resource.点击 Back Home 后go恰被调用一次且参数为{ to: / }。这验证了两版组件共享同一套错误语义。小结与最佳实践安装npx shadcnlatest add https://ui.refine.dev/r/error-component.json组件落地到src/components/refine-ui/layout/error-component.tsx自动补齐refinedev/core、lucide-react与 button/tooltip 依赖路由接入在Routes末尾声明Route path* element{ErrorComponent /} /即可覆盖所有未匹配路径利用资源提示当 URL 符合/:resource/:action约定但页面缺失时错误页 Tooltip 会直接指出缺失的资源与动作这是排查路由配了但忘写页面类问题最快的入口跟随主题与 i18n组件只使用语义化颜色 token 与翻译键接入你的 shadcn 主题和 i18nProvider 后无需任何额外适配区分使用场景headless 项目可用refinedev/core内置版自行定制shadcn 技术栈则优先使用 refine-ui registry 的这版实现保持与 refine-ui 其他视图list/create/edit 等一致的视觉语言。相关参考路径组件源码 packages/refine-ui/registry/new-york/refine-ui/layout/error-component.tsx、registry 清单 packages/refine-ui/public/r/error-component.json、core 内置实现 packages/core/src/components/pages/error/index.tsx 及其测试 packages/core/src/components/pages/error/index.spec.tsx。【免费下载链接】refineA React Framework for building internal tools, admin panels, dashboards B2B apps with unmatched flexibility.项目地址: https://gitcode.com/GitHub_Trending/re/refine创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

Vant 内置样式(Built-in Style)完全指南:文字省略、Hairline、安全区与动画等实用工具类

Vant 内置样式(Built-in Style)完全指南:文字省略、Hairline、安全区与动画等实用工具类

Vant 内置样式(Built-in Style)完全指南:文字省略、Hairline、安全区与动画等实用工具类 【免费下载链接】vant A lightweight, customizable Vue UI library for mobile web apps. 项目地址: https://gitcode.com/GitHub_Trending/va/vant…

2026/9/13 19:08:54 阅读更多 →
重庆大学数据库.zip实战指南:openGauss/GaussDB课程设计快速上手

重庆大学数据库.zip实战指南:openGauss/GaussDB课程设计快速上手

简介:本资源是重庆大学数据库课程的全套学习资料包,面向计算机专业本科生及数据库初学者,聚焦课程复习、实验实操与考试备考三大核心需求。压缩包共185个文件,涵盖25个PDF(含历年试题及答案解析)、26个PPT/…

2026/9/13 19:08:54 阅读更多 →
GoFr 框架入门:零样板构建可观测的生产级 Go 微服务

GoFr 框架入门:零样板构建可观测的生产级 Go 微服务

GoFr 框架入门:零样板构建可观测的生产级 Go 微服务 【免费下载链接】gofr An opinionated GoLang framework for accelerated microservice development. Built in support for databases and observability. 项目地址: https://gitcode.com/GitHub_Trending/go/…

2026/9/13 19:07:54 阅读更多 →

最新新闻

Unity资源导入管线全解析:从meta文件到Library,解决加载与材质丢失

Unity资源导入管线全解析:从meta文件到Library,解决加载与材质丢失

久等不来的资源加载、莫名其妙的材质丢失、改了图片却半天不刷新——如果你在 Unity 项目里遇到这些情况,十有八九是没搞懂资源导入管线在背后替你做了什么。这个系列开篇,我就来把 Asset Import Pipeline 这层窗户纸捅破:它到底是什么、Unit…

2026/9/14 21:49:16 阅读更多 →
HTML5+CSS3实战:解析‘千年之恋’静态页面的布局、动画与表单增强

HTML5+CSS3实战:解析‘千年之恋’静态页面的布局、动画与表单增强

简介:一份基于HTML5和CSS3实现的“千年之恋”主题网页源码,以模拟相亲网站为场景,面向前端入门与进阶学习者,可用于练习语义化标签、表单控件、本地存储以及Flexbox/Grid布局等现代Web技术。压缩包内共7个文件,包括1个…

2026/9/14 21:49:16 阅读更多 →
HoRain云--Java 集合源码剖析:HashMap 从 put 到扩容的完整流程

HoRain云--Java 集合源码剖析:HashMap 从 put 到扩容的完整流程

1. 数据结构JDK 8 后,HashMap 使用数组 链表 红黑树。2. hash 扰动static final int hash(Object key) {int h;return (key null) ? 0 : (h key.hashCode()) ^ (h >>> 16); }让高位参与运算,减少哈希冲突。3. put 流程计算 hash。定位数组…

2026/9/14 21:49:16 阅读更多 →
HoRain云--Spring Boot 3 全面升级指南:Jakarta EE、GraalVM 与可观测性

HoRain云--Spring Boot 3 全面升级指南:Jakarta EE、GraalVM 与可观测性

1. Jakarta EE 迁移所有 javax.* 包替换为 jakarta.*:import jakarta.servlet.http.HttpServletRequest;2. Spring Security 配置变化http.authorizeHttpRequests(auth -> auth.requestMatchers("/public/**").permitAll().anyRequest().authenticated…

2026/9/14 21:49:16 阅读更多 →
Vue3+ECharts+DataV数据可视化实战:大屏开发工程化方案

Vue3+ECharts+DataV数据可视化实战:大屏开发工程化方案

简介:这是一套基于Vue.js构建的数据可视化系统实战项目,面向前端开发者与数据可视化初学者,解决企业级大屏开发中框架集成、图表动态渲染与UI组件复用等核心问题。资源包含116个文件,主体为20个Vue组件、19个JS逻辑脚本&#xff0…

2026/9/14 21:49:16 阅读更多 →
数据库巡检Word报告一键生成:Linux命令与Python自动化实战

数据库巡检Word报告一键生成:Linux命令与Python自动化实战

数据库巡检这种事,平时看着不起眼,真到了月底季末要汇总报告的时候,能把人折腾到怀疑人生。我从裸写SQL到后来做自动化巡检,中间踩了不少坑,今天就把这套“数据库巡检Word报告一键生成”的完整思路和落地步骤分享出来&…

2026/9/14 21:48:14 阅读更多 →

日新闻

AI音乐侵权案中的测试工程与版权保护技术

AI音乐侵权案中的测试工程与版权保护技术

1. 项目概述:当测试工程师遇上AI音乐侵权案去年夏天,我作为技术顾问参与了一起特殊的著作权纠纷案——某音乐平台AI作曲功能被指控批量侵权。这起案件的特殊性在于:原告方并非传统音乐人,而是一家拥有百万级曲库的数字音乐发行商&…

2026/9/14 0:00:26 阅读更多 →
嵌入式面试I2C与SPI深度解析:从协议到量产调试

嵌入式面试I2C与SPI深度解析:从协议到量产调试

1. 这份“高频知识点洞察”到底是什么,又为什么值得你花时间细读? 如果你最近在刷嵌入式开发岗位的招聘JD,或者正坐在工位上改第7版简历,又或者刚被面试官一句“讲讲I2C和SPI的区别”问得手心冒汗——那你不是一个人。过去两年我带…

2026/9/14 0:00:26 阅读更多 →
51单片机开环控制磁阻传感器的硬件匹配与代码实现

51单片机开环控制磁阻传感器的硬件匹配与代码实现

简介:本资源是一份面向嵌入式初学者与单片机课程实践者的51单片机开关磁阻电机(SRM)开环控制教学方案,聚焦磁阻位置检测、固定时序驱动与基础状态可视化。资源包含1个C语言主程序文件(zhuang600.c)实现电机…

2026/9/14 0:00:26 阅读更多 →

周新闻

AI SDK Harness 依赖更新指南:掌握 harness 包 SDK 依赖的升级、桥接同步与一致性校验

AI SDK Harness 依赖更新指南:掌握 harness 包 SDK 依赖的升级、桥接同步与一致性校验

AI SDK Harness 依赖更新指南:掌握 harness 包 SDK 依赖的升级、桥接同步与一致性校验 【免费下载链接】ai The AI Toolkit for TypeScript. From the creators of Next.js, the AI SDK is a free open-source library for building AI-powered applications and ag…

2026/9/14 5:45:49 阅读更多 →
Refine v5 Ant Design NumberField 组件实战:基于 Intl 的本地化数字格式化

Refine v5 Ant Design NumberField 组件实战:基于 Intl 的本地化数字格式化

Refine v5 Ant Design NumberField 组件实战:基于 Intl 的本地化数字格式化 【免费下载链接】refine A React Framework for building internal tools, admin panels, dashboards & B2B apps with unmatched flexibility. 项目地址: https://gitcode.com/GitH…

2026/9/14 0:52:26 阅读更多 →
Flutter应用改名全指南:从Android到iOS的配置与工具实践

Flutter应用改名全指南:从Android到iOS的配置与工具实践

刚接一个外包项目时,甲方要求把工程里临时用的应用名改成正式产品名。我本来觉得“改名”这种小事,打开配置文件改一行不就完了?结果真动手才发现,Flutter项目里“应用名称”根本不是一处配置,而是一整套散落在 Androi…

2026/9/14 0:06:41 阅读更多 →

月新闻

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

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

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

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

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

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

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

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

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

2026/9/14 5:45:14 阅读更多 →