传递给的对象styled
是 CSS 属性,但您混合了 CSS 属性和Box
props ( bgcolor
, p
)。即使是有效的 CSS 属性 ( display
, width
)也是有效的Box
props,所以最直接的解决方案是将它们全部指定为 props。
处理此问题的一种方法是使用defaultProps。这使得在使用组件时通过显式指定它们来覆盖某些 props 变得非常容易,如下例所示。
import React from "react";
import Box from "@material-ui/core/Box";
import CssBaseline from "@material-ui/core/CssBaseline";
import { styled } from "@material-ui/core/styles";
const BigPanel = styled(Box)({});
BigPanel.defaultProps = {
display: "flex",
width: "100%",
borderRadius: 10,
flexGrow: 1,
bgcolor: "background.paper",
p: { xs: 4, md: 8 },
boxShadow: "1"
};
export default function App() {
return (
<>
<CssBaseline />
<BigPanel>Default BigPanel</BigPanel>
<BigPanel bgcolor="primary.main" color="primary.contrastText">
BigPanel with explicit props
</BigPanel>
</>
);
}

在上面的例子中,styled
除了创建一个新的组件类型之外,它不再真正用于任何目的。虽然它不是更少的代码,但下面是一种无需使用即可获得相同效果的替代方法styled
:
const BigPanel = React.forwardRef(function BigPanel(props, ref) {
return <Box ref={ref} {...props} />;
});
BigPanel.defaultProps = {
display: "flex",
width: "100%",
borderRadius: 10,
flexGrow: 1,
bgcolor: "background.paper",
p: { xs: 4, md: 8 },
boxShadow: "1"
};
