如何使用情感样式与 MUI v5 一起使用条件样式

2023-11-24

我正在从 MUI v4 迁移到 v5。在 v4 中我使用的是clsx with TextField添加条件样式。

export const useStyles = makeStyles((theme: Theme) =>
  createStyles({
    root: {
      // ...
    },
    valid: {
      "& fieldset": {
        borderColor: theme.palette.success.main,
        borderWidth: 2
      }
    }
  })
);

const classes = useStyles();
<TextField
  {...props}
  className={clsx(classes.root, { [classes.valid]: isValid })}
/>

我正在尝试在 MUI v5 中找到类似的方法。除了使用之外,MUI v5 中的条件样式还有其他选择吗clsx and makestyles.

如果需要更多信息,请告诉我。


有多种方法可以做到这一点:

1. 条件运算符

如果您想根据布尔值有条件地设置属性,请使用此选项。

const Box1 = styled(Box, {
  shouldForwardProp: (prop) => prop !== "showBorder"
})(({ showBorder }) => ({
  border: showBorder ? "solid red 5px" : "none"
}));
<Box1 />
<Box1 showBorder />

2. 词典

如果您想根据多个值有条件地设置属性,请使用此选项。

import { styled, darken } from "@mui/material/styles";

const colors = {
  hauntedForest: "#0b5b38",
  redLust: "#b20608",
  spaceExplorer: "#1244a1",
  default: "#000000"
};

const Box2 = styled(Box, {
  shouldForwardProp: (prop) => prop !== "variant"
})(({ variant }) => ({
  backgroundColor: colors[variant] ?? colors.default,
  border: "5px solid " + darken(colors[variant] ?? colors.default, 0.3)
}));
<Box2 variant="hauntedForest" />
<Box2 variant="redLust" />
<Box2 variant="spaceExplorer" />
<Box2 />

3. 短路评估+ 扩展运算符

如果您想有条件地设置多个属性,请使用此选项。

const Box3 = styled(Box, {
  shouldForwardProp: (prop) => prop !== "isFancy" && prop !== "isFancyBorder"
})(({ theme, isFancy, isFancyBorder }) => ({
  ...(isFancy && {
    borderRadius: theme.shape.borderRadius,
    boxShadow: "0 4px 6px gray, 0 1px 3px rgba(0, 0, 0, 0.08)",
    backgroundImage: "linear-gradient(90deg, #be5af7, #165b91)"
  }),
  ...(isFancyBorder && {
    backgroundColor: "transparent",
    border: "5px solid transparent",
    borderImage: "linear-gradient(90deg, #be5af7, #165b91)",
    borderImageSlice: 1
  })
}));
<Box3 isFancy />
<Box3 isFancyBorder />

使用时也可以应用上述所有方法sx props因为他们使用JS对象来描述样式。

现场演示

