Material UI - это библиотека материального дизайна, созданная для React.

Это набор компонентов React со стилями материального дизайна.

В этой статье мы рассмотрим, как добавить текстовые поля с помощью пользовательского интерфейса материала.

Размеры

Мы можем изменить размер текстового поля с помощью свойства size.

Например, мы можем написать:

import React from "react";
import TextField from "@material-ui/core/TextField";
export default function App() {
  return (
    <div className="App">
      <TextField label="Size" id="small" defaultValue="Small" size="small" />
    </div>
  );
}

добавить текстовое поле размером small.

Макет

Мы можем расположить наши текстовые поля по-своему.

Для этого мы можем написать:

import React from "react";
import TextField from "@material-ui/core/TextField";
import { makeStyles } from "@material-ui/core/styles";
const useStyles = makeStyles(theme => ({
  root: {
    display: "flex",
    flexWrap: "wrap"
  },
  textField: {
    marginLeft: theme.spacing(1),
    marginRight: theme.spacing(1),
    width: "25ch"
  }
}));
export default function App() {
  const classes = useStyles();
return (
    <>
      <div>
        <TextField
          id="filled-full-width"
          label="Label"
          style={{ margin: 8 }}
          placeholder="Placeholder"
          helperText="Full width!"
          fullWidth
          margin="normal"
          InputLabelProps={{
            shrink: true
          }}
          variant="filled"
        />
        <TextField
          label="None"
          id="filled-margin-none"
          defaultValue="foo"
          className={classes.textField}
          helperText="foo"
        />
        <TextField
          label="Dense"
          style={{ margin: 3 }}
          id="filled-margin-dense"
          defaultValue="bar"
          className={classes.textField}
          helperText="bar"
          margin="dense"
        />
      </div>
    </>
  );
}

для добавления текстовых полей.

У нас есть одно полноразмерное текстовое поле вверху и 2 более коротких внизу.

У них есть обычные реквизиты, у которых есть helperText для подсказки.

margin имеют запас.

У нас также есть несколько стилей для изменения полей.

className имеют имена классов.

placeholder есть заполнитель для текстовых полей.

variant можно заливать или нет.

margin может быть меньше значения по умолчанию с dense.

Неконтролируемый vs контролируемый

Текстовые поля могут быть неконтролируемыми, что означает, что они не имеют никакого состояния.

Или его можно контролировать, что означает, что к нему привязано состояние.

Чтобы создать контролируемое текстовое поле, мы можем добавить реквизиты value и onChange к TextField.

Например, мы можем написать:

import React from "react";
import TextField from "@material-ui/core/TextField";
export default function App() {
  const [name, setName] = React.useState("james");
  const handleChange = event => {
    setName(event.target.value);
  };
  return (
    <>
      <div>
        <TextField
          id="standard-name"
          label="Name"
          value={name}
          onChange={handleChange}
        />
      </div>
    </>
  );
}

У нас есть состояние name, которое передается в свойство value.

И функция handleChange, переданная в свойство onChange.

Затем, когда мы что-то вводим, функция handleChange запускается и вызывает setName для обновления состояния name.

Компоненты

TextField состоит из более мелких компонентов.

Они включают FormControl, Input, FilledInput, InputLabel, OutlinedInput и FormHelperText.

Например, мы можем заменить TextField на:

import React from "react";
import FormControl from "@material-ui/core/FormControl";
import Input from "@material-ui/core/Input";
import InputLabel from "@material-ui/core/InputLabel";
export default function App() {
  const [name, setName] = React.useState("james");
  const handleChange = event => {
    setName(event.target.value);
  };
  return (
    <>
      <div>
        <FormControl>
          <InputLabel htmlFor="input">Name</InputLabel>
          <Input id="input" value={name} onChange={handleChange} />
        </FormControl>
      </div>
    </>
  );
}

У нас есть Input для поля ввода и InputLabel для метки для поля ввода.

Чтобы добавить текст подсказки, мы можем использовать компонент FormHelperText:

import React from "react";
import FormControl from "@material-ui/core/FormControl";
import Input from "@material-ui/core/Input";
import InputLabel from "@material-ui/core/InputLabel";
import FormHelperText from "@material-ui/core/FormHelperText";
export default function App() {
  const [name, setName] = React.useState("james");
  const handleChange = event => {
    setName(event.target.value);
  };
  return (
    <>
      <div>
        <FormControl>
          <InputLabel htmlFor="input">Name</InputLabel>
          <Input id="input" value={name} onChange={handleChange} />
          <FormHelperText>enter your name</FormHelperText>
        </FormControl>
      </div>
    </>
  );
}

Мы также можем использовать компоненты OutlinedInput и FilledInput для добавления полей ввода с этими вариантами:

import React from "react";
import FormControl from "@material-ui/core/FormControl";
import OutlinedInput from "@material-ui/core/OutlinedInput";
import InputLabel from "@material-ui/core/InputLabel";
import FormHelperText from "@material-ui/core/FormHelperText";
export default function App() {
  const [name, setName] = React.useState("james");
  const handleChange = event => {
    setName(event.target.value);
  };
  return (
    <>
      <div>
        <FormControl>
          <InputLabel htmlFor="input">Name</InputLabel>
          <OutlinedInput
            id="input"
            value={name}
            onChange={handleChange}
            label="Name"
          />
          <FormHelperText>enter your name</FormHelperText>
        </FormControl>
      </div>
    </>
  );
}

, чтобы добавить в поле поле ввода с контуром.

И мы можем использовать FilledInput, чтобы добавить поле ввода с фоном:

import React from "react";
import FormControl from "@material-ui/core/FormControl";
import FilledInput from "@material-ui/core/FilledInput";
import InputLabel from "@material-ui/core/InputLabel";
import FormHelperText from "@material-ui/core/FormHelperText";
export default function App() {
  const [name, setName] = React.useState("james");
  const handleChange = event => {
    setName(event.target.value);
  };
  return (
    <>
      <div>
        <FormControl>
          <InputLabel htmlFor="input">Name</InputLabel>
          <FilledInput id="input" value={name} onChange={handleChange} />
          <FormHelperText>enter your name</FormHelperText>
        </FormControl>
      </div>
    </>
  );
}

Заключение

TextField состоит из множества компонентов формы.

Следовательно, мы можем добавить их вместо TextField.

Мы также можем сделать текстовое поле и ввод контроллера.