next.js - Next JS 获取一次数据以显示在所有页面上
问题描述
这个页面是我能找到的最相关的信息,但这还不够。
我有一个通用组件,它为我的网站显示一个应用栏。此应用栏显示来自我存储在用户会话中的单独 API 的用户头像。我的问题是,每当我通过next/link
头像更改页面时都会消失,除非我getServerSideProps
在应用程序的每个页面上都实现以访问似乎很浪费的会话。
我发现我可以像这样实施getInitialProps
来_app.js
收集信息
MyApp.getInitialProps = async ({ Component, ctx }) => {
await applySession(ctx.req, ctx.res);
if(!ctx.req.session.hasOwnProperty('user')) {
return {
user: {
avatar: null,
username: null
}
}
}
let pageProps = {}
if (Component.getInitialProps) {
pageProps = await Component.getInitialProps(ctx);
}
return {
user: {
avatar: `https://cdn.discordapp.com/avatars/${ctx.req.session.user.id}/${ctx.req.session.user.avatar}`,
username: ctx.req.session.user.username
},
pageProps
}
}
我认为正在发生的事情是这被称为页面更改时的客户端,其中当然不存在会话,这导致没有任何内容发送到道具并且不显示头像。我想也许我可以用本地存储来解决这个问题,如果我可以区分何时在服务器或客户端调用它,但我想知道是否有更优雅的解决方案。
解决方案
我设法通过在我中创建一个状态_app.js
然后将状态设置为useEffect
这样来解决这个问题
function MyApp({ Component, pageProps, user }) {
const [userInfo, setUserInfo] = React.useState({});
React.useEffect(() => {
if(user.avatar) {
setUserInfo(user);
}
});
return (
<ThemeProvider theme={theme}>
<CssBaseline />
<NavDrawer user={userInfo} />
<Component {...pageProps} />
</ThemeProvider>
);
}
现在用户变量只设置一次,它也会在页面更改时发送到我的 NavDrawer 栏。
推荐阅读
- c++ - 制作一组向量对
- azure - 如何使用 Open Id Connect 在 .net core 2.2 api 中使用令牌验证请求
- reactjs - 类型错误:images.map 不是函数
- java - 未定义类型 SecurityConfiguration 的方法 withDefaults()
- android-studio - Flutter show download failed with java.lang.IllegalArgumentException after download 100%
- mysql - LIMIT 从带有 JOIN 的 SELECT 语句返回不正确的结果(在 mySQL 中)
- javascript - 将多维数组插入多维数组 - Javascript
- windows - 运行 PostgreSQL 的 psql 命令时出错
- c++ - 如何在某个地址创建对数组的引用?
- python - 无法通过 Python ncclient 访问 Yang 功能