在我的 case 中,按钮是一个可重复使用的组件.它可以是带有白色文本的绿色,也可以是带有绿色文本和边框的白色.有更好的mui方法如何处理吗?

页面 :

   <MainButton title="Login" />
   <MainButton
      title="Register"
      additionalStyles={{         // add other styles 
      backgroundColor: "#e5f3fd",
      color: "#33b864",
      border: `1px solid ${theme.palette.secondary.main}`,
      "&:hover": {
        backgroundColor: "rgba(46, 171, 92, 0.1)",
      },
      }}
      />

-oh my 天.

export const MainButton = ({ title, additionalStyles }: MainButtonProps) => {
  const theme = useTheme();

  return (
    <Button
      sx={{
        height: 40,
        bgcolor: theme.palette.secondary.main,
        color: "#ffffff",
        textTransform: "none",
        fontSize: 15,
        fontWeight: 600,
        borderRadius: 2,
        "&:hover": {
          bgcolor: "#2eab5c",
        },
        ...additionalStyles,
      }}
    >
      {title}
    </Button>
  );
};

推荐答案

目前看起来是一个不错的方法,因为它允许灵活性和可扩展性,以防您将来想使用additionalStyles程序添加更多样式.

不过,如果您知道您只会拥有这两种变体,您可能想将这些样式烘焙到组件中,并让它们打开props .下面是一个示例,但这不一定更好,只是另一种方法.

export const MainButton = ({ title, variant }: MainButtonProps) => {
  const theme = useTheme();

  const defaultStyles = {
    height: 40,
    textTransform: "none",
    fontSize: 15,
    fontWeight: 600,
    borderRadius: 2,
  };

  const primaryStyles = {
    bgcolor: theme.palette.secondary.main,
    color: "#ffffff",
    "&:hover": {
      bgcolor: "#2eab5c",
    },
  };

  const secondaryStyles = {
    backgroundColor: "#e5f3fd",
    color: "#33b864",
    border: `1px solid ${theme.palette.secondary.main}`,
    "&:hover": {
      backgroundColor: "rgba(46, 171, 92, 0.1)",
    },
  };

  const styles = variant === 'secondary' ? { ...defaultStyles, ...secondaryStyles } : { ...defaultStyles, ...primaryStyles };

  return (
    <Button sx={styles}>
      {title}
    </Button>
  );
};

然后将使用变体props 来调用:

<MainButton title="Login" />
<MainButton title="Register" variant="secondary" />

这更清楚地表明有两个明确定义的变体.

Reactjs相关问答推荐

为什么我无法访问窗口事件处理程序中的状态?

如何在关闭和打开此 Select 输入时应用旋转效果?

根据另一个Select中的选定值更改Select中的值

取消 Select 较高组件中的所有行

根据处于react 状态的数组的名称键,将新对象添加到嵌套的对象数组中

如何使用react-router-dom保护嵌套在受保护路由中的嵌套路由?

Material-UI 和 React Hook 表单不记录值

Material UI @mui/material/Button vs @material-ui/core/Button,它什么时候改变的,旧版本的文档在哪里

Zod 验证模式根据另一个数组字段使字段成为必需字段

如何让 useEffect 在 React.JS 中只运行一次?

React 测试库包装器组件

如何在 Next Js 13 App Router 中添加 Favicon 图标?

NextJS htaccess 设置

如何通过 id 从 useSprings 数组中删除元素

响应式媒体 React Tailwind

如何从一组对象映射 MUI 5 图标并更改其 colored颜色 ?

如何在 JSX 中使用 -webkit- 前缀?

列表应该有一个唯一的关键props

将 set statehook 函数传递给子路由组件.解构错误

如何将本地视频文件上传到 Google Cloud