开发者问题收集

Material UI - makeStyles - 无法读取未定义的属性

2021-10-12
16712

我正在学习 Material UI,在课程中,讲师要求我只设计一个组件的样式,而不是整个主题。

为此,它使用 makeStyles 函数并传播 theme.mixins.toolbar 。问题是,当我这样做时,我遇到了以下错误:

TypeError: Cannot read properties of undefined (reading 'toolbar')

本课程显然是版本 4,而我使用的是版本 5。尽管如此,我的代码似乎遵循了文档要求的更改。那么是什么导致了这个错误?

app.js

import "./App.css";
import Header from "./components/ui/Header";
import { ThemeProvider } from "@material-ui/core/styles";
import theme from "./components/ui/Theme";

function App() {
    return (
        <ThemeProvider theme={theme}>
            <Header />
        </ThemeProvider>
    );
}

export default App;

Theme.js

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

const arcBlue = "#0B72B9";
const arcOrange = "#FFBA60";

export default createTheme({
    typography: {
        h3: {
            fontWeight: 100,
        },
    },
    palette: {
        common: {
            blue: `${arcBlue}`,
            orange: `${arcOrange}`,
        },
        primary: {
            main: `${arcBlue}`,
        },
        secondary: {
            main: `${arcOrange}`,
        },
    },
});

header/index.jsx

import React from "react";
import AppBar from "@mui/material/AppBar";
import Toolbar from "@mui/material/Toolbar";
import useScrollTrigger from "@mui/material/useScrollTrigger";
import Typography from "@mui/material/Typography";
import { makeStyles } from "@material-ui/styles";

function ElevationScroll(props) {
    const { children, window } = props;
    const trigger = useScrollTrigger({
        disableHysteresis: true,
        threshold: 0,
        target: window ? window() : undefined,
    });

    return React.cloneElement(children, {
        elevation: trigger ? 10 : 0,
    });
}

const useStyles = makeStyles((theme) => ({
    toolbarMargin: { ...theme.mixins.toolbar },
}));

function Header() {
    const classes = useStyles();
    return (
        <React.Fragment>
            <ElevationScroll>
                <AppBar color="primary">
                    <Toolbar>
                        <Typography variant="h3" component="h3">
                            Nome de teste
                        </Typography>
                    </Toolbar>
                </AppBar>
            </ElevationScroll>
            <div className={classes.toolBarMargin} />
        </React.Fragment>
    );
}

export default Header;

3个回答

由于您使用的是 v5,请将您的 ThemeProvidercreateThememakeStyles 导入路径从:

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

更改为:

import { ThemeProvider, createTheme } from "@mui/material/styles";
import { makeStyles } from "@mui/styles";

@material-ui/core 是 v4 包,而 @mui/material 是 v5 等效包。两个版本的 API 不兼容。在 v5 中, makeStyles 也被移至名为 @mui/styles 的旧包中,如果您在新项目中使用 MUI v5,则应完全切换到 styled / sx API,这是 MUI 团队 推荐的

相关答案

NearHuscarl
2021-10-13

我遇到了类似的问题, makeStyles 抛出了 无法读取未定义的属性,读取 refs 。在我的情况下,它是 mui v5,问题发生在升级到 React 18 之后。

在我的情况下,原来我有一些遗留的 makeStyles(()=>createStyles) 以一种方式包装:

const useStyles = (minWidth: number) =>
  makeStyles((theme: Theme) => ...

我不得不将其更改为:

const useStyles =
  makeStyles((theme: Theme) => ...

也许这对其他遇到此问题的人有用。

jckmlczk
2022-08-23

我在 CodeSandbox 上创建了一个项目,代码中似乎没有问题。 我猜你需要检查你在 package.json 文件中安装的包的版本。

这是 CodeSandbox 项目的链接,你可以在控制台选项卡上看到 console.log 消息。

https://codesandbox.io/s/check-makestyle-eq67m?file=/src/components/ui/Header/index.js

jihyun lee
2021-10-13