【发布时间】:2020-08-16 00:19:36
【问题描述】:
考虑一个组件,它呈现一个按钮并说这个按钮应该有一个红色的背景和一个黄色的文本颜色。还有一个父组件使用这个子组件,但是说黄色很好,但我希望背景颜色是绿色。
带样式
使用旧的 withStyles 没问题。
import React from "react";
import { withStyles } from "@material-ui/core/styles";
import { Button } from "@material-ui/core";
const parentStyles = {
root: {
background: "green"
}
};
const childStyles = {
root: {
background: "red"
},
label: {
color: "yellow"
}
};
const ChildWithStyles = withStyles(childStyles)(({ classes }) => {
return <Button classes={classes}>Button in Child withStyles</Button>;
});
const ParentWithStyles = withStyles(parentStyles)(({ classes }) => {
return <ChildWithStyles classes={classes} />;
});
export default ParentWithStyles;
https://codesandbox.io/s/passing-classes-using-withstyles-w17xs?file=/demo.tsx
makeStyles/useStyles
让我们改用 makeStyles/useStyles 并按照 material-ui.com 上的指南 Overriding styles - classes prop。
import React from "react";
import { makeStyles } from "@material-ui/styles";
import { Button } from "@material-ui/core";
const parentStyles = {
root: {
background: "green"
}
};
const childStyles = {
root: {
background: "red"
},
label: {
color: "yellow"
}
};
// useStyles variant does NOT let me override classes
const useParentStyles = makeStyles(parentStyles);
const useChildStyles = makeStyles(childStyles);
const ChildUseStyles = ({ classes: classesOverride }) => {
const classes = useChildStyles({ classes: classesOverride });
return (
<>
<Button classes={classes}>Button1 in Child useStyles</Button>
<Button classes={classesOverride}>Button2 in Child useStyles</Button>
</>
);
};
const AnotherChildUseStyles = props => {
const classes = useChildStyles(props);
return (
<>
<Button classes={classes}>Button3 in Child useStyles</Button>
</>
);
};
const ParentUseStyles = () => {
const classes = useParentStyles();
return <>
<ChildUseStyles classes={classes} />
<AnotherChildUseStyles classes={classes} />
</>
};
export default ParentUseStyles;
https://codesandbox.io/s/passing-classes-using-usestyles-6x5hf?file=/demo.tsx
似乎没有办法获得我使用 withStyles 获得的预期效果。几个问题,考虑到我仍然想要使用某些类覆盖方法(以前对我来说似乎很有意义)获得相同的效果(绿色按钮黄色文本)。
- 我对如何传递类作为使用 useStyles 覆盖部分类的方法的理解有什么错误?
- 我应该如何处理它?
- 如果我使用了错误的方法,为什么当父母有孩子没有的样式时,material-ui 仍然给我一个警告?
提供给 classes 属性的键
something未在 [Child] 中实现 - 旧方法 (withStyles) 与新方法的迁移是否记录在某处?
顺便说一句,我知道this solution,但是当你想要覆盖的东西太多时,这似乎很麻烦。
const useStyles = makeStyles({
root: {
backgroundColor: 'red',
color: props => props.color, // <-- this
},
});
function MyComponent(props) {
const classes = useStyles(props);
return <div className={classes.root} />;
}
【问题讨论】:
标签: css reactjs material-ui overriding