使用道具设置'&:hover'背景颜色

时间:2019-03-05 17:21:47

标签: css reactjs material-ui jsx

我包装了Material-UI的芯片组件,以便为colors道具传递“ primary”和“ secondary”以外的值。如果芯片是可单击的,我还希望保持悬停效果,以便当光标位于其上方时,芯片会转换为其他颜色。颜色作为道具传递,因此设置backgroundColorcolor很容易:

<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的样式对象中使用,但我无法从那里访问道具。有什么建议吗?

1 个答案:

答案 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演示:

Edit Chip color

相关问题