如何创建 HOC 以在 React 中包装 useContext 提供程序?
How to create HOC to wrap useContext provider in React?
我想使用 HOC(“高阶组件”)在我的应用程序的不同部分重用上下文提供程序,但我的状态没有得到更新。
这是提供程序的包装器。
import React, { FC, useState } from "react";
import AdminContext from "./adminContext";
const AdminContextWrapper: FC = ({ children }) => {
const [authAdmin, setAuthAdmin] = useState<boolean | null>(null);
const value = { authAdmin, setAuthAdmin };
return (
<AdminContext.Provider value={value}>{children}</AdminContext.Provider>
);
};
export default AdminContextWrapper;
这就是我的实现方式:
import { useContext } from "react";
import AdminContext from "@comp/contexts/adminContext";
import AdminLogin from "@comp/admin/adminLogin";
import Limit from "@comp/admin/limits";
import AdminContextWrapper from "@comp/contexts/adminWrapper";
const Admin = () => {
const { authAdmin } = useContext(AdminContext);
const AdminPage = () => {
return (
<div>
<Limit />
</div>
);
};
return (
<AdminContextWrapper>
{authAdmin ? <AdminPage /> : <AdminLogin />}
</AdminContextWrapper>
);
最后,这是我的背景:
import { createContext } from "react";
import { AdminContextType } from "@comp/utils/types";
const InitialUserContext: AdminContextType = {
authAdmin: false,
setAuthAdmin: (authAdmin: boolean | null) => {},
};
const AdminContext = createContext<AdminContextType>(InitialUserContext);
export default AdminContext;
我可以在登录页面看到状态变化,但管理页面没有更新。
adminLogin.tsx
//...
const { setAuthAdmin, authAdmin } = useContext(AdminContext);
useEffect(() => {
console.log(authAdmin); // returns true after validating but the admin does not update.
}, [authAdmin]);
//...
非常感谢任何帮助。谢谢。
除非我误读了东西,在
const Admin = () => {
const { authAdmin } = useContext(AdminContext);
// ...
return (
<AdminContextWrapper>
{authAdmin ? <AdminPage /> : <AdminLogin />}
</AdminContextWrapper>
);
}
您正在尝试在其提供者 AdminContextWrapper 之外使用上下文 - useContext
会 return undefined
除非 您已经嵌套在管理上下文的另一个提供程序中,在这种情况下,内部 AdminContextWrapper
将为内部组件提供不同的管理上下文。
您可能想确保只有一个管理上下文。
(顺便说一句,上面的 // ...
曾经是您原始代码中的嵌套组件。千万不要这样做——嵌套组件的身份在每次更新时都会发生变化,从而导致虚假的 re-renders。)
我想使用 HOC(“高阶组件”)在我的应用程序的不同部分重用上下文提供程序,但我的状态没有得到更新。
这是提供程序的包装器。
import React, { FC, useState } from "react";
import AdminContext from "./adminContext";
const AdminContextWrapper: FC = ({ children }) => {
const [authAdmin, setAuthAdmin] = useState<boolean | null>(null);
const value = { authAdmin, setAuthAdmin };
return (
<AdminContext.Provider value={value}>{children}</AdminContext.Provider>
);
};
export default AdminContextWrapper;
这就是我的实现方式:
import { useContext } from "react";
import AdminContext from "@comp/contexts/adminContext";
import AdminLogin from "@comp/admin/adminLogin";
import Limit from "@comp/admin/limits";
import AdminContextWrapper from "@comp/contexts/adminWrapper";
const Admin = () => {
const { authAdmin } = useContext(AdminContext);
const AdminPage = () => {
return (
<div>
<Limit />
</div>
);
};
return (
<AdminContextWrapper>
{authAdmin ? <AdminPage /> : <AdminLogin />}
</AdminContextWrapper>
);
最后,这是我的背景:
import { createContext } from "react";
import { AdminContextType } from "@comp/utils/types";
const InitialUserContext: AdminContextType = {
authAdmin: false,
setAuthAdmin: (authAdmin: boolean | null) => {},
};
const AdminContext = createContext<AdminContextType>(InitialUserContext);
export default AdminContext;
我可以在登录页面看到状态变化,但管理页面没有更新。
adminLogin.tsx
//...
const { setAuthAdmin, authAdmin } = useContext(AdminContext);
useEffect(() => {
console.log(authAdmin); // returns true after validating but the admin does not update.
}, [authAdmin]);
//...
非常感谢任何帮助。谢谢。
除非我误读了东西,在
const Admin = () => {
const { authAdmin } = useContext(AdminContext);
// ...
return (
<AdminContextWrapper>
{authAdmin ? <AdminPage /> : <AdminLogin />}
</AdminContextWrapper>
);
}
您正在尝试在其提供者 AdminContextWrapper 之外使用上下文 - useContext
会 return undefined
除非 您已经嵌套在管理上下文的另一个提供程序中,在这种情况下,内部 AdminContextWrapper
将为内部组件提供不同的管理上下文。
您可能想确保只有一个管理上下文。
(顺便说一句,上面的 // ...
曾经是您原始代码中的嵌套组件。千万不要这样做——嵌套组件的身份在每次更新时都会发生变化,从而导致虚假的 re-renders。)