reactjs - 无法从 useContext 访问对象值。使用 useReducer 和 useContext 进行状态管理
问题描述
我正在尝试从 useContext 访问我的调度函数以及我的状态。奇怪的是,当我尝试解构上下文对象(因此我可以直接访问它们)时,它告诉我它不存在(错误消息:属性'authDispatch' 在类型'{}'上不存在)。
解构方法:
const {authDispatch, authState, messageState, messageDispatch} = useContext(GlobalContext)
但是,当我在不解构的情况下 console.log 上下文时,我能够看到具有相应调度程序/状态的对象。但是,我无法在我的代码中使用点符号访问这些方法/状态。
无解构:
const context = useContext(GlobalContext)
控制台日志(上下文)
{authState: {…}, messageState: {…}, authDispatch: ƒ, messageDispatch: ƒ}
authDispatch: ƒ ()
authState: {token: null, isAuthenticated: false, loading: true, user: null}
messageDispatch: ƒ ()
messageState: {loadedMessage: {…}, loading: true}
[[Prototype]]: Object
这是我的 Provier.tsx 文件,其中创建了我的 GlobalContext 以及我的 GlobalProvider。GlobalPrivder 确实包装了整个应用程序。
提供者.tsx
interface IGlobalProvider {
children: React.ReactNode;
}
export const GlobalContext = createContext({});
export const GlobalProvider: React.FC<IGlobalProvider> = ({ children }) => {
const [authState, authDispatch] = useReducer(auth, authInitialState);
const [messageState, messageDispatch] = useReducer(
todaysMessage,
todaysMessageInitialState
);
return (
<GlobalContext.Provider
value={{
authState,
authDispatch,
messageState,
messageDispatch,
}}
>
{children}
</GlobalContext.Provider>
);
};
潜在有用的信息:
- 使用 NextJS
提前感谢您的时间。
解决方案
我只需要在创建上下文时初始化状态
interface ICreateContext {
authState: IAuthState | null,
messageState: ITodaysMessageState | null,
authDispatch: React.Dispatch<any>,
messageDispatch: React.Dispatch<any>
}
const initialState = {
authState: null,
messageState: null,
authDispatch: () => null,
messageDispatch: () => null
}
export const GlobalContext = createContext<ICreateContext>(initialState);
但我仍然很好奇为什么我能够 console.log 上下文但没有初始化就不能访问它们。它与渲染周期有关吗?
推荐阅读
- ios - 关闭通过 Plaid SDK 打开的 UINavigationController
- php - 显示每月第一个工作日的 WordPress 函数和简码
- excel - 按 ID 合并两个 excel 的行(VB.NET)
- azure-ad-b2c - 无法使用“联合帐户”IssuerAssignedId 作为登录名/电子邮件登录 AZURE AD
- c - 如何跟踪用户输入的输入量?C程序
- c# - 从字符串中删除非 ASCII 字符
- postman - 如果在验证之前声明了 Object.prototype 函数,则 Postman JSON 模式验证失败
- microsoft-graph-api - Microsoft Graph API - 嵌入日历
- c# - SignerInfo.CheckSignature 抛出异常“参数不正确”
- firebase - Firebase 动态链接:无法使用 Google 提供的主机名