Material UI组件文档查找及Select样式继承问题求助
一、文档查找的正确思路
1. Box组件的noValidate/autoComplete props
当Box的component属性设为form时,Box会作为HTML的<form>元素渲染,此时noValidate和autoComplete是HTML form元素的原生属性,并非MUI Box组件自身的props,所以不会出现在Box的props文档里。你可以在MUI Box文档的component属性说明中找到相关提示:指定component为原生HTML元素时,所有该元素的原生属性都可以直接传递给Box。
2. sx属性中的& .MuiTextField-root配置
这是CSS嵌套选择器的用法:
&代表当前组件(这里是Box渲染的form元素).MuiTextField-root是MUI TextField组件的根全局类名
每个MUI组件的全局类名都可以在对应组件文档的「CSS」章节找到,比如TextField文档里会列出所有关联的CSS类名,其中根类名就是MuiTextField-root。这种写法的作用是给form内部所有TextField组件设置样式。
二、Select组件无法继承外层样式的解决方案
原因分析
外层Box的sx选择器只针对.MuiTextField-root,而Select组件的根全局类名是.MuiSelect-root,自然不会被选中。另外你给Select写的内部sx& .MuiSelect-root是错误的——&代表Select自身,它内部不存在另一个.MuiSelect-root元素,所以这个样式不会生效。
解决方法
有两种常用方式统一设置样式:
方法1:扩展外层选择器,同时包含TextField和Select的根类名
修改Box的sx属性,同时选中两个组件的根类:
<Box component="form" sx={{ '& .MuiTextField-root, & .MuiSelect-root': { m: 1, width: '25ch' }, }} noValidate autoComplete="off" > <div> <TextField required id="outlined-required" label="Required" defaultValue="Hello World" /> <Select labelId="demo-simple-select-label" id="demo-simple-select" value={age} label="Age" onChange={handleChange} > <MenuItem>Select an age</MenuItem> <MenuItem value={10}>Ten</MenuItem> <MenuItem value={20}>Twenty</MenuItem> <MenuItem value={30}>Thirty</MenuItem> </Select> </div> </Box>
方法2:使用更通用的父类选择器
TextField和Select的输入区域都继承自InputBase组件,它们的根元素都包含.MuiInputBase-root类名,所以可以用这个类名统一设置:
<Box component="form" sx={{ '& .MuiInputBase-root': { m: 1, width: '25ch' }, }} noValidate autoComplete="off" > {/* 内部组件代码不变 */} </Box>
额外提示
如果需要单独给某个Select设置特殊样式,直接在Select的sx属性里写样式即可,不需要嵌套选择器:
<Select // 其他props sx={{ m: 1, width: '30ch' }} // 直接设置样式 > {/* MenuItem */} </Select>
内容的提问来源于stack exchange,提问作者Kiolimandars

