【问题标题】:useQuery after server-side rendering服务端渲染后的 useQuery
【发布时间】:2020-01-06 21:38:48
【问题描述】:

我正在使用 next.js 和带有 react hooks 的 apollo。

对于一个页面,我在服务器端渲染前 X 个“帖子”,如下所示:

// pages/topic.js

const Page = ({ posts }) => <TopicPage posts={posts} />;

Page.getInitialProps = async (context) => {
    const { apolloClient } = context;
    const posts = await apolloClient.query(whatever);

    return { posts };
};

export default Page;

然后在组件中我要使用useQuery钩子:

// components/TopicPage.js

import { useQuery } from '@apollo/react-hooks';

export default ({ posts }) => {
    const { loading, error, data, fetchMore } = useQuery(whatever);

    // go on to render posts and/or data, and i have a button that does fetchMore
};

请注意,这里的useQuery 执行的查询与我在服务器端执行的查询基本相同,以获取该主题的帖子。

这里的问题是,在组件中,我已经有从服务器传入的第一批帖子,所以我实际上并不想再次获取第一批帖子,但我仍然想支持用户单击按钮以加载更多帖子的功能。

我考虑了在此处调用useQuery 的选项,以便它从带有查询的帖子的第二“页”开始,但我实际上并不想要这样。我希望主题页面在页面加载后立即完全加载我想要的帖子(即来自服务器的帖子)。

是否可以让useQuery 在这种情况下工作?或者我是否需要避开它来围绕手动查询调用 apollo 客户端(来自useApolloClient)的一些自定义逻辑?

【问题讨论】:

  • 您应该使用getDataFromTree 根据最初在您的应用程序中呈现的查询来初始化您的商店,如here 所示。 fetchMore 应该会按预期工作。

标签: javascript apollo next.js react-apollo apollo-client


【解决方案1】:

原来这只是我对使用 nextjs 进行服务器端渲染的一种误解。在将生成的 html 发送到客户端之前,它会完整呈现 React 树。因此,不需要在getInitialProps 中进行“第一次”useQuery 调用或任何类似的调用。它只能在组件中单独使用,只要在服务器端配置中正确使用getDataFromTree,一切都会正常工作。

【讨论】:

  • 我也想弄清楚这一点,我看到当我在使用useQuery 后控制台日志时,它会在服务器中控制台它正在加载/获取数据,但它不会等待它完成获取也不会再次控制台记录它获取的数据,而是客户端控制台记录它也在加载/获取,这让我认为它正在执行双重获取?
猜你喜欢
  • 2021-07-13
  • 1970-01-01
  • 1970-01-01
  • 2023-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-07
相关资源
最近更新 更多