在文档和其他SO问题中,我都在寻找高低答案。
我在单独的JS文件中使用createMuiTheme
选项来覆盖某些默认样式,但很难理解overrides
选项的工作原理。
const theme = createMuiTheme({
...other code,
overrides: {
MuiFormControlLabel: {
focused: {
color: '#4A90E2'
}
},
MuiOutlinedInput: {
focused: {
border: '1px solid #4A90E2'
},
notchedOutline: {
border: '1px solid #4A90E2'
},
},
MuiFormLabel: {
focused: {
color: '1px solid #4A90E2'
}
}
}
)};
然后在我的组件中,我按如下方式使用它:
import theme from './styles/ThemeStyles';
import { withStyles } from '@material-ui/core/styles';
class SignInForm extends Component {
render() {
const { classes } = this.props;
<form className={classes.container} noValidate autoComplete='off'>
<TextField
id="outlined-email-input"
label="Email"
className={classes.textField}
type="email"
name="email"
autoComplete="email"
margin="normal"
variant="outlined"
/>
</form>
}}
我的问题是,我缺少什么使我的组件看起来如此时髦?将来,我如何知道在ThemeProvider的overrides
选项中定位的对象,以免遇到类似情况?
答案 0 :(得分:8)
感谢Rudolf Olah的帮助,并向我指出了正确的方向!我可以使用以下代码解决此问题:
overrides: {
MuiOutlinedInput: {
root: {
position: 'relative',
'& $notchedOutline': {
borderColor: 'rgba(0, 0, 0, 0.23)',
},
'&:hover:not($disabled):not($focused):not($error) $notchedOutline': {
borderColor: '#4A90E2',
// Reset on touch devices, it doesn't add specificity
'@media (hover: none)': {
borderColor: 'rgba(0, 0, 0, 0.23)',
},
},
'&$focused $notchedOutline': {
borderColor: '#4A90E2',
borderWidth: 1,
},
},
},
MuiFormLabel: {
root: {
'&$focused': {
color: '#4A90E2'
}
}
}
答案 1 :(得分:5)
要查找可以更改的类名称和CSS属性,请the documentation for the Component API shows a list。
TextField
是一种特殊情况,因为它组合并呈现了多个子组件,因此您可以将CSS属性传递到Input
组件和FormHelperText
组件。
OutlinedInput是一个非常特殊的情况,因为它实际上将NotchedInput用作具有自己的CSS属性的输入元素。
看看code for the OutlinedInput,您会看到正在使用子选择器:
root: {
position: 'relative',
'& $notchedOutline': {
borderColor,
},
// ...
问题似乎在于OutlinedInput没有正确设置NotchedOutline的样式
您可能对此感到幸运:
const theme = createMuiTheme({
// ...other code,
overrides: {
// ...
MuiOutlinedInput: {
focused: {
border: '1px solid #4A90E2'
},
'& $notchedOutline': {
border: '1px solid #4A90E2'
},
},
// ...
}
});
答案 2 :(得分:0)
我在这里找到了解决方案:框架的作者并没有在文档中很好地涵盖这一点。
答案 3 :(得分:0)
文档here对此进行了很好的介绍。
在标有“自定义CSS”的字段内单击以进行演示。
以下是使用原始的TextField
组件可以完成的操作:
import React from 'react'
import PropTypes from 'prop-types'
import { withStyles } from '@material-ui/core/styles'
import TextField from '@material-ui/core/TextField'
const styles = theme => ({
textField: {
marginLeft: theme.spacing.unit * 3,
marginBottom: '0px',
},
label: {
'&$focused': {
color: '#4A90E2'
},
},
focused: {},
outlinedInput: {
'&$focused $notchedOutline': {
border: '1px solid #4A90E2'
},
},
notchedOutline: {},
})
const CustomOutline = ({classes}) => (
<TextField
id="outlined-email-input"
label="Email"
className={classes.textField}
type="email"
name="email"
autoComplete="email"
margin="normal"
variant="outlined"
InputLabelProps={{
classes: {
root: classes.label,
focused: classes.focused,
},
}}
InputProps={{
classes: {
root: classes.outlinedInput,
focused: classes.focused,
notchedOutline: classes.notchedOutline,
},
}}
/>
)
CustomOutline.propTypes = {
classes: PropTypes.object.isRequired,
}
export default withStyles(styles)(CustomOutline)