MaterialUI TextField: изменение цвета фона не работает должным образом

Я пытаюсь установить цвет фона для TextField компонентов в приложении, над которым я работаю, однако кажется, что когда я добавляю style={{background: "rgb(232, 241, 250)"}} к этому компоненту с моими пользовательскими значениями RGB, он отображает их поверх серого цвета фона по умолчанию.

Цвет фона должен быть таким же светло-голубым, как и в компонентах выше:  снимок экрана проблемы

  1. Я попытался решить это, просто добавив к нему свойство style

  2. Также, добавив makeStyles() к компоненту и прикрепив его через className

В обоих случаях я получил такой вывод, как на скриншоте выше.

  1. Мне удалось получить правильный цвет фона, удалив variant=filled или установив для него значение standard или outlined, но тогда отступы вокруг текста будут удалены.

Я действительно не понимаю, что это за проблема и как ее исправить?

import React from "react";
import {TextField} from "@material-ui/core";

import { makeStyles } from '@material-ui/core/styles';

const useStyles = makeStyles((theme) => ({
     root: {
         background: 'rgb(232, 241, 250)'
      },
}));

export interface InquiryContentInputProps {
   content: string;
   onChange: (content: string) => void;
}

export function InquiryContentInput(props: InquiryContentInputProps) {
   const classes = useStyles();

   return (
       <TextField
          variant="filled"
          // style={{background: "rgb(232, 241, 250)"}}
          className={classes.root}
          fullWidth={true}
          multiline={true}
          rows={5}
          rowsMax={10}
          value={props.content}
          onChange={(e) => props.onChange(e.target.value as string)}
          label="Суть обращения"/>
   )
}

person Konstantink1    schedule 03.11.2020    source источник


Ответы (1)


TextField отображает несколько элементов - внешний <div> для FormControl, а затем внутри него InputLabel и Элемент ввода (например, FilledInput).

Опора className на TextField применяет этот класс к FormControl. По умолчанию цвет фона для FilledInput rgba(0, 0, 0, 0.09), поэтому он все еще применялся к вашему голубому фону на FormControl.

Вместо этого вы можете переопределить цвет фона в FilledInput следующим образом:

import React from "react";
import TextField from "@material-ui/core/TextField";

import { makeStyles } from "@material-ui/core/styles";

const useStyles = makeStyles((theme) => ({
  root: {
    "& .MuiFilledInput-root": {
      background: "rgb(232, 241, 250)"
    }
  }
}));

export default function InquiryContentInput(props) {
  const classes = useStyles();

  return (
    <TextField
      variant="filled"
      className={classes.root}
      fullWidth={true}
      multiline={true}
      rows={5}
      rowsMax={10}
      value={props.content}
      onChange={(e) => props.onChange(e.target.value)}
      label="Суть обращения"
    />
  );
}

 Редактировать фон заполненного текстового поля

Другой вариант - использовать InputProps, чтобы указать className для ввода:

import React from "react";
import TextField from "@material-ui/core/TextField";

import { makeStyles } from "@material-ui/core/styles";

const useStyles = makeStyles((theme) => ({
  input: {
    background: "rgb(232, 241, 250)"
  }
}));

export default function InquiryContentInput(props) {
  const classes = useStyles();

  return (
    <TextField
      variant="filled"
      InputProps={{ className: classes.input }}
      fullWidth={true}
      multiline={true}
      rows={5}
      rowsMax={10}
      value={props.content}
      onChange={(e) => props.onChange(e.target.value)}
      label="Суть обращения"
    />
  );
}

 Редактировать заполненный фон текстового поля (разветвленный)

Просто следующий вопрос: если бы я хотел изменить цветовую схему фона в этом TextField при фокусировке и наведении курсора, сделал бы я это с помощью некоторого переопределения класса в makeStyles? И что бы это было или где я мог бы найти названия этих классов?

Есть два основных способа определить названия классов:

  1. Изучите элементы в инструментах разработчика браузера, чтобы увидеть классы, добавленные Material-UI.

  2. Посмотрите исходный код. Это требует понимания того, как генерируются имена классов CSS Material-UI.

В FilledInput, вы можете найти следующие определенные стили (упрощенные ниже, чтобы включить только стили цвета фона):

