Ant Design StyleAnt Design Style
快速上手
最佳实践
API
更新日志
⌘ K

Table of Contents

简介
主题切换
useTheme 用法
注入自定义 Token 主题
Typescript 类型支持
基础样式重置
消费静态实例方法
添加容器作用域样式
嵌套 ThemeProvider
styled 集成
API
创建样式
createStyles
🚧 createStylish
createGlobalStyle
容器组件
ThemeProvider
StyleProvider
Hooks
useTheme
useThemeMode
useResponsive
高级设置
🚧 setupStyled
createInstance
上一篇
createGlobalStyle
下一篇
StyleProvider

相关资源

Ant Design
Ant Design Pro
Ant Design Pro Components
Umi-React 应用开发框架
Dumi-组件/文档研发工具
qiankun-微前端框架

社区

Medium
Twitter
yuqueAnt Design 语雀专栏
Ant Design 知乎专栏
体验科技专栏
seeconfSEE Conf-SEE Conf-蚂蚁体验科技大会

帮助

GitHub
更新日志
讨论

more products更多产品

yuque语雀-知识创作与分享工具
AntVAntV-数据可视化解决方案
EggEgg-企业级 Node.js 框架
kitchenKitchen-Sketch 工具集
xtech蚂蚁体验科技
Copyright © 2022-2024
Made with ❤️ by 蚂蚁集团 - AFX & 数字科技
‌
‌
‌
‌

简介

用于全局管理主题变量的容器,该组件在封装 ConfigProvider 基础上,提供了一键切换亮暗色主题、自定义主题、应用级作用域样式的统一入口。同时在该容器下的 useTheme 方法可获得这一层容器中的 theme 对象。

ThemeProvider 本质上是一个 React Context 的数据容器,用于为子级应用提供主题消费的相关数据,因此:

  • 集成了亮暗色主题切换的基础状态
  • 支持自动相应系统主题;
  • 提供 antd 静态对象实例的回调对象(该静态方法能正常响应主题);
  • 该组件不具有真实的 DOM 节点,因此无法通过节点样式来限制自定义样式的范围;

主题切换

ThemeProvider 默认集成亮暗色主题切换能力,通过 appearance props 即可快速完成亮暗色的主题切换。如需详细了解 antd-style 的主题切换能力,可以参阅 主题切换 这一部分。

useTheme 用法

全局顶层包裹 ThemeProvider 后,使用 useTheme 获取 theme 对象,其中包含 antd v5 token 主题值、自定义主题、当前的主题外观等方法。 api 详见

tsx

实例效果:

包裹 ThemeProvider
#363eba
colorPrimary
未包裹 ThemeProvider 会显示默认值
#1677ff
colorPrimary
index.tsx
_app.tsx
style.ts
tsx
温馨提示

useTheme 会查找最近一层的 ThemeProvider 组件中的 theme 值。如果存在多层嵌套,最里面的一层才会生效。

注入自定义 Token 主题

通过 ThemeProvider 的 customToken 方法可以注入自定义 Token,并通过 useTheme 方法进行消费。

tsx

实例效果:

antd Token
#1677ff
colorPrimary
自定义 Token
#c956df
customBrandColor
未包裹 ThemeProvider 时使用自定义 Token 无效
None
customBrandColor
index.tsx
_app.tsx
tsx

Typescript 类型支持

通过给 antd-style 扩展 CustomToken 接口的类型定义,可以为 useTheme hooks 中增加相应的 token 类型定义。

同时,给 ThemeProvider 对象添加泛型,可以约束 customToken 的入参定义。

tsx
INFO

由于 CustomToken 大概率是一个空 interface,如果在项目中有配置 @typescript-eslint/no-empty-interface 的规则,就在代码格式化时导致接口定义被订正改为 type,而 type 是无法扩展的,会导致提示丢失(相关 issue: #16)。因此解决方案为如上述示例代码一样,添加禁用规则。

基础样式重置

在 dumi 文档中 a 节点的默认效果如下所示。

而通过 antd App 组件的样式重置,可以保证不在 antd 组件中的原生标签(<a> 等)也能符合 antd 的默认样式(左下)。

ThemeProvider + App

由于 App 有 DOM 节点,能限制作用域来修改 DOM 原生样式,因此可以重置原生节点样式

ThemeProvider

由于 ThemeProvider 没有有根 DOM 节点,因此无法修改原生节点样式(除非搭配 GlobalStyle,而搭配 GlobalStyle 则会污染全局样式)

消费静态实例方法

v5 中由于 react 生命周期的问题移除了静态方法,因此如果使用 antd 默认导出的 message 等静态方法,会无法响应动态主题。因此 ThemeProvider 中提供了一个 getStaticInstance 接口,将响应动态主题的静态方法实例提供给外部使用。

tsx

添加容器作用域样式

如果需要只影响 ThemeProvider 下的样式,可以结合 antd 的 App 组件,利用它的 className 的 props 结合 css 或 createStyles 方法,即可添加局部作用域样式。

全局样式作用域

在 css-in-js 的世界中,局部作用域非常容易实现。因此应该尽量减少全局作用域的使用(实在不行才用全局作用域)。 这也是 antd v5 中推荐的用法。但如果仍然需全局作用域层面的样式注入,可以使用 createGlobalStyles 来完成。

嵌套 ThemeProvider

在某些场景下,我们会需要在一个 ThemeProvider 中嵌套另一个 ThemeProvider,这时候需要注意的是,内层的 ThemeProvider 会覆盖外层的 ThemeProvider。

styled 集成

antd-style 通过 styled 方法提供了 styled-components 的 ThemeProvider 兼容能力,进而使用 antd-style 的 ThemeProvider 为 styled-components 或 emotion/styled 库提供主题消费。

tsx

API

名称默认值描述
customTokenundefined自定义 token, 可在 antd v5 token 规范基础上扩展和新增自己需要的 token
customStylishundefined自定义 Stylish 变量
appearancelight应用的展示外观主题,内置亮色和暗色两种,可以自行扩展
defaultAppearance
onAppearanceChange(appearance:ThemeAppearance) => void外观主题的回调
themeModelight主题的展示模式,有三种配置:跟随系统、亮色、暗色 默认不开启自动模式,需要手动进行配置
defaultThemeModenull默认主题展示模式
onThemeModeChange(themeMode: ThemeMode) => void主题模式修改后的回调