reactjs - useState 在带有材料 ui 抽屉的下一个 js 中不起作用
问题描述
使用状态不起作用。我已经搜索了一个解决方案,我检查了许多表单,例如https://github.com/vercel/next.js/issues/7626,https://github.com/vercel/next.js/issues/17592, Hooks 错误:在 Windows 上使用 NextJS 或 ReactJS 的 Hook Call 无效,有些人似乎建议可以通过删除他们没有提及名称的节点模块来解决它,其他人说如果他们更改他们的 webpack 配置它可以工作,但我从未使用过 webpack并且找不到他们提到的,所以我被困住了。
我正在实现材质 ui 的抽屉,我创建了一个抽屉组件并导入了它。
导航.jsx:
import React, { useState } from 'React'
import SignedOutLinks from "./Links/SignedOutLinks"
import { AppBar, Toolbar } from "@material-ui/core"
import MenuBtn from "./Links/MenuBtn"
import Logo from "./Links/Logo"
import CategoryBtn from "./Links/CategoryBtn"
import ShoppingCartBtn from "./Links/ShoppingCartBtn"
import LanguageBtn from "./Links/LanguageBtn"
import DarkModeBtn from "./Links/DarkModeBtn"
import NotificationBtn from "./Links/NotificationBtn"
import SignedIn from "./Links/SignedIn"
import Grid from '@material-ui/core/Grid';
import Search from "./Search/Search"
import { useTheme } from '@material-ui/core/styles';
import useMediaQuery from '@material-ui/core/useMediaQuery';
import Drawer from './Drawer/Drawer'
const signedIn = true
const Nav = () => {
const [isOpened, setIsOpened] = useState(false)
const theme = useTheme()
const isMobile = useMediaQuery(theme.breakpoints.down("sm"))
const handleDrawerToggle = () => {
setIsOpened(!isOpened)
}
return (
<AppBar color="transparent" elevation={0} >
<Toolbar>
{
!isMobile?
<Grid
container
direction="row"
justify="space-between"
alignItems="center"
spacing={10}
>
<Grid item container spacing={5} xs={4} justify="flex-start" wrap="nowrap">
<Grid item>
<Logo/>
</Grid>
<Grid item>
<CategoryBtn />
</Grid>
</Grid>
<Grid item xs={4}>
<Search />
</Grid>
<Grid item container xs={4} justify="flex-end" wrap="nowrap">
<ShoppingCartBtn />
<LanguageBtn />
<DarkModeBtn />
<NotificationBtn />
{signedIn? <SignedIn /> : <SignedOutLinks />}
</Grid>
</Grid>
:
<div>
<Drawer isOpened={isOpened} />
<Grid
container
direction="row"
justify="space-around"
spacing={10}
>
<Grid item container xs={4} justify="flex-start">
<MenuBtn handleClick={handleDrawerToggle} />
</Grid>
<Grid item Container xs={4} justify="center" style={{textAlign: "center"}}>
<Grid item>
<Logo />
</Grid>
</Grid>
<Grid item container xs={4} justify="flex-end">
<ShoppingCartBtn />
</Grid>
</Grid>
</div>
}
</Toolbar>
</AppBar>
)
}
export default Nav
抽屉.jsx:
import { Drawer as MUIDrawer} from '@material-ui/core'
import { List, ListItem,ListItemText, ListItemIcon } from '@material-ui/core'
import NotificationsIcon from '@material-ui/icons/Notifications';
import TranslateIcon from '@material-ui/icons/Translate';
import Brightness4Icon from '@material-ui/icons/Brightness4';
import LocalShippingIcon from '@material-ui/icons/LocalShipping';
import AccountCircleIcon from '@material-ui/icons/AccountCircle';
import BusinessIcon from '@material-ui/icons/Business';
import ExitToAppIcon from '@material-ui/icons/ExitToApp';
import ChatBubbleOutlineIcon from '@material-ui/icons/ChatBubbleOutline';
import CategoryIcon from '@material-ui/icons/Category';
function Drawer({isOpened}) {
const items = [
{
text: user.userName,
icon: <AccountCircleIcon />
},
{
text: "Categories",
icon: <CategoryIcon />
},
{
text: "Language",
icon: <TranslateIcon />
},
{
text: "Mode",
icon: <Brightness4Icon />
},
{
text: "Notifications",
icon: <NotificationsIcon />
},
{
text: "Orders",
icon: <LocalShippingIcon />
},
{
text: "Are You a Seller?",
icon: <BusinessIcon />
},
{
text: "Messages",
icon: <ChatBubbleOutlineIcon />
},
{
text: "Logout",
icon: <ExitToAppIcon />
}
]
return (
<div>
<MUIDrawer open={isOpened}>
<List>
{
items.map(item => {
return (
<ListItem button key={item.text} >
{item.icon && <ListItemIcon>{item.icon}</ListItemIcon>}
<ListItemText primary={item.text} />
</ListItem>
)
})
}
</List>
</MUIDrawer>
</div>
)
}
export default Drawer
请注意,在我对 Drawer 进行编码之前它工作正常,而且 useState 也是在最开始时导入的,所以我没有忘记导入它
编辑:
next.js 中的文件夹结构
index.js:
import Head from 'next/head'
import styles from '../styles/Home.module.css'
import Nav from '../Components/Navbar/Nav'
export default function Home() {
return (
<>
<Head>
<meta name="description" content="Everything for everyone. TRNC E-commerce website focused on a huge variety of categories from fashion to electronics. Order now and get your product delivered." />
</Head>
<div className={styles.container}>
<Nav />
</div>
</>
)
}
解决方案
它终于工作了,但是我找不到问题。我通过创建一个名为 Nav2 的新组件解决了这个问题,我从原始 Nav 组件中复制了相同的代码,瞧它工作了,我删除了旧的 Nav 组件并将 Nav2 重命名为 Nav,它继续工作。
注意:我发现我忘记在抽屉中导入 useContext,因为 user 是从 _app.js 发送的解构对象,所以我添加了
常量 { 用户 } = useContext(UserContext)
到组件函数的开头
推荐阅读
- sql - 在组中选择不同的值
- excel - Excel VBA中具有最大端点的动态范围
- angular - 使用 Input 将数据传递给另一个组件无法按预期工作
- observable - RxKotlin,RxJava:Observable/Single 未启动
- python - 问题在docker中安装pika(python中的rabbitmq sdk)_没有名为'pika'的模块
- javascript - 当我在反应中单击链接组件时如何重新加载页面?
- azure - 如何在最新的 Terraform 中通过地图(字符串)进行 for_each?
- python - 如何使 Flask 在 HTML 中运行函数并在同一页面上打印结果?
- symfony - symfony:仅授予每个人访问 API 上 access_control 中的 GET 方法的权限,但如果用户没有令牌,仍会获得 401 未授权
- mautic - 如何将网站内容动态导入mautic