开发者问题收集

ReactJS:TypeError:theme.spacing 不是一个函数

2021-05-07
18048

我正在构建一个“ReactJS”应用程序,遇到了以下错误:

TypeError: theme.spacing is not a function
(anonymous function)
E:/Projects/PortfolioSite/React-Portfolio-Website/react-portfolio-website/src/components/Navbar.js:39
  36 |     avatar:{
  37 |         display: "block",
  38 |         margin: "0.5rem auto",
> 39 |         width: theme.spacing(13),
  40 |         heght: theme.spacing(13)
  41 |     }
  42 | }));

我已经从 “@material-ui/styles” 导入了 makestyles 。但它输出了上述错误:

供您参考,我想添加我使用的完整代码:

import React from 'react';
import {makeStyles} from "@material-ui/styles";

import {
    AppBar,
    Toolbar,
    ListItem,
    ListItemIcon,
    IconButton,
    ListItemText,
    Avatar,
    Divider,
    List,
    Typography,
    Box
} from "@material-ui/core";

import {
    ArrowBack,
    AssignmentInd,
    Home,
    Apps,
    ContactMail

} from "@material-ui/icons";

import avatar from "../Assets/Images/avatar.png";

//CSS styles
const useStyles = makeStyles( theme =>({
    menuSliderContainer:{
        width: 250,
        background: "#511",
        height: "30rem"
    },
    avatar:{
        display: "block",
        margin: "0.5rem auto",
        width: theme.spacing(13),
        heght: theme.spacing(13)
    }
}));

const menuItems = [
    {
        listIcon: <Home/>,
        listText: "Home"
    },
    {
        listIcon: <AssignmentInd/>,
        listText: "Resume"
    },
    {
        listIcon: <Apps/>,
        listText: "Portfolio"
    },    
    {
        listIcon: <ContactMail/>,
        listText: "Contact"
    },    
    {
        listIcon: <Home/>,
        listText: "Home"
    }
]

const Navbar = () => {
    const classes = useStyles()
    return (
        <>
        <Box component="div" className={classes.menuSliderContainer}>
            <Avatar src={avatar} className={classes.avatar} alt="Pawara Siriwardhane"/>
            <Divider/>
            <List>
                {menuItems.map((lstItem,key)=>(
                    <ListItem button key={key}>
                        <ListItemIcon>
                            {lstItem.listIcon}
                        </ListItemIcon>
                        <ListItemText/>
                    </ListItem>
                ))}
            </List>
        </Box>
        <Box component="nav">
            <AppBar position="static" style={{background:"#222"}}>
                <Toolbar>
                <IconButton>
                    <ArrowBack style={{color: "tomato"}}/>
                </IconButton>
                <Typography variant="h5" style={{color:"tan"}}> Portfolio </Typography>
                </Toolbar>
            </AppBar>
        </Box>
        </>
    )
}

export default Navbar

我已经浏览过
已经问过的问题: 为什么Material-UI无法识别theme.spacing函数?
& GitHub 对话: [Grid] 使用无单位间距 API #14099
但找不到可行的答案。

3个回答

发生这种情况是因为您的应用程序没有定义material-ui主题。然后应用默认的material ui主题或您自己的主题。可以通过两种方式完成:

  1. 使用 ThemeProvider 组件包装您的应用程序
  2. @material-ui/core/styles 而不是 @material-ui/styles 导出makeStyles钩子,以便拥有默认主题。
Bar
2021-05-08

我想补充一下之前的回答,指出导致此错误的另一个原因是,从 Material UI 4.x 迁移到 Material 5.x 后,分别从 @mui/styles 导入,假设已经创建了样式对象,确实如您的代码中所示,您引用的主题对象默认不再存在,例如:

import { makeStyles } from '@material-ui/core/styles';

export default makeStyles((theme) => ({

  paper: {
    marginTop: theme.spacing(8), // <-- this theme as isn't defined will 
                                 // cause the error
    display: 'flex',
    flexDirection: 'column',
    alignItems: 'center',
    padding: theme.spacing(2),
  },
  root: {
    '& .MuiTextField-root': {
        margin: theme.spacing(1),
  },
}

如果您想使用主题默认属性,则将该样式更改为

import { makeStyles } from '@mui/styles';
import { useTheme } from '@mui/material/styles';

export default makeStyles(() => ({

  paper: {
    marginTop: useTheme().spacing(8),
    display: 'flex',
    flexDirection: 'column',
    alignItems: 'center',
    padding: useTheme().spacing(2),
  },
  root: {
    '& .MuiTextField-root': {
    margin: useTheme().spacing(1),
  },
},
Carmine Tambascia
2021-12-10

根据 MUI 的最新版本,您应该从 @mui/styles 导入 makeStyles。

  1. 由于 defaultTheme 不再可用,请在应用程序的根目录下添加 ThemeProvider。
  2. 如果您将此实用程序与 @mui/material 一起使用,建议您使用来自 @mui/material/styles 的 ThemeProvider 组件
Kisore
2021-10-21