问题
I'm wrapping Material-UI's chip component so that I can pass in values other than "primary" and "secondary" for the colors
prop. I also want to maintain the hover effect if the chip is clickable so that the chip transitions to a different color when the cursor is over it. The colors are passed in as props, so it's easy enough to set the backgroundColor
and color
:
<Chip
style={{
backgroundColor: props.backgroundColor,
color: props.color
}}
/>
However, since I'd also like to pass in the hover color as a prop, I'd need to do something like this:
<Chip
style={{
backgroundColor: props.backgroundColor,
color: props.color,
'&:hover': {
backgroundColor: props.hoverBackgroundColor,
color: props.hoverColor
}
}}
/>
However, the &:hover
(as far as I know) can't be used inside of the style
prop. Typically, the &:hover
would be used inside of a styles object that is passed into withStyles
, but I'm not able to access props from in there. Any suggestions?
回答1:
You can achieve this by creating your own custom chip component. In order to be able to use props to control the styling, you can use the makeStyles function from the "@material-ui/styles" package. This package is still considered "alpha", but is intended to be the default style implementation for v4 of Material-UI. The makeStyles
function returns a hook that can accept an object parameter for providing variables to your styles.
Here's a possible CustomChip implementaton:
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;
The styling approach (including the use of the emphasize
function to generate the hover and active colors) is based on the approach used internally for Chip.
This can then be used like this:
<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");
}}
/>
Here's a CodeSandbox demonstrating this:
来源:https://stackoverflow.com/questions/55008320/using-props-to-set-hover-background-color