我有一个服务器渲染的 next.js 应用程序,它是一个 3 页的结帐流程。在第一页上,我正在获取各种设置数据,例如标签翻译和里面的购物篮项目getServerSideProps,如下所示:
用户详细信息.js
import React from 'react';
import { LabelsContext } from "../contexts";
import { Component1, Component2 } from '../components'
const UserDetails = () => {
const labels = useContext(LabelsContext);
return (
<div>
<Component1 labels={labels} />
<Component2 labels={labels} />
</div>
)
}
export const getServerSideProps = async (context) => {
const {
locale,
basketId,
} = context.res.locals;
const { cookie } = context.req.headers;
const graphQLClient = new GraphQLClient(
GRAPHQL_ENDPOINT,
{
headers: {
'Content-Language': locale,
'X-Basket': basketId,
cookie,
},
},
);
const { labels } = await graphQLClient.request(getLabels);
return {
labels,
locale,
};
};
export default UserDetails;
然后将此数据从 中传递pageProps到本地状态_app.js,然后从那里传递到上下文提供者:
_app.js
import React from 'react';
import { useApollo } from '@apollo/client';
const App = ({ Component, pageProps }) => {
const [labels, setLabels] = useState(pageProps.labels);
const apolloClient = useApollo(pageProps.initialApolloState);
return (
<ApolloProvider client={apolloClient}>
<LabelsContext.Provider value={labels}>
<Component {...pageProps} />
</LabelsContext.Provider>
</ApolloProvider>
);
};
这在初始渲染中运行良好,因为提取成功并且数据设置为_app.js状态意味着它们可用于流中的后续页面。但我的问题是,当用户从第 2 页单击浏览器后退按钮回到 UserDetails 页面时,它会再次执行完整页面重新加载以重新获取数据。重新获取数据不是什么大问题,但是当页面重新加载时,表单中输入的所有数据都会丢失。此外,当所有其他页面转换都是快速的客户端加载时,用户体验有点不和谐。
一旦页面已经加载一次,有没有办法防止在这种情况下重新加载整个页面?
谢谢大家。