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

Table of Contents

styled 的主题响应原理
styled 与 ThemeProvider 集成
styled-components
@emotion/styled
全局统一集成 styled
全局设定 Styled 配置
Typescript 类型定义支持
为 styled-components 注入主题类型
为 @emotion/styled 注入主题类型
基础知识
简介
CSS in JS 快速入门
CSS in JS 写法对比
设计理念与实施策略
快速上手
书写样式
切换主题
自定义主题
进阶使用
Babel 插件
SSR 集成
组件研发
集成 styled
🚧 stylish 复合样式
CSSinJS 样式库性能对比
从 Less 迁移
Less 应用自动化迁移
Less 应用手动迁移
Less 组件迁移
🚧 CSSinJS 与 Less 的编译差异
上一篇
组件研发
下一篇
🚧 stylish 复合样式

相关资源

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 & 数字科技
‌
‌
‌
‌

搭配 styled 消费

经过详尽调研与大量业务实践后,我们决定不在 antd-style 中内置 styled 的方法,而是为 styled 的用户提供主题兼容方案。

温馨提示

如果你对 styled 不太了解,建议先查阅 styled-components 了解它的使用方式

styled 的主题响应原理

先来看一个 styled 典型的主题消费方式:

tsx

可以看到,styled 的主题响应是通过 ThemeProvider 来提供的,它会将 theme 作为 props 传递给 StyledButton,进而实现主题的响应。在底层,无论是 styled-components 还是 @emotion/styled 的 ThemeProvider,都是通过 React 的 Context 来创建 Provider 容器和 hooks 方法。

也就是说 styled 方法和 ThemeProvider(以及配套的useTheme)必须成对出现。 styled-components 的 styled 无法响应 @emotion/styled 的 ThemeProvider, @emotion/styled 的 useTheme 也不能响应 styled-components 的 ThemeProvider。

通过分别阅读二者的源码( styled-components、@emotion/styled ),我们发现这些 styled 的实现都耦合了各自创建的 Context,因此外部不能传入自定义的 Context。

这就使得如果使用 styled 来创建样式组件,每个组件的使用就必须要在外部套一层 ThemeProvider ,而不是像普通组件一样直接引入即可。

tsx

那这些麻烦操作的根源都在于 styled 使用的 ThemeProvider 不提供自定义 Context 注入。目前来看,styled-components 应该不会实现该特性(issue)。

这也就意味如果想要自定义一个 ThemeContext 作为组件的默认主题,并在 styled 的写法中获取到,就必须要自己实现自己的 styled 方法,但这对于绝大多数组件开发者来说并不现实。

在 CSS in JS 写法对比 这一章节中,我们认为 styled 这个 api 由于设计缺陷,在未来将会没落。所以我们在 antd-style 中也将只提供 styled 的 ThemeProvider 和 useTheme 的兼容使用方案。

styled 与 ThemeProvider 集成

在 antd-style 的 ThemeProvider 中,我们提供了一个 styled 的 props ,用于接收外部 styled 所对应的 ThemeContext ,进而让 styled 方法可以响应到 antd-style 中的 antd token 、 自定义 token 与主题状态。

tsx
styled-components

只有注入了 styled-components 的 ThemeContext ,才能响应自定义 token

@emotion/styled

antd-style 内置了 @emotion/react 的 ThemeContext,所以默认可以响应自定义 Token

关于 ThemeProvider 的 styled API 文档,详见: ThemeProvider - styled 集成配置

全局统一集成 styled

针对存在多个 ThemeProvider 的场景,我们提供了一个 setupStyled 方法,用于将外部 styled 的 ThemeContext 统一注入到 antd-style 的 ThemeProvider 里,进而让 styled 方法可以响应到任意一个 ThemeProvider。

tsx
全局设定 Styled 配置

在入口文件中设定 styled 的 ThemeContext 配置,可以让所有 ThemeProvider 都能响应自定义 token

请注意:setupStyled 需要在应用初始化前执行,否则不会生效。此外由于 setupStyled 会对 antd-style 的所有 ThemeProvider 生效,不建议在多个应用场景下使用,否则可能会污染其他应用的 ThemeProvider。

Typescript 类型定义支持

同 antd-style 的主题类型扩展一样,如果需要让各自的 styled 方法能够获取到 antd-style 的主题类型,需要在项目中全局补充 styled-components 或 @emotion/styled 的类型定义。

为 styled-components 注入主题类型

为 styled-components 的 styled 注入 antd-style 的主题类型。

tsx

为 @emotion/styled 注入主题类型

为 emotion 的 styled 注入主题类型时需要注意,需要声明的包是 @emotion/react 而不是 @emotion/styled。

tsx