如何在React中使用样式组件(不是material-ui类!)来设置material-ui选择组件的样式?

发布于 2025-01-14 22:13:05 字数 1920 浏览 0 评论 0原文

我正在努力使用样式组件而不是材质类来设计我的材质 UI 选择组件。我使用的是material-ui/core 4.12.3。

如果我使用例如材料中的旧 makeStyles 组件并创建我自己的类,那么它工作得很好,以及例如内联或通过 menuProps 的样式。

有效

  const useStyles = makeStyles((theme) => ({
    icon: {
      top: 0,
      marginRight: '1px',
    },
    selectRoot: {
      '&:focus': {
        backgroundColor: 'white',
        borderRadius: '10px',
      },
    },
  }))

有效

          <StyledSelect>
          classes={
            {
              //icon: classes.icon,
              //root: classes.selectRoot,
            }
          }

      MenuProps={{
        anchorOrigin: {
          vertical: 'bottom',
          horizontal: 'left',
        },

        getContentAnchorEl: null,
        style: {
          maxHeight: 400,
        },
      }}
                  style={{
                    border: '1px solid grey',
                    backgroundColor: 'white',
                    borderRadius: '10px',
                    width: '140px',
                    height: '40px',
                  }}
</StyledSelect>

但为了项目的完整性和限制,我更喜欢使用样式组件进行样式设置。

到目前为止,我只能改变字母颜色。即使我尝试使用开发工具中出现的类名称来设计它,也没有什么真正有效的。

不起作用(遗憾的是)

  StyledSelect: styled(Select)`
  border: '1px solid grey';
  backgroundColor: white;
  borderRadius: '10px';
  width: '140px';
  height: '40px'

  '&:focus': {
    backgroundColor: 'white';
    background-color: 'white';
    borderRadius: '10px',
  };
  .MuiSelect-select:focus {
    backgroundColor: 'white';
    background-color: 'white';
    borderRadius: '10px',
  },
    &.MuiSelect-select:focus {
      backgroundColor: 'white',
      background-color: 'white',
      borderRadius: '10px',
    },
    & .MuiInputBase-formControl {
      border-color: red;
    }
    icon: {
      top: 0,
      marginRight: '1px',
    },

材料文档在这种情况下并没有多大帮助。 有什么想法吗?

I am struggling with styling my material-ui select component with styled-components, instead of material- classes. I am using material-ui/core 4.12.3.

If i use for example old makeStyles component from material and create my own classes it works just fine, as well as for example styling inline or via menuProps.

Works

  const useStyles = makeStyles((theme) => ({
    icon: {
      top: 0,
      marginRight: '1px',
    },
    selectRoot: {
      '&:focus': {
        backgroundColor: 'white',
        borderRadius: '10px',
      },
    },
  }))

Works

          <StyledSelect>
          classes={
            {
              //icon: classes.icon,
              //root: classes.selectRoot,
            }
          }

      MenuProps={{
        anchorOrigin: {
          vertical: 'bottom',
          horizontal: 'left',
        },

        getContentAnchorEl: null,
        style: {
          maxHeight: 400,
        },
      }}
                  style={{
                    border: '1px solid grey',
                    backgroundColor: 'white',
                    borderRadius: '10px',
                    width: '140px',
                    height: '40px',
                  }}
</StyledSelect>

But for the project integrity and restriction i prefer to style with style-components.

So far, i only managed to change letters color. Nothing else really works, even if i try to style it with use of classess names appeared in dev tools.

DOES NOT WORKS (sadly)

  StyledSelect: styled(Select)`
  border: '1px solid grey';
  backgroundColor: white;
  borderRadius: '10px';
  width: '140px';
  height: '40px'

  '&:focus': {
    backgroundColor: 'white';
    background-color: 'white';
    borderRadius: '10px',
  };
  .MuiSelect-select:focus {
    backgroundColor: 'white';
    background-color: 'white';
    borderRadius: '10px',
  },
    &.MuiSelect-select:focus {
      backgroundColor: 'white',
      background-color: 'white',
      borderRadius: '10px',
    },
    & .MuiInputBase-formControl {
      border-color: red;
    }
    icon: {
      top: 0,
      marginRight: '1px',
    },

Material documention does not really that helpfull in this case.
Any ideas ?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

虚拟世界 2025-01-21 22:13:05

它没有做太多事情,因为 Material UI 组件不是简单的 HTML 元素。例如,如果您在开发工具中查看 HTML 树,“Select”不会呈现为 而是呈现为

<div>
  <label />
  <div>
    <div />
    <input />
    <svg>
      <path />
    </svg>
    <fieldset>
      <legend>
        <span />
      </legend>
    </fieldset>
  </div>
</div>

...嵌套在上述组件树的各个级别,因此要修改特定的边框或背景样式,您必须确切地知道使用特定选择器定位哪个元素(因为 id 属性在每个使成为)。

相反,您可以继续使用材质文档中提供的css属性,但不要尝试通过将 Material UI 根组件定义为样式组件来替换它。如果您将 Material Select 组件包装在您自己的另一个由 styled-components 制作的 div 中,那么您可以将这些属性传递给子 Material 元素,就像您现在所做的那样。

有些属性需要一个“!important”标志来覆盖 Material 中的样式,有些则需要您使用 somethingProps (例如“menuProps”、“inputProps”等)属性以便覆盖样式。这是因为,当您使用 somethingProps 属性,Material 会自动将这些样式级联到树中的正确元素。

It isn't doing much since Material UI components are not simple HTML elements. For example, if you look in the HTML tree in dev tools, a "Select" is rendered not as a <select>...</select> but rather as...

<div>
  <label />
  <div>
    <div />
    <input />
    <svg>
      <path />
    </svg>
    <fieldset>
      <legend>
        <span />
      </legend>
    </fieldset>
  </div>
</div>

The styles are nested at various levels of the above component tree, so to modify a particular border or background style, you will have to know exactly which element to target using a specific selector (since the id properties change on every render).

Instead, you can continue to use the css properties provided in the material documentation, but do not attempt to replace the Material UI root component by defining it as a styled component. If you wrap the Material Select component in another div of your own, made with styled-components, then you can pass down those attributes to the children Material elements similar to how you are doing now.

Some attributes will need a "!important" flag to override the style in Material, and some will require you to use the somethingProps (e.g. "menuProps", "inputProps", etc.) properties in order to override the style. This is because while overriding it manually with the class name from the docs and a "!important" flag is very good at targeting one (or a couple) of the components in the tree, when you use the somethingProps properties, Material will automatically cascade those styles to the right elements in the tree.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文