reactjs - Hur man tematiserar komponenter med styled-components och Material-UI?
Finns det en möjlighet att använda Material-UI "theme"-egenskapen med styled-components med TypeScript?
Exempel på Material-UI-kod:
const useStyles = makeStyles((theme: Theme) => ({
root: {
background: theme.palette.primary.main,
},
}));
Nu vill jag ersätta denna kod med styled-components.
Jag har testat följande implementation (och andra liknande implementationer) utan framgång:
const Wrapper = styled.div`
background: ${props => props.theme.palette.primary.main};
`;
Svar #1
Du kan använda withTheme för att injicera temat som en prop.
import React from "react";
import { withTheme } from "@material-ui/core/styles";
import styled from "styled-components";
const StyledDiv = withTheme(styled.div`
background: ${props => props.theme.palette.primary.main};
color: ${props => props.theme.palette.primary.contrastText};
`);
export default function App() {
return (
<StyledDiv>
<h1>Hello CodeSandbox</h1>
<h2>Start editing to see some magic happen!</h2>
</StyledDiv>
);
}
För en start på TypeScript-aspekterna, se denna demo: https://codesandbox.io/s/xyh60
Detta är från withTheme HOC-delen av dokumentationen.
Svar #2
Jag ville ha en liknande uppsättning krav (MUI, styled-components, tema och TypeScript). Jag fick det att fungera, men jag är säker på att det kan bli snyggare:
import React from "react";
import styled from "styled-components";
import { Theme, useTheme } from "@material-ui/core/styles";
import Button from "@material-ui/core/Button";
const StyledCustomButton: React.FC<{
theme: Theme;
}> = styled(({ ...props }) => <Button {...props}>Test</Button>)`
&& {
padding-bottom: ${(props) => props.theme.spacing(2)}px;
}
`;
const CustomButton: React.FC = () => {
const theme: Theme = useTheme();
return <StyledCustomButton theme={theme} />;
};
export default CustomButton;