Как изменить цвет контура входного компонента 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)

Я нашел решение здесь: авторы фреймворка не очень хорошо описали это в документах.

https://github.com/mui-org/material-ui/issues/13557

Другие вопросы по тегам