reactjs - 如何修复 setState 在反应上下文中不更新
问题描述
我遇到了一个问题,当我尝试通过反应钩子更新它时,我的上下文没有得到更新。我在下面发布了代码,感觉我可能遗漏了一点点。
appContext.tsx
import React, { useState } from "react"
import { ICreateContext } from "../types/generics"
export interface IAppProviderState {
isNightMode: boolean
}
const defaults = { isNightMode: false }
const AppContext = React.createContext<ICreateContext<IAppProviderState>>([
defaults,
() => null,
])
const AppProvider = (props: { children?: JSX.Element }) => {
const [state, setState] = useState<IAppProviderState>({
isNightMode: defaults.isNightMode,
})
return (
<AppContext.Provider value={[state, setState]}>
{props.children}
</AppContext.Provider>
)
}
export { AppContext, AppProvider }
应用商店.tsx
import { useContext } from "react"
import { AppContext, IAppProviderState } from "../contexts/appContext"
function useAppStore() {
const [state, setState] = useContext(AppContext)
function toggleNightMode(bool: boolean) {
setState({
isNightMode: bool,
})
}
return {
toggleNightMode,
state,
}
}
export { useAppStore }
// somewhere in the view I use the useAppStore hook.
// but using the method toggleNightMode, even though fires off on
// appStore.tsx - is not updating the root context state.
const { state, toggleNightMode } = useAppStore()
//..e.g
toggleNightMode(true);
我已经删除了上下文并检查了钩子是否适用于本地状态并且它确实更新了,遗憾的是这不是我想要的结果。
任何帮助将非常感激。
谢谢。
解决方案
不确定这是否会有所帮助,但我已经创建了一个你正在尝试做的事情的版本(不是在 Typescript 中抱歉),它只是通过单击按钮将 isNightMode 的值从 true 切换为 false 。
我已将 Context 和 Provider 代码移动到单独的文件中,但这正是我更喜欢我的代码的方式。
推荐阅读
- macos - 尝试在 Mac OS Catalina 上为 OpenCV for Python 3.6.5 安装 virtualenv 时出错
- azure - 密码重置流程 Azure AD B2C
- reactjs - 如何使用 Promise 创建受保护的路由
- python - 内核不断死亡 Jupyter,Anaconda。尝试使用神经核函数实现共指解析
- c# - web api 项目的默认路由
- plotly-dash - 在破折号的下拉菜单中更改文本输入的字体颜色
- bluetooth - 蓝牙查找设备
- angular - 尝试在角度中使用 x-www-form-urlencoded 的 post 方法时收到错误消息 400(错误请求)
- python - 如果我为每个脚本运行相同的解释器,为什么我的 python 脚本只能在 Jupyter Notebook 中运行,而不在 VS Code 中运行?
- angular - 如何部署“适用于 COVID-19 的 Verily Pathfinder 虚拟代理模板”