Refine 自定义 Ant Design 主题实战:从预设主题到明暗切换的完整指南
Refine 自定义 Ant Design 主题实战从预设主题到明暗切换的完整指南【免费下载链接】refineA React Framework for building internal tools, admin panels, dashboards B2B apps with unmatched flexibility.项目地址: https://gitcode.com/GitHub_Trending/re/refineRefine 基于 Ant Design 提供了开箱即用的默认主题同时允许通过设计令牌Design Token与算法Algorithm深度定制界面风格。本篇以customization-theme-antd示例为骨架讲解如何引入RefineThemes预设主题、通过ConfigProvider覆盖主题令牌、使用预设算法实现明暗主题实时切换并结合仓库源码说明其底层实现原理。读完本文你将能够在自己的 Refine 管理后台中快速落地品牌化主题与明暗模式切换能力。主题定制能力概览在 Refine 项目中定制 Ant Design 主题核心思路与原生 Ant Design 保持一致通过修改设计令牌如主色colorPrimary、圆角borderRadius、边框色borderColor等来影响全局组件样式或通过切换算法Algorithm快速生成不同风格的整套主题。补充阅读Refine 官方 the ning 指南位于 documentation/docs/ui-integrations/ant-design/theming/index.md其中完整覆盖了预设主题、主题覆盖、预设算法与通知组件主题适配等内容。一键使用预设主题RefineThemesRefine 在refinedev/antd包中导出了名为RefineThemes的预设主题集合你无需手写任何令牌即可让整个应用换肤。其源码位于 packages/antd/src/definitions/themes/index.ts共定义了 7 套以主色区分的主题主题名主色 colorPrimary视觉风格Blue#1677FFAnt Design 经典蓝Purple#722ED1紫色Magenta#EB2F96品红Red#F5222D红色Orange#FA541C橙色Yellow#FAAD14黄色Green#52C41A绿色从上表可以看出每个预设主题本质上都是一个ThemeConfig对象内部仅通过设置token.colorPrimary改变全局主色。因此RefineThemes不仅可以直接使用也可以作为你自定义主题的起点。基础用法包裹 ConfigProvider要启用主题只需将ConfigProvider放在Refine外层并把RefineThemes.Blue传给其theme属性import { Refine } from refinedev/core; import { ThemedLayout, RefineThemes } from refinedev/antd; import { ConfigProvider } from antd; const App: React.FC () { return ( ConfigProvider theme{RefineThemes.Blue} Refine /* ... */ ThemedLayout{/* ... */}/ThemedLayout /Refine /ConfigProvider ); };由于ThemedLayout及其内部的 Sider、Header 等组件均基于 antd 组件构建它们会自动响应ConfigProvider注入的主题令牌。深度定制覆盖令牌与组件级配置如果预设主题不满足品牌需求你可以像下面这样直接在ConfigProvider.theme中覆盖主题既可以通过token修改全局令牌也可以通过components针对某个具体组件做局部调整。以下代码来自 examples/customization-theme-antd/src/App.tsx同时示范了两种粒度ConfigProvider theme{{ ...RefineThemes.Blue, components: { Button: { borderRadius: 0, }, Typography: { colorTextHeading: #1890ff, }, }, token: { colorPrimary: #f0f, }, }} 这段配置的含义是...RefineThemes.Blue先继承预设蓝色主题的令牌token.colorPrimary: #f0f覆盖全局主色为品红色按钮、链接、选中态等使用主色的组件会整体变色components.Button.borderRadius: 0将按钮圆角设为 0实现直角按钮components.Typography.colorTextHeading: #1890ff单独改变标题文字颜色。从 antd 的设计体系看组件级配置的优先级高于全局token而继承展开的预设主题则作为兜底值。这种预设 覆盖的组合方式既保留了默认主题的完整一致性又能精确控制个别视觉细节。基于预设算法实现明暗主题切换Ant Design 5 提供了三套预设算法theme.defaultAlgorithm默认亮色算法theme.darkAlgorithm暗色算法theme.compactAlgorithm紧凑算法缩小间距与字号。切换算法的唯一入口同样是ConfigProvider.theme.algorithm。Refine 的主题定制示例customization-theme-antd就是利用这一点在亮色/暗色两套算法之间动态切换实现一键换肤。第一步实现主题切换 Header示例中自定义了一个带切换按钮的 Header 组件源码位于 examples/customization-theme-antd/src/components/Header/index.tsx。它接收theme与setTheme两个 props点击按钮时在light与dark之间取反并用太阳/月亮 SVG 图标反馈当前状态import { Button, Space } from antd; import type { FC } from react; interface HeaderProps { theme: light | dark; setTheme: (theme: light | dark) void; } const Header: FCHeaderProps (props) { return ( Space directionvertical alignend style{{ padding: 1rem }} Button onClick{() { props.setTheme(props.theme light ? dark : light); }} icon{props.theme light ? IconMoonStars / : IconSun /} / /Space ); }; export default Header;第二步用 useState 驱动算法切换在 App.tsx 中组件用useStatelight | dark(dark)保存当前主题初始为暗色随后将状态与算法映射关系写入ConfigProvider.theme.algorithmconst [currentTheme, setCurrentTheme] useStatelight | dark(dark); ConfigProvider theme{{ ...RefineThemes.Blue, algorithm: currentTheme light ? theme.defaultAlgorithm : theme.darkAlgorithm, components: { Button: { borderRadius: 0 }, Typography: { colorTextHeading: #1890ff }, }, token: { colorPrimary: #f0f, }, }} 第三步把 Header 接入 ThemedLayout最后通过ThemedLayout的Header属性替换默认头部并把状态与更新函数传入ThemedLayout Header{() ( Header theme{currentTheme} setTheme{setCurrentTheme} / )} Outlet / /ThemedLayout点击 Header 中的切换按钮后currentTheme变化会触发algorithm重新计算整个页面包括布局、表格、表单、菜单都会在亮色与暗色之间平滑过渡。提示ThemedLayout还支持Sider、Title、Footer、OffLayoutArea等插槽属性用于替换默认的侧边栏、标题、页脚等区域其默认实现源码位于 packages/antd/src/components/themedLayout/index.tsx。默认 Header 则会通过theme.useToken()读取当前令牌如colorBgElevated来渲染背景色源码见 packages/antd/src/components/themedLayout/header/index.tsx因此它天然跟随主题变化。让通知组件跟随主题useNotificationProvider 的正确用法一个容易踩坑的细节是refinedev/antd导出的notificationProvider已因无法默认读取当前主题上下文而被弃用。在自定义主题场景下应改为从antd引入App组件包裹应用并把useNotificationProvider来自refinedev/antd作为notificationProvider传入Refineimport { Refine } from refinedev/core; import { ThemedLayout, useNotificationProvider } from refinedev/antd; import { ConfigProvider, App as AntdApp } from antd; const API_URL https://api.fake-rest.refine.dev; const App: React.FC () { return ( ConfigProvider theme{RefineThemes.Blue} AntdApp Refine dataProvider{dataProvider(API_URL)} notificationProvider{useNotificationProvider} ThemedLayout{/* ... */}/ThemedLayout /Refine /AntdApp /ConfigProvider ); };这样AntdApp会把当前主题上下文提供给通知组件确保成功/错误消息气泡的样式与主题一致。完整示例解读customization-theme-antd示例应用customization-theme-antd是一个典型的 posts 增删改查后台其完整结构位于 examples/customization-theme-antdsrc/App.tsx组合BrowserRouter、ConfigProvider、Refine与ThemedLayout注册posts资源list/show/create/edit并使用refinedev/simple-rest连接https://api.fake-rest.refine.devsrc/components/Header/index.tsx自定义主题切换头部src/pages/posts/list.tsx基于useTable的表格列表页展示 ID、标题、分类与操作按钮src/pages/posts/create.tsx/edit.tsx基于useFormuseSelect的表单页包含标题、分类、状态与 Markdown 内容编辑src/pages/posts/show.tsx基于useShow的详情页使用MarkdownField渲染内容。其中列表页通过useTable获取分页数据再配合useMany批量拉取分类名称这体现了 Refine data hooks 与主题配置的完全解耦——主题只负责视觉业务逻辑不变export const PostList () { const { tableProps } useTableIPost(); const categoryIds tableProps?.dataSource?.map((item) item.category.id) ?? []; const { result: data, query: { isLoading } } useManyICategory({ resource: categories, ids: categoryIds, queryOptions: { enabled: categoryIds.length 0 }, }); return ( List Table {...tableProps} rowKeyid {/* ... */} /Table /List ); };注意示例的依赖package.json中引入了ant-design/v5-patch-for-react-19补丁用于在 React 19 环境下兼容 antd 5如果你使用 React 18可以去掉该依赖。示例同时通过import refinedev/antd/dist/reset.css引入样式重置这是保证主题效果一致的前提。本地运行示例在仓库中你可以进入示例目录并启动开发服务器cd examples/customization-theme-antd pnpm install pnpm dev运行后打开页面点击右上角的太阳/月亮按钮即可看到亮暗主题的实时切换效果同时按钮、标题颜色与主色等定制点也会同步生效。小结围绕 Refine 的 Ant Design 主题定制本文覆盖了三条主线预设主题RefineThemes提供 7 套开箱即用主题见 packages/antd/src/definitions/themes/index.ts本质都是token.colorPrimary的差异精细定制通过ConfigProvider.theme的token与components两级配置覆盖设计令牌算法切换利用defaultAlgorithm/darkAlgorithm结合useState实现明暗模式并注意用AntdAppuseNotificationProvider保证通知组件同步主题。这套能力让 Refine 项目在保持业务代码不变的前提下可以自由地适配品牌视觉规范与用户偏好是构建企业级后台、B2B 应用时高频使用的定制手段。【免费下载链接】refineA React Framework for building internal tools, admin panels, dashboards B2B apps with unmatched flexibility.项目地址: https://gitcode.com/GitHub_Trending/re/refine创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
上一篇/下一篇内容由系统自动关联
返回资讯列表 →