Относительно вашего первого вопроса - 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