如何更改功能组件中的上下文值?
How to change context value in functional component?
我有一个名为 StatusContext
的上下文,如下所示:
export const statusCtxInit = {
open: false,
toggleOpen() {
this.open = !this.open;
}
};
const StatusContext = React.createContext(statusCtxInit);
export default StatusContext
整个应用程序正在使用提供程序包装:
// ...
<StatusContext.Provider value={statusCtxInit}>
// ...
为了使用我的上下文的值,我在我的 FC 中使用了 useContext
,当我得到值时它就起作用了。
function MyComp() {
const status = useContext(StatusContext);
return (
<div>
{status.open
? `It's Open`
: `It's Closed`}
<button onClick={() => status.toggleOpen()}>
Toggle
</button>
</div>
)
}
export default MyComp
另一方面,我也想通过调用 toggleOpen
来更改上下文,但是,它无法正常工作。实际上该值发生变化但不影响 MyComp
.
我做错了什么?我该怎么办?
const statusContext = React.createContext()
const {Provider} = statusContext
//custom provider
export const StatusProvider = ({children}) => {
const [isOpen, setOpen] = React.useState(false)
const toggle = () => setOpen(v => !v)
return (
<Provider value={{isOpen, toggle}}>
{children}
</Provider>
)
}
//custom hook
export const useStatus = () => useContext(StatusContext)
//usage
function MyComp() {
const status = useStatus()
return (
<div>
{status.isOpen
? `It's Open`
: `It's Closed`}
<button onClick={() => status.toggle()}>
Toggle
</button>
</div>
)
}
export default MyComp
我有一个名为 StatusContext
的上下文,如下所示:
export const statusCtxInit = {
open: false,
toggleOpen() {
this.open = !this.open;
}
};
const StatusContext = React.createContext(statusCtxInit);
export default StatusContext
整个应用程序正在使用提供程序包装:
// ...
<StatusContext.Provider value={statusCtxInit}>
// ...
为了使用我的上下文的值,我在我的 FC 中使用了 useContext
,当我得到值时它就起作用了。
function MyComp() {
const status = useContext(StatusContext);
return (
<div>
{status.open
? `It's Open`
: `It's Closed`}
<button onClick={() => status.toggleOpen()}>
Toggle
</button>
</div>
)
}
export default MyComp
另一方面,我也想通过调用 toggleOpen
来更改上下文,但是,它无法正常工作。实际上该值发生变化但不影响 MyComp
.
我做错了什么?我该怎么办?
const statusContext = React.createContext()
const {Provider} = statusContext
//custom provider
export const StatusProvider = ({children}) => {
const [isOpen, setOpen] = React.useState(false)
const toggle = () => setOpen(v => !v)
return (
<Provider value={{isOpen, toggle}}>
{children}
</Provider>
)
}
//custom hook
export const useStatus = () => useContext(StatusContext)
//usage
function MyComp() {
const status = useStatus()
return (
<div>
{status.isOpen
? `It's Open`
: `It's Closed`}
<button onClick={() => status.toggle()}>
Toggle
</button>
</div>
)
}
export default MyComp