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

Авто-макет

Мы можем создавать автоматические макеты, если не укажем ширину столбца для наших точек останова.

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

import React from "react";
import { makeStyles } from "@material-ui/core/styles";
import Paper from "@material-ui/core/Paper";
import Grid from "@material-ui/core/Grid";
const useStyles = makeStyles(theme => ({
  root: {
    flexGrow: 1
  },
  paper: {
    padding: theme.spacing(2),
    textAlign: "center",
    color: theme.palette.text.secondary
  }
}));
export default function App() {
  const classes = useStyles();
  return (
    <div className={classes.root}>
      <Grid container spacing={3}>
        <Grid item xs>
          <Paper className={classes.paper}>foo</Paper>
        </Grid>
        <Grid item xs>
          <Paper className={classes.paper}>bar</Paper>
        </Grid>
        <Grid item xs>
          <Paper className={classes.paper}>baz</Paper>
        </Grid>
      </Grid>
    </div>
  );
}

для создания нашего макета.

У нас xs без точек останова, поэтому мы позволим Material UI определять размер столбцов.

Вложенная сетка

Мы можем создать вложенную сетку с помощью компонента Grid.

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

import React from "react";
import { makeStyles } from "@material-ui/core/styles";
import Grid from "@material-ui/core/Grid";
import Paper from "@material-ui/core/Paper";
const useStyles = makeStyles(theme => ({
  root: {
    flexGrow: 1
  },
  paper: {
    padding: theme.spacing(1),
    textAlign: "center",
    color: theme.palette.text.secondary
  }
}));
export default function App() {
  const classes = useStyles();
return (
    <div className={classes.root}>
      <Grid container spacing={1}>
        <Grid container item xs={3} spacing={1}>
          <Paper className={classes.paper}>foo</Paper>
        </Grid>
        <Grid container item xs={3} spacing={1}>
          <Paper className={classes.paper}>bar</Paper>
        </Grid>
        <Grid container item xs={3} spacing={1}>
          <Paper className={classes.paper}>baz</Paper>
        </Grid>
      </Grid>
    </div>
  );
}

для создания сетки внутри сетки.

Во вложенном элементе сетки мы помещаем Paper в качестве содержимого.

xs позволяет нам установить ширину столбца.

spacing позволяет нам установить интервал между столбцами.

Сетка Список

Списки сетки позволяют отображать коллекцию изображений в организованной сетке.

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

import React from "react";
import { makeStyles } from "@material-ui/core/styles";
import GridList from "@material-ui/core/GridList";
import GridListTile from "@material-ui/core/GridListTile";
const tileData = [
  { img: "http://placekitten.com/200/200", title: "cat" },
  { img: "http://placekitten.com/200/200", title: "cat" }
];
const useStyles = makeStyles(theme => ({
  root: {
    display: "flex",
    flexWrap: "wrap",
    justifyContent: "space-around",
    overflow: "hidden",
    backgroundColor: theme.palette.background.paper
  },
  gridList: {
    width: 500,
    height: 450
  }
}));
export default function App() {
  const classes = useStyles();
  return (
    <div className={classes.root}>
      <GridList cellHeight={160} className={classes.gridList} cols={3}>
        {tileData.map(tile => (
          <GridListTile key={tile.img} cols={tile.cols || 1}>
            <img src={tile.img} alt={tile.title} />
          </GridListTile>
        ))}
      </GridList>
    </div>
  );
}

У нас есть компонент GridList с некоторыми данными внутри.

У нас есть GridListTile, чтобы показать наш товар.

В нем есть элемент img, который отображает изображения.

cols имеет ширину столбца.

alt имеет альтернативный текст.

Список сетки с полосами заголовков

Мы можем добавить компонент GridListTitleBar, чтобы добавить строку заголовка к плитке изображения.

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

import React from "react";
import { makeStyles } from "@material-ui/core/styles";
import GridList from "@material-ui/core/GridList";
import GridListTile from "@material-ui/core/GridListTile";
import GridListTileBar from "@material-ui/core/GridListTileBar";
import IconButton from "@material-ui/core/IconButton";
import InfoIcon from "@material-ui/icons/Info";
const tileData = [
  { img: "http://placekitten.com/200/200", title: "cat", author: "john smith" },
  { img: "http://placekitten.com/200/200", title: "cat", author: "mary smith" }
];
const useStyles = makeStyles(theme => ({
  root: {
    display: "flex",
    flexWrap: "wrap",
    justifyContent: "space-around",
    overflow: "hidden",
    backgroundColor: theme.palette.background.paper
  },
  gridList: {
    width: 500,
    height: 450
  }
}));
export default function App() {
  const classes = useStyles();
  return (
    <div className={classes.root}>
      <GridList cellHeight={160} className={classes.gridList} cols={3}>
        {tileData.map(tile => (
          <GridListTile key={tile.img} cols={tile.cols || 1}>
            <img src={tile.img} alt={tile.title} />
            <GridListTileBar
              title={tile.title}
              subtitle={<span>by: {tile.author}</span>}
              actionIcon={
                <IconButton
                  aria-label={`info about ${tile.title}`}
                  className={classes.icon}
                >
                  <InfoIcon />
                </IconButton>
              }
            />
          </GridListTile>
        ))}
      </GridList>
    </div>
  );
}

У нас есть GridListTileBar компонент, который принимает title опору для заголовка.

subtitle имеет подзаголовок для плитки.

Чтобы добавить значки, мы установили пакет @material-ui/icons для добавления значков.

Заключение

Мы можем создать сетку с плитками для отображения текста и изображений. Изображение может сопровождаться заголовком и подзаголовком. Макет может быть установлен автоматически. Спасибо, что прочитали мою статью, надеюсь, вы нашли ее полезной!