javascript - 通过 next.js 中的 routechange 持久化一些数据
问题描述
所以基本上我们在我们的自定义pages/_app.jsx
中有一个初始获取,它首先获取页眉/页脚的站点设置和导航。我希望只获取一次此数据,但是它会在每个 routechange 客户端获取。无论如何,在应用程序容器中的初始提取之后是否保留一些数据?
这是我的代码:
import React from 'react'
import App, { Container } from 'next/app'
import Header from '../components/Header';
import Footer from '../components/Footer';
class MyApp extends App {
static async getInitialProps({ Component, router, ctx }) {
let pageProps = {}
const res = await fetch(`http://localhost:3000/navigation`)
const nav = await res.json();
const ss = await fetch(`http://localhost:3000/site-settings`);
const settings = await ss.json();
var culture = "en-us";
var root = {};
if (Component.getInitialProps) {
pageProps = await Component.getInitialProps(ctx)
if (pageProps && pageProps.pageContext) {
culture = pageProps.pageContext.culture || "en-us";
root = nav.message.find(nav => !nav.parentPage && nav.culture === culture);
}
}
return {
pageProps,
navigation: nav.message,
settings,
culture,
root
}
}
问题是我的 getInitialProps_app.jsx
正在每条路由上运行,发出不必要的请求来获取客户端已经拥有的数据。
解决方案
这里有三个不同的问题:首先,执行 fetch in_app
将保证每个页面的执行,因为它用于初始化每个页面。那不是你想要的。相反,这应该发生在适当的页面中。
其次,这不应该发生,getInitialProps
因为这会延迟页面的加载。如果这是有意的,请继续执行此操作 - 但最好尽快渲染页面并稍后填补空白,而不是显示空白屏幕。
第三,也是最重要的,你需要加载你需要的信息,并在某种应用程序状态下对它进行管理,这种状态在所有页面之间共享。这可以在redux
React Context 或您自己的用于存储接收到的信息的解决方案中完成,如果其他解决方案感觉对您的项目来说太过分了。这样你就可以在获取之前检查你是否拥有它,并且只获取一次。
推荐阅读
- unix - Unix将grep命令重定向到文件
- c# - 本地源不存在 从 packages.config 迁移到 PackageReference
- python - 如何解决 UnicodeDecodeError: 'utf-8' codec can't decode byte 0xa1 in position 3: invalid start byte?
- twilio - Twilio 工作室,初始短信
- python - 如何将 HTML 类添加到内置的“用户”表单?
- python - Python 继承和关键字参数
- python - 从python并行执行bash任务,提取csv列
- javascript - 使用反应从页面导入数据
- python - 当我调用 python API 时来自 EC2 实例的 HTTP 超时
- ansible - 如何在 ansible 任务中通过秘密工具将新记录存储在 gnome 密钥环中,或者如何在 ansible shell 任务中通过管道传输标准输入?