【问题标题】:React material-ui (MUI) 5 conditional CSS classesReact material-ui (MUI) 5 个条件 CSS 类
【发布时间】:2021-11-28 03:55:00
【问题描述】:

我正在从 React material-ui 4 迁移到 MUI 5。

如何使用新的styled API(或任何有意义的方法)实现这种模式?

我正在使用 Typescript。

const useStyles = makeStyles(theme => ({
    topBar: {
        transition: theme.transitions.create("margin", {
            easing: theme.transitions.easing.sharp,
            duration: TRANSITION_DURATION,
        }),
        marginLeft: DRAWER_WIDTH,
    },
    topBarShift: {
        transition: theme.transitions.create("margin", {
            easing: theme.transitions.easing.easeOut,
            duration: TRANSITION_DURATION,
        }),
        marginLeft: 0,
    },
}));

function Header({ drawer }: IHeader) {
    const classes = useStyles();

    ...

    return (
        <div className={`${classes.topBar} ${!drawer && classes.topBarShift}`}>
           ...
        </div>
    );
}

【问题讨论】:

    标签: reactjs typescript material-ui


    【解决方案1】:

    如果我清楚地理解你的问题,你只需要一个条件string

    这可以通过创建util 函数来实现可重用性:

    type ConditionalClasses = {
      [className: string]: bool
    }
    
    const conditionalClass = (classes: ConditionalClass) => 
      Object.keys(classes).reduce((combinedClassName, className) => classes[className] ? `${combinedClassName} ${className}` : combinedClassName, "")
    

    用法如下

    // Output: "a"
    const newClassName = conditionalClasses({a: true, b: false})
    

    或者,您可以使用clsx

    -- 编辑

    看来我读错了,因此误解了这个问题。

    如果您想有条件地使用styled API styles,可以使用styled API 提供的overridesResolver 选项。

    const CustomDivComponent = styled("div", {
      overridesResolver: (props, styles) => {
        // Do your conditional logic here.
        // Return the new style.
        return {};
      }
    })(({ theme }) => ({
      // Your original styles here...
    }));
    

    更多文档可以找到here

    【讨论】:

    • 使用 material-ui 5 makeStyles() 已替换为 styled()。正在寻找新的等价物。
    • @TyKroll 我查看了documentation makeStyles 尚未被替换(或已弃用)。如果您正在谈论使用远离jss,如here 所述,请告诉我,我会调整我的答案。
    • @TyKroll 新答案应该是你要找的,不过请告诉我:)
    • @TyKroll 这回答了你的问题吗?如果是,请将其标记为已批准 :) 如果不是,请告诉我有任何需要澄清的地方。
    • 我决定从头开始完全重写,所以不需要上述方法。无论如何,这确实是正确的答案。谢谢。
    猜你喜欢
    • 2021-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-16
    • 2018-05-08
    • 2022-08-19
    • 2020-02-01
    相关资源
    最近更新 更多