reactjs - Kan inte komma åt temat i en styled-komponent med @emotion/styled
Jag använder @emotion/react för tematisering och har injicerat tema i det, jag kan komma åt temat med useTheme i komponenten men kan inte komma åt temat i stilarna med @emotion/styled. Någon hjälp, tack?
//libs
import React from 'react';
import styled from '@emotion/styled';
import StylesProvider from '@mui/styles/StylesProvider';
import { ThemeProvider } from '@emotion/react';
const THEME = {
primary: 'red'
}
const StyledText = styled('p')`
color: ${({ theme }) => theme.primary};
`;
function App() {
return (
<StylesProvider injectFirst>
<ThemeProvider theme={THEME}>
<StyledText>test</StyledText>
</ThemeProvider>
</StylesProvider>
);
}
export default App;
here is sample code
Svar #1
- Skapa "emotion.d.ts" och deklarera ditt Tema:
import "@emotion/react";
declare module "@emotion/react" {
export interface Theme {
color: {
primary: string;
}
}
}
- Importera definitivt typfilen "emotion.d.ts" till "tsconfig.ts":
"typeRoots": ["emotion.d.ts"]
- Ladda om fönstret och använd det så här:
const StyledText = styled('p')`
color: ${({ theme }) => theme.color.primary};
`;
- Om du använder Mui, låt oss utöka ditt tema:
export interface Theme extends ThemeOfMui{}
Svar #2
Du behöver kalla det på det här sättet. Se den här sektionen för mer detaljer.
const StyledTextField = styled('div')(({ theme }) => `
margin: ${theme.spacing(1)};
background-color: ${theme.palette.primary.main};
/* ... */
`);
Eller så kan du också använda JS-objektet som i dokumentationen:
const StyledTextField = styled('div')(({ theme }) => ({
margin: theme.spacing(1),
backgroundColor: theme.palette.primary.main,
// ...
}));
