Next.js context provider wrapping App component with page specific layout component giving undefined data(Next.js上下文提供程序包装带有页面特定布局组件的App组件,该组件提供未定义的数据)
问题描述
我有一个auth上下文组件,我在其中包装了我的主应用程序组件,但同时我也尝试按照Next.js文档在这里进行页面特定的布局组件:https://nextjs.org/docs/basic-features/layouts#per-page-layouts
我这样做是否正确,因为我似乎无法从上下文提供程序获取数据。
/context/AuthContext.js
const UserContext = createContext({});
export default function AuthContext({children}) {
// .. code
return (
<UserContext.Provider value={{ user, setUser }}>
{children}
</UserContext.Provider>
);
}
export const useUser = () => useContext(UserContext);
/_app.js
function MyApp({ Component, pageProps }) {
const getLayout = Component.getLayout || ((page) => page);
return getLayout(
<div>
<AuthContext>
<Component {...pageProps} />
</AuthContext>
</div>
);
}
export default MyApp;
/components/Project/List.js
import { useUser } from "../../context/AuthContext";
const ProjectList = () => {
const { user } = useUser();
console.log("get user data", user);
return (
<>
test
</>
);
};
export default ProjectList;
我试图通过控制台登录该用户,但它给我提供了未定义的信息。我想是因为它被包装成布局组件的方式吧?我可能做错了。但是我确实在AuthContext
中为用户登录了控制台,那里的信息是正确的。
/pages/projects/index.js
const Projects = () => {
// code goes here
return (
<div>
code goes here
</div>
)
}
export default Projects;
Projects.getLayout = function getLayout(page) {
return <ProjectLayout>{page}</ProjectLayout>;
};
当我删除Projects.getLayout
挡路代码时,数据会返回,但当我添加此代码时,数据会消失。
/components/Project/Layout.js
const ProjectLayout = ({children}) => {
return (
<>
<ProjectList />
{children}
</>
}
export default ProjectLayout
您当前结构ProjectLayout
的推荐答案
没有被AuthContext
包装,这意味着您将无法访问其上下文。
您可以修改_app
的结构并移动getLayout
调用,以便上下文正确包装它。
function MyApp({ Component, pageProps }) {
const getLayout = Component.getLayout || ((page) => page);
return (
<AuthContext>
{getLayout(<Component {...pageProps} />)}
</AuthContext>
);
}
这篇关于Next.js上下文提供程序包装带有页面特定布局组件的App组件,该组件提供未定义的数据的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:Next.js上下文提供程序包装带有页面特定布局组件的App组件,该组件提供未定义的数据
基础教程推荐
- 响应更改 div 大小保持纵横比 2022-01-01
- 动态更新多个选择框 2022-01-01
- 我什么时候应该在导入时使用方括号 2022-01-01
- 悬停时滑动输入并停留几秒钟 2022-01-01
- 在 JS 中获取客户端时区(不是 GMT 偏移量) 2022-01-01
- 在for循环中使用setTimeout 2022-01-01
- Karma-Jasmine:如何正确监视 Modal? 2022-01-01
- 当用户滚动离开时如何暂停 youtube 嵌入 2022-01-01
- 角度Apollo设置WatchQuery结果为可用变量 2022-01-01
- 有没有办法使用OpenLayers更改OpenStreetMap中某些要素 2022-09-06