Как изменить цвет контура входного компонента React материала UI?
Я искал ответ в верхах и низах как в документах, так и в других SO-вопросах.
Я использую createMuiTheme
вариант в отдельном файле JS, чтобы переопределить определенный стиль по умолчанию, но мне трудно понять, как 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>
}}
У меня вопрос: чего мне не хватает, чтобы мой компонент выглядел так классно? И в будущем, как я узнаю, на что нацеливаться в overrides
вариант ThemeProvider, чтобы я не сталкивался с подобными ситуациями?
3 ответа
Спасибо Рудольфу Олаху за помощь и направил меня в правильном направлении! Я смог решить проблему с помощью следующего кода:
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'
}
}
}
Чтобы найти имена классов и CSS-свойства, которые вы можете изменить, документация по API-компонентам показывает список.
TextField
хотя это особый случай, поскольку он объединяет и отображает несколько подкомпонентов, он позволяет передавать свойства CSS в Input
компонент и FormHelperText
составная часть.
И OutlinedInput - это особый случай, потому что он фактически использует NotchedInput для элемента ввода, который имеет свои собственные свойства CSS.
Взглянув на код 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'
},
},
// ...
}
});
Это описано в документации довольно хорошо здесь.
Щелкните внутри поля с надписью "Custom 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)
Я нашел решение здесь: авторы фреймворка не очень хорошо описали это в документах.