我包装了Material-UI的芯片组件,以便为colors
道具传递“ primary”和“ secondary”以外的值。如果芯片是可单击的,我还希望保持悬停效果,以便当光标位于其上方时,芯片会转换为其他颜色。颜色作为道具传递,因此设置backgroundColor
和color
很容易:
<Chip
style={{
backgroundColor: props.backgroundColor,
color: props.color
}}
/>
但是,由于我也希望将悬停颜色作为道具传递,因此我需要执行以下操作:
<Chip
style={{
backgroundColor: props.backgroundColor,
color: props.color,
'&:hover': {
backgroundColor: props.hoverBackgroundColor,
color: props.hoverColor
}
}}
/>
但是,&:hover
(据我所知)不能在style
道具内部使用。通常,&:hover
将在传递到withStyles
的样式对象中使用,但我无法从那里访问道具。有什么建议吗?
答案 0 :(得分:0)
您可以通过创建自己的自定义芯片组件来实现。为了能够使用道具来控制样式,可以使用makeStyles
中的"@material-ui/styles" package函数。该程序包仍被视为“ alpha”,但旨在作为Material-UI v4的默认样式实现。 makeStyles
函数返回一个钩子,该钩子可以接受用于为样式提供变量的对象参数。
以下是可能的CustomChip实现:
import React from "react";
import Chip from "@material-ui/core/Chip";
import { makeStyles } from "@material-ui/styles";
import { emphasize } from "@material-ui/core/styles/colorManipulator";
const useChipStyles = makeStyles({
chip: {
color: ({ color }) => color,
backgroundColor: ({ backgroundColor }) => backgroundColor,
"&:hover, &:focus": {
backgroundColor: ({ hoverBackgroundColor, backgroundColor }) =>
hoverBackgroundColor
? hoverBackgroundColor
: emphasize(backgroundColor, 0.08)
},
"&:active": {
backgroundColor: ({ hoverBackgroundColor, backgroundColor }) =>
emphasize(
hoverBackgroundColor ? hoverBackgroundColor : backgroundColor,
0.12
)
}
}
});
const CustomChip = ({
color,
backgroundColor,
hoverBackgroundColor,
...rest
}) => {
const classes = useChipStyles({
color,
backgroundColor,
hoverBackgroundColor
});
return <Chip className={classes.chip} {...rest} />;
};
export default CustomChip;
样式方法(包括使用emphasize
函数生成悬停和活动颜色)基于内部用于Chip
的方法。
然后可以这样使用:
<CustomChip
label="Custom Chip 1"
color="green"
backgroundColor="#ccf"
onClick={() => {
console.log("clicked 1");
}}
/>
<CustomChip
label="Custom Chip 2"
color="#f0f"
backgroundColor="#fcc"
hoverBackgroundColor="#afa"
onClick={() => {
console.log("clicked 2");
}}
/>
这是一个CodeSandbox演示: