【问题标题】:Is it possible to test for custom data-attributes in css-in-js?是否可以在 css-in-js 中测试自定义数据属性?
【发布时间】:2020-08-09 00:14:00
【问题描述】:

我正在尝试从 JSS 引用数据属性,对其进行测试,并在测试为真时应用样式。但是,当我运行下面的代码时,它不应用“color:green”,我不知道为什么!

import React from "react";
import { createUseStyles } from "react-jss";

const useStyles = createUseStyles({
  statusDiv: {
    backgroundColor: "lightGrey",
    padding: "10px",
    fontWeight: "bold",
    '[data-status="OPEN"]': {
      // no effect ..?
      color: "green",
    },
  },
});

const App = () => {
  const classes = useStyles();

  return (
    <div data-status="OPEN" className={classes.statusDiv}>
      OPEN
    </div>
  );
};

export default App;

【问题讨论】:

    标签: javascript css custom-data-attribute jss css-in-js


    【解决方案1】:

    这是一个有趣的案例。 你可以做的是:

    export default {
      '@global' : {
          'div.testClass[data-custom="value"]': {
          color: 'red',
          border: '1px, solid navy'
        }
      }
    }
    

    这假设安装了一个 JSS 插件 @global,但我认为这是非常有用的。 更多关于插件@global - here

    如果您想像编辑的示例 0 中那样处理 data- 属性,您应该这样做:

    testClass: {
      '[data-custom="value"]': {
        //styles for the custom data
      }
    }
    

    您将拥有的标记(取决于您提取类的方式):

    testClass.classes['[data-custom="value"]']
    

    ...自定义数据的样式将由上述应用。

    您在上次编辑中编写的方式将不起作用。不过,您应该添加一点。要使用您提供的代码示例:

    ...
    fontWeight: "bold",
      '& [data-status="OPEN"]': {
      // no effect ..?
      color: "green",
    },
    

    & 需要嵌套插件设置 - here 是关于它的更多信息。

    【讨论】:

    • 感谢@Vladyn 的回复。我已根据您的建议编辑了帖子以包括我最近的尝试。还没有,但我确定我错过了一些东西很明显(我对 JSS 还不是很熟悉。)我怀疑我也在做一些多余的事情......!
    【解决方案2】:

    如果你的 JS 看起来像这样:

    <div data-customAttribute={value} className={classes.testClass}></div>
    

    您的 CSS 将如下所示:

    .testClass[data-customAttribute="value"] {
      // your styles
    }
    

    【讨论】:

    • 感谢您的回复 :) Q 更具体地使用 CSS-in-JS 方法来执行此操作,例如 JSS。
    【解决方案3】:

    感谢@Vladyn 的大力支持,以下代码完美地展示了这一点:D

    import React from "react";
    import { create } from "jss";
    import { JssProvider, createUseStyles } from "react-jss";
    import nested from "jss-plugin-nested";
    
    const jss = create();
    jss.use(nested());
    
    const useStyles = createUseStyles({
      statusDiv: {
        backgroundColor: "lightGrey",
        padding: "10px",
        fontWeight: "bold",
        '&[data-status="OPEN"]': {
          color: "green",
        },
        '&[data-status="CLOSED"]': {
          color: "red",
        },
      },
    });
    
    const App = () => {
      const classes = useStyles();
      const status = "OPEN";
    
      return (
        <JssProvider jss={jss}>
          <div data-status={status} className={classes.statusDiv}>
            {status}
          </div>
        </JssProvider>
      );
    };
    
    export default App;
    

    【讨论】:

    • 很高兴我帮助了@AdyBaby。
    • MUI 注意:看起来如果你使用 Material UI,你必须使用 StylesProvider from @material-ui/core/styles 而不是 JssProvider,否则你会得到一个 Invalid prop jss of type Jss supplied to JssProvider 错误.
    猜你喜欢
    • 2016-12-09
    • 1970-01-01
    • 2022-12-17
    • 2011-06-08
    • 1970-01-01
    • 2016-08-02
    • 2019-10-24
    • 2019-08-03
    • 1970-01-01
    相关资源
    最近更新 更多