gpt4 book ai didi

javascript - 状态不随 useContext 改变

转载 作者:行者123 更新时间:2023-12-04 07:46:32 24 4
gpt4 key购买 nike

你好
我正在尝试进行菜单切换,其中我有一个以 false 作为初始值的变量,使用 react createContext 和 useContext Hook ,我将初始状态设置为 true

// useMenu Context
import React, { useContext, useState } from 'react'

export const useToggle = (initialState) => {
const [isToggled, setToggle] = useState(initialState)
const toggle = () => setToggle((prevState) => !prevState)
// return [isToggled, toggle];
return { isToggled, setToggle, toggle }
}

const initialState = {
isMenuOpen: true,
toggle: () => {},
}

export const MenuContext = React.createContext(initialState)

const MenuProvider = ({ children }) => {
const { isToggled, setToggle, toggle } = useToggle(false)
const closeMenu = () => setToggle(false)
return (
<MenuContext.Provider
value={{
isMenuOpen: isToggled,
toggleMenu: toggle,
closeMenu,
}}>
{children}
</MenuContext.Provider>
)
}
export default MenuProvider

export const useMenu = () => {
return useContext(MenuContext)
}
所以如果为真,它将显示菜单,如果为假,它将在有 div 的地方显示 div
应用.js
const { isMenuOpen } = useMenu()

//the providder
<MenuProvider>
<Header mode={theme} modeFunc={toggleTheme}/>
{isMenuOpen ? (
<Menu />
) : (
<Switch>
<Route path='/writing' component={Writings} />
<Route path='/meta' component={Meta} />
<Route path='/contact' component={Contact} />
<Route path='/project' component={Project} />
<Route exact path='/' component={Home} />
<Route path='*' component={NotFound} />
</Switch>
)}
<Footer />{' '}
</MenuProvider>

当我添加一个 onclick 事件时,菜单的 NavLink 按钮将其关闭它不起作用
菜单

const { closeMenu } = useMenu()
// return statement
{paths.map((item, i) => {
return (
<MenuItem
key={i}
link={item.location}
svg={item.icon}
path={item.name}
command={item.command}
onClick={closeMenu}
/>
)
})}
我哪里做错了

最佳答案

问题
我怀疑问题出在 App你在哪里有 useMenu Hook 外MenuProvider用于App .这个useMenu钩子(Hook)正在使用 MenuContext context 但在没有提供者的情况下,它改为使用默认的初始上下文值。

const initialState = {
isMenuOpen: true,
toggle: () => {},
};

export const MenuContext = React.createContext(initialState);

export const useMenu = () => {
return useContext(MenuContext)
};
React.createContext
const MyContext = React.createContext(defaultValue);

Creates a Context object. When React renders a component thatsubscribes to this Context object it will read the current contextvalue from the closest matching Provider above it in the tree.

The defaultValue argument is only used when a component does nothave a matching Provider above it in the tree. This default value canbe helpful for testing components in isolation without wrapping them.


解决方案
由于我怀疑您想要运行/提供多个菜单提供程序,我相信解决方案是移动 MenuProvider出包 App提供您正在通过嵌套组件更新的上下文。
应用程序.jsx
const { isMenuOpen } = useMenu();

...

<>
<Header mode={theme} modeFunc={toggleTheme}/>
{isMenuOpen ? (
<Menu />
) : (
<Switch>
<Route path='/writing' component={Writings} />
<Route path='/meta' component={Meta} />
<Route path='/contact' component={Contact} />
<Route path='/project' component={Project} />
<Route exact path='/' component={Home} />
<Route path='*' component={NotFound} />
</Switch>
)}
<Footer />
</>
index.jsx (?)
import App from './App.jsx';

...

//the provider
<MenuProvider>
<App />
</MenuProvider>

关于javascript - 状态不随 useContext 改变,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67171934/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com