Codesandbox Demo

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用情感样式与 MUI v5 一起使用条件样式 的相关文章

  • 如何取消 ComponentWillUnmount 中的所有请求?

    根据docs https facebook github io react docs react component html componentwillunmount ComponentWillUnmount 能够取消请求 我有一个页面发
  • React 中的静态方法

    我正在查看 React 文档并遇到了静态方法 我想知道它在什么样的场景下可能有用 但想不出有什么用 在 React 中构建组件时 是否存在静态方法有用的特定场景 defaultProps and propTypes是 React 组件的静态
  • 如何在 Jest 测试中模拟 StatusBarManager.getHeight?

    我正在使用 expo 34 并且反应本机用户界面库 https www npmjs com package react native ui lib来自 wix 并且在为我的组件设置笑话测试时遇到问题 问题看起来出现在link https g
  • ReactJS 模式无法使用 Materialise css 打开

    我是 ReactJS 的新手 正在学习使用 Materialise css 创建模型 https materializecss com https materializecss com import React Component from
  • ReactJS 服务器端渲染与客户端渲染

    我刚刚开始研究ReactJS 发现它提供了两种渲染页面的方式 服务器端和客户端 但是 我不明白如何一起使用它 构建应用程序是两种不同的方法 还是可以一起使用 如果我们可以一起使用它 该怎么做 我们需要在服务器端和客户端复制相同的元素吗 或者
  • 如何在React Router 4中实现动态路由?

    我有一个这样的文章列表 div this props articles map article gt return div
  • 带有 nextjs 的 Material-ui 选项卡?

    我有一个 Material ui nextjs 和 typescript 项目 我正在尝试让我的导航栏与 nextjs 一起使用 import as React from react import AppBar from material
  • 在react渲染函数中是否可以返回空?

    我有一个通知组件 并且有一个超时设置 超时后我打电话this setState isTimeout true 我想做的是 如果已经超时 我只想渲染任何内容 render let finalClasses this state classes
  • 如何使用反应路由器在重定向上传递参数?

    我正在使用 React router 版本 2 0 1 在组件之间进行导航 我遇到了一个场景 我想动态导航到其他组件 我做了这样的事情来重定向 browserHistory push some path 它正在完美地导航到其他组件 但我还想
  • 由于 useEffect 重新渲染而导致图表重复

    我有一个父组件 我用它来传递道具 即backgroundColor 到子组件
  • 下一个验证 |当用户对象有太多项目时,会话请求没有数据

    我会尽力为我解释我的问题 我使用 Strapi 作为后端 使用 Nextjs 作为前端 对于身份验证 我使用 NextAuth nextauth js const options providers Providers Credential
  • 如何检查令牌过期和注销用户?

    当用户单击注销按钮时 他 她可以自己注销 但是如果令牌过期 他 她就无法注销 因为在我的应用程序中 令牌在服务器端和前端都使用 当用户单击注销按钮时 如果令牌有效 则服务器和浏览器中的令牌都会被清除 当用户未注销并且他 她的令牌过期但未在浏
  • 如何实现rtk的createApi查询去抖

    有人可以帮助我使用 creatApi 和 redux 工具包中的查询实现来实现去抖功能 提前致谢 我个人在 RTK 查询中没有发现任何开箱即用的去抖动实现 但你可以自己实现 定义一个api 我正在使用 openlibrary 的一个 imp
  • React 不适用于 Android 4.4.2 Web 视图浏览器

    React 在我的 Android 手机上不起作用 我不认为这是我的代码错误 因为即使我写的唯一内容是 p hello world p 它仍然没有显示 在 chrome 远程吊顶上查看后 这显示了 Map is not defined 以前
  • 在reactjs中停止超时?

    有没有办法可以杀死 摆脱 reactjs 中的超时 setTimeout function do something bind this 3000 通过某种点击或操作 我希望能够完全停止并结束超时 有没有办法做到这一点 谢谢 假设这种情况发
  • 错误:#0 轴的数据列不能是字符串类型

    我正在尝试使用谷歌图表和 React JS 创建散点图 我制作了一个测试数组来检查这是否是将数据发送到图表的正确方法并且它有效 但是当我处理真实数据并创建一个类似的数组时 它给我带来错误 轴 0 的数据列不能是字符串类型 这是运行良好的测试
  • 当列表包含图像时,React Native FlatList 感觉很慢

    我为 avater 使用 64x64 图像 它的尺寸非常小 通过我的应用程序 滚动时帧率下降至 25 35 fps 如何优化 flatList 图像
  • React-Spring useTransition 随机排列我的列表项

    我有一个使用 React Spring 过渡呈现的标签列表 这个想法是 您可以添加项目 如果超过 5 个 则会出现 显示更多 按钮 按此按钮可以切换是显示所有标签还是仅显示前五个标签 问题是当我从 显示更多 转变为 显示更少 时 我注意到
  • Jest 使用 window.require 测试 Electron/React 组件

    我目前正在创建一个使用 React 来创建界面的 Electron 应用程序 为了访问 fs 我一直在使用 const fs window require fs 在电子窗口中效果很好 问题是 当我为使用 window require fs
  • 元标记服务器端渲染

    我在用反应头盔 https github com nfl react helmet对于服务器端渲染我有点迷失 如果我在谷歌控制台中查看元素 我可以看到标题和元描述 但在查看页面源代码时它们不存在 我使用 Node js 后端和 Expres

随机推荐