Как использовать useStyles и makeStyles из пользовательского интерфейса материала с Gatsby - PullRequest
1 голос
/ 06 мая 2020

Я пытаюсь использовать Material UI в своем проекте Gatsby, но синтаксис совершенно другой, и я хотел бы понять, что происходит в этом сценарии.

Я пытаюсь передать useStyles своему компоненту заголовка и перепробовал массу разных подходов, прочитал гэтсби и реагировал на документы, но я наткнулся на стену. () требуется в компоненте

также мне нужно передать useStyles в функцию, чтобы начать с?

const useStyles = makeStyles((theme) => ({
  root: {
    flexGrow: 1,
  },
  menuButton: {
    marginRight: theme.spacing(2),
  },
  title: {
    flexGrow: 1,
  },
}));

const Header = ({ siteTitle }) => {
  const {classes} = useStyles

  return classes (
    <div className={classes.root}>
      <AppBar position="static">
        <Toolbar>
          <IconButton edge="start" className={classes.menuButton} color="inherit" aria-label="menu">
            <MenuIcon />
          </IconButton>
          <Typography variant="h6" className={classes.title}>
            {siteTitle}
          </Typography>
          <Button color="inherit">Login</Button>
        </Toolbar>
      </AppBar>
    </div>
  );
}

Header.propTypes = {
  siteTitle: PropTypes.string,
}

Header.defaultProps = {
  siteTitle: ``,
}

export default Header

1 Ответ

1 голос
/ 06 мая 2020

Относительно вашего первого вопроса - useStyles - это функция, возвращающая объект. Если вы хотите иметь возможность использовать этот объект (а вы хотите, это способ его использования) - вам необходимо вызвать функцию.

Если вы сделаете const {classes} = useStyles - это не имеет смысла, потому что в вашей useStyles ссылке (которая является ссылкой на функцию) отсутствует сущность classes.

Как только вы вызовите функцию useStyles и поместите ее значение внутри classes const - вы можете использовать classes.CLASS_NAME (который в конечном итоге создает сгенерированное имя класса со значениями стиля, которые вы написали, на основе определения makeStyles.

В вашем примере - classes.title создаст новый класс (скажем, имя makeStyles-root-1) со значением flex-grow: 1.
Если это будет файл css, он будет выглядеть как это:

.makeStyles-root-1 {
    flex-grow: 1;
}

И внутри вашего компонента реакции вы можете использовать его так:

<div className="makeStyles-root-1">...</div>

Вместо этого - у вас есть простая ссылка на этот конкретный стиль c внутри вашего javascript код.

Что касается вашего кода - он должен выглядеть так:

const useStyles = makeStyles((theme) => ({
  root: {
    flexGrow: 1,
  },
  menuButton: {
    marginRight: theme.spacing(2),
  },
  title: {
    flexGrow: 1,
  },
}));

const Header = ({ siteTitle }) => {
  const classes = useStyles();

  return (
    <div className={classes.root}>
      <AppBar position="static">
        <Toolbar>
          <IconButton edge="start" className={classes.menuButton} color="inherit" aria-label="menu">
            <MenuIcon />
          </IconButton>
          <Typography variant="h6" className={classes.title}>
            {siteTitle}
          </Typography>
          <Button color="inherit">Login</Button>
        </Toolbar>
      </AppBar>
    </div>
  );
}

Header.propTypes = {
  siteTitle: PropTypes.string,
}

Header.defaultProps = {
  siteTitle: ``,
}

export default Header
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...