如何在样式化组件中访问Material-ui的主题 [英] How do I access Material-ui's theme in Styled Component
问题描述
我将CRA与Material-ui和Styled Components类型的样式一起使用.构建CSS时,我想访问Material-ui的默认主题.
I'm using CRA with Material-ui and Styled Components type of styling. When building my CSS I want to access Material-ui's default theme.
package.json的一部分:
part of package.json:
"dependencies": {
"react": "^16.8.6",
"react-dom": "^16.8.6",
"react-scripts": "3.0.1",
"@material-ui/core": "^4.2.1",
"@material-ui/icons": "^4.2.1",
"@material-ui/styles": "^4.2.1",
"styled-components": "^4.3.2"
}
当我尝试下面的 themes
出现在 props
上,但它是一个空对象.
When I try the below theme
exists on props
but is an empty object.
StyledApp.js:
StyledApp.js:
import styled from "styled-components";
import Button from "@material-ui/core/Button";
export const StyledButtonUsingTheme = styled(Button)`
//Below will give "Cannot read property 'error' of undefined"
background-color: ${props => props.theme.palette.error.light};
`;
App.js:
import React from "react";
import "./App.css";
import { StylesProvider, ThemeProvider } from "@material-ui/styles";
import { createMuiTheme } from "@material-ui/core/styles";
import { StyledButtonUsingTheme } from "./StyledApp";
function App() {
const defaultTheme = createMuiTheme();
window.console.log("Default theme passing to ThemeProvider", defaultTheme);
return (
<StylesProvider injectFirst>
<ThemeProvider theme={defaultTheme}>
<div className="App">
<StyledButtonUsingTheme variant="outlined">
Styled Button Using Theme
</StyledButtonUsingTheme>
</div>
</ThemeProvider>
</StylesProvider>
);
}
export default App;
App.js 中的console.log显示了整个主题对象,这就是我传递给ThemesProvider的内容.有趣的是 props.theme
在那!但可惜没有价值.
The console.log in App.js
shows the whole theme object, and that's what I pass to ThemesProvider. Interestingly props.theme
is there! but sadly with no values.
推荐答案
正如评论中提到的那样,使用来自 Styled-Components
的 ThemeProvider
样式化组件内的主题属性.但是Material-UI不再将该主题应用于其自己的组件.
As Horyd in the comment says, using the ThemeProvider
from Styled-Components
will give you access to the theme properties inside your styled component.
But Material-UI doesn't apply that theme anymore to its own components.
我发现的解决方法非常简单,很难看:同时使用两个Themeproviders .因此Material-UI将主题应用到其组件,您可以在样式化的组件中访问主题.
The workaround I found is as ugly as it is simple: Use both Themeproviders. So Material-UI applies the theme to its components and you can access the theme in your styled components.
import { ThemeProvider } from "styled-components";
import { MuiThemeProvider,StylesProvider } from "@material-ui/core/styles";
ReactDOM.render(
//Make sure the Material stylesheet is placed above your own
//styles so you can overwrite them
<StylesProvider injectFirst>
//Use the theme in the ThemeProvider for Material-UI so
//styles are applied to the Material-UI components
<MuiThemeProvider theme={theme}>
//Use also the ThemeProvider for Styled-Components so
//you can access the theme in your own css
<ThemeProvider theme={theme}>
//Include your app and you have acces to everything
<App />
</ThemeProvider>
</MuiThemeProvider>
</StylesProvider>,
document.getElementById("app"));
这篇关于如何在样式化组件中访问Material-ui的主题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!