export const styles = (theme) => {
  const light = theme.palette.type === 'light';
  const backgroundColor = light ? 'rgba(0, 0, 0, 0.09)' : 'rgba(255, 255, 255, 0.09)';

  return {
    /* Styles applied to the root element. */
    root: {
      backgroundColor,
      transition: theme.transitions.create('background-color', {
        duration: theme.transitions.duration.shorter,
        easing: theme.transitions.easing.easeOut,
      }),
      '&:hover': {
        backgroundColor: light ? 'rgba(0, 0, 0, 0.13)' : 'rgba(255, 255, 255, 0.13)',
        // Reset on touch devices, it doesn't add specificity
        '@media (hover: none)': {
          backgroundColor,
        },
      },
      '&$focused': {
        backgroundColor: light ? 'rgba(0, 0, 0, 0.09)' : 'rgba(255, 255, 255, 0.09)',
      },
      '&$disabled': {
        backgroundColor: light ? 'rgba(0, 0, 0, 0.12)' : 'rgba(255, 255, 255, 0.12)',
      },
    },

Ключи в этой структуре (например, root) будут преобразованы в имена классов с общим шаблоном Mui${componentName}-${styleRuleKey} (например, MuiFilledInput-root). Псевдоклассы (например, $focused, $disabled) задокументированы здесь и имеют префиксы с Mui- (например, Mui-focused, Mui-disabled).

Вы можете переопределить цвета при наведении и фокусировке, следуя той же схеме, что и в исходном коде FilledInput:

import React from "react";
import TextField from "@material-ui/core/TextField";

import { makeStyles } from "@material-ui/core/styles";

const useStyles = makeStyles((theme) => ({
  root: {
    "& .MuiFilledInput-root": {
      backgroundColor: "rgb(232, 241, 250)"
    },
    "& .MuiFilledInput-root:hover": {
      backgroundColor: "rgb(250, 232, 241)",
      // Reset on touch devices, it doesn't add specificity
      "@media (hover: none)": {
        backgroundColor: "rgb(232, 241, 250)"
      }
    },
    "& .MuiFilledInput-root.Mui-focused": {
      backgroundColor: "rgb(250, 241, 232)"
    }
  }
}));

export default function InquiryContentInput(props) {
  const classes = useStyles();

  return (
    <TextField
      variant="filled"
      className={classes.root}
      fullWidth={true}
      multiline={true}
      rows={5}
      rowsMax={10}
      value={props.content}
      onChange={(e) => props.onChange(e.target.value)}
      label="Суть обращения"
    />
  );
}

 Редактировать фон текстового поля с заливкой (наведение и фокус)

У меня есть еще один дополнительный вопрос. Если бы я хотел определить эти значения в теме (например, MuiFilledInput для всех состояний, включая наведение и фокус), как бы я это сделал? Я смог добавить его в обычное состояние прямо сейчас, добавив: const theme = createMuiTheme({ "overrides": { "MuiFilledInput": { "root": { "backgroundColor": 'rgb(232, 241, 250)' } } } }) Но я не могу добавить пользовательские значения фона в тему для наведения и фокуса

Вот синтаксис для выполнения тех же стилей в теме:

import React from "react";
import TextField from "@material-ui/core/TextField";

import { createMuiTheme, ThemeProvider } from "@material-ui/core/styles";

const theme = createMuiTheme({
  overrides: {
    MuiFilledInput: {
      root: {
        backgroundColor: "rgb(232, 241, 250)",
        "&:hover": {
          backgroundColor: "rgb(250, 232, 241)",
          // Reset on touch devices, it doesn't add specificity
          "@media (hover: none)": {
            backgroundColor: "rgb(232, 241, 250)"
          }
        },
        "&.Mui-focused": {
          backgroundColor: "rgb(250, 241, 232)"
        }
      }
    }
  }
});

export default function InquiryContentInput(props) {
  return (
    <ThemeProvider theme={theme}>
      <TextField
        variant="filled"
        fullWidth={true}
        multiline={true}
        rows={5}
        rowsMax={10}
        value={props.content}
        onChange={(e) => props.onChange(e.target.value)}
        label="Суть обращения"
      />
    </ThemeProvider>
  );
}

Редактировать фон заполненного текстового поля (наведение и фокус) с помощью темы

person Ryan Cogswell    schedule 03.11.2020
comment
Все заработало, спасибо! Просто следующий вопрос: если бы я хотел изменить цветовую схему фона в этом TextField при фокусировке и наведении курсора, смог бы я сделать это с помощью некоторого переопределения класса в makeStyles? И что бы это было или где я мог бы найти названия этих классов? - person Konstantink1; 05.11.2020
comment
@ Konstantink1 Я добавил еще один пример в конец своего ответа. - person Ryan Cogswell; 05.11.2020
comment
@RyanCogswell. Привет! Не могли бы вы помочь мне в этом stackoverflow .com / questions / 64726379 /. Спасибо - person Joseph; 07.11.2020
comment
@RyanCogswell И снова здравствуйте, у меня есть еще один вопрос. Если бы я хотел определить эти значения в теме (например, MuiFilledInput для всех состояний, включая наведение и фокус), как бы я это сделал? Я смог добавить его в обычное состояние прямо сейчас, добавив: const theme = createMuiTheme ({переопределяет: {MuiFilledInput: {root: {backgroundColor: 'rgb (232, 241, 250)'}}}}) Но я могу Не добавляйте в тему собственные значения фона для наведения и фокуса. - person Konstantink1; 09.11.2020
comment
@ Konstantink1 В конце я добавил пример темы. - person Ryan Cogswell; 09.11.2020