如何在反应中使用样式组件(不是 material-ui 类!)设置 material-ui select 组件的样式?
How to style material-ui select component with style-components (not material-ui classes!) in react?
我正在为我的 material-ui select 组件设置样式而苦苦挣扎,而不是 material- 类。我正在使用 material-ui/core 4.12.3.
如果我使用 material 中的旧 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>
但为了项目的完整性和限制,我更喜欢使用 style-components 来设计样式。
到目前为止,我只设法改变了字母的颜色。即使我尝试使用 类 出现在开发工具中的名称来设置它的样式,其他任何东西都不起作用。
不起作用(可悲)
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 文档在这种情况下并没有多大帮助。
有什么想法吗?
它没有做太多,因为 Material UI 组件不是简单的 HTML 元素。例如,如果您在开发工具中查看 HTML 树,“Select” 不会呈现为 <select>...</select>
而是呈现为...
<div>
<label />
<div>
<div />
<input />
<svg>
<path />
</svg>
<fieldset>
<legend>
<span />
</legend>
</fieldset>
</div>
</div>
样式嵌套在上述组件树的不同级别,因此要修改特定的边框或背景样式,您必须使用特定的选择器确切地知道要定位哪个元素(因为 id
每次渲染都会更改属性)。
相反,您可以继续使用 css properties provided in the material documentation,但不要试图通过将 Material UI 根组件定义为样式组件来替换它。如果您将 Material Select 组件包装在您自己的另一个 div 中,使用 styled-components 制作,那么您可以将这些属性传递给子 Material 元素跟你现在做的差不多。
有些属性需要一个“!important”标志来覆盖 Material 中的样式,有些属性需要您使用 somethingProps
(例如“menuProps”、“inputProps”等.) 属性以覆盖样式。这是因为虽然使用文档中的 class 名称和“!重要”标志手动覆盖它,但当您使用 somethingProps
属性,Material 会自动将这些样式级联到树中的正确元素。
我正在为我的 material-ui select 组件设置样式而苦苦挣扎,而不是 material- 类。我正在使用 material-ui/core 4.12.3.
如果我使用 material 中的旧 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>
但为了项目的完整性和限制,我更喜欢使用 style-components 来设计样式。
到目前为止,我只设法改变了字母的颜色。即使我尝试使用 类 出现在开发工具中的名称来设置它的样式,其他任何东西都不起作用。
不起作用(可悲)
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 文档在这种情况下并没有多大帮助。 有什么想法吗?
它没有做太多,因为 Material UI 组件不是简单的 HTML 元素。例如,如果您在开发工具中查看 HTML 树,“Select” 不会呈现为 <select>...</select>
而是呈现为...
<div>
<label />
<div>
<div />
<input />
<svg>
<path />
</svg>
<fieldset>
<legend>
<span />
</legend>
</fieldset>
</div>
</div>
样式嵌套在上述组件树的不同级别,因此要修改特定的边框或背景样式,您必须使用特定的选择器确切地知道要定位哪个元素(因为 id
每次渲染都会更改属性)。
相反,您可以继续使用 css properties provided in the material documentation,但不要试图通过将 Material UI 根组件定义为样式组件来替换它。如果您将 Material Select 组件包装在您自己的另一个 div 中,使用 styled-components 制作,那么您可以将这些属性传递给子 Material 元素跟你现在做的差不多。
有些属性需要一个“!important”标志来覆盖 Material 中的样式,有些属性需要您使用 somethingProps
(例如“menuProps”、“inputProps”等.) 属性以覆盖样式。这是因为虽然使用文档中的 class 名称和“!重要”标志手动覆盖它,但当您使用 somethingProps
属性,Material 会自动将这些样式级联到树中的正确元素。