ong*_* oi 5 reactjs styled-components antd
Antd 5.0 引入了新的主题系统。但我想知道当我通过样式组件声明组件时如何访问主题的那些设计标记。通常我这样声明我的组件。
const MyComponent = styled.button`
color:${props=> props.theme.color.primary};
`;
Run Code Online (Sandbox Code Playgroud)
theme
ThemeProvider
这是从定义的样式组件中获取的App.jsx
<ThemeProvider theme={baseTheme}>
<App/>
</ThemeProvider>
Run Code Online (Sandbox Code Playgroud)
因此,主题只能访问主题文件中定义的设计令牌。如何访问 Antd 主题的其他 token?
我想到的一种方法是创建一个主题来覆盖 Antd 的每一个设计标记。但我认为这是个坏主意
从文档Consumer-design-token中,您可以使用钩子获取并使用令牌theme.useToken()
。
创建一个ThemeProvider
获取 antd 主题令牌并将其与基本主题组合,然后将组合主题传递给ThemeProvider
of styled-components
。
然后你可以通过传递的props得到组合的主题styled-components
。
theme-provider.tsx
:
import { ThemeProvider } from "styled-components";
import { theme } from "antd";
import React from "react";
export default ({ children }: React.PropsWithChildren) => {
const { token } = theme.useToken();
return (
<ThemeProvider theme={{ antd: token, base: { color: "mediumseagreen" } }}>
{children}
</ThemeProvider>
);
};
Run Code Online (Sandbox Code Playgroud)
App.tsx
:
import styled from "styled-components";
import { ConfigProvider } from "antd";
import ThemeProvider from "./theme-provider";
const Button = styled.button`
color: ${(props) => {
console.log("props.theme: ", props.theme);
return props.theme.antd.colorPrimary;
}};
`;
export default function App() {
return (
<ConfigProvider
theme={{
token: {
colorPrimary: "red"
}
}}
>
<ThemeProvider>
<Button>Hello World</Button>
</ThemeProvider>
</ConfigProvider>
);
}
Run Code Online (Sandbox Code Playgroud)
日志:
import { ThemeProvider } from "styled-components";
import { theme } from "antd";
import React from "react";
export default ({ children }: React.PropsWithChildren) => {
const { token } = theme.useToken();
return (
<ThemeProvider theme={{ antd: token, base: { color: "mediumseagreen" } }}>
{children}
</ThemeProvider>
);
};
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
4459 次 |
最近记录: |