React 应用程序上的 Apollo Client 缓存问题

Issue with Apollo Client cache on a react app

我在获取端点时遇到了一个问题,该端点基于类别 returns 文章列表。

我已经设置了一个带有 apollo 客户端的 React 应用程序来包装所有内容 (index.tsx):

const client = new ApolloClient({
  uri: myurl,
  cache: new InMemoryCache(),
});

ReactDOM.render(
  <ThemeProvider theme={theme}>
    <ApolloProvider client={client}>
      <Router>
        <App />
      </Router>
    </ApolloProvider>
  </ThemeProvider>,

  document.getElementById("root")
);

然后我在菜单中有一个 <Link to={news/${cat}} /> 列表,当我单击菜单时它会正确导航到 news/1234

从页面中,我获得了我需要的类别,然后将其用作我的 graphql 查询的变量。

因为我有客户端包装整个应用程序,所以我使用 ApolloConsumer 像这样传递客户端:

const CategoryArticlesList = ({ location, match }: RouteChildrenProps) => {
  return (
    <ApolloConsumer>
      {(client) => {
        return (
          <ListAllArticles location={location} match={match} client={client} />
        );
      }}
    </ApolloConsumer>
  );
};

然后,从 <ListAllArticles> 组件,我有这段简化的代码:

const getNewsBycategory = gql`
  query($page: Int, $cid: String) {
    News(page: $page, categoryId: $cid) {
      results {
        category
        category_id
        title
        date
        body_preview
        is_published
        thumbnail_s
        id
      }
      extra {
        pagination {
          total_items
          limit
        }
      }
    }
  }
`;


const pageToFetch = "1"
const categoryId = match.params.categoryId || "1234";

  const variables = React.useMemo(
    () => ({
      page: pageToFetch,
      categoryId: categoryId,
    }),
    [categoryId, pageToFetch]
  );

  const { data, loading, error } = useQuery(getNewsBycategory, {
    variables: { ...variables },
  });

当我更改页面时,URL 中的类别发生变化,使用新的和更新的 categoryID 变量执行查询(我检查了网络选项卡)但结果与以前相同。

我认为这是一个缓存问题,所以我尝试将 "no-cache""network-only" 都更改为 fetchPolicy,但我遇到了同样的问题。

你能告诉我为什么会这样吗?我该如何克服这个问题?

非常感谢任何 help/advice

最终,我找到了问题。

我是这样调用我的查询的:

export const query = gql`
  query($page: Int, $cid: String) {
    News(page: $page, categoryId: $cid) {
      results {
        category
        category_id
        title
        date
        body_preview
        is_published
        thumbnail_s
        id
      }
    }
  }
`;

如您所见,我向 categoryId 传递了一个变量 $cid(服务器上的查询需要使用此名称)。 我以为我可以为该变量使用我想要的名称,但事实证明,将变量用作 $cid 而不是 $categoryId 并没有在查询中发送变量。

将我的查询更改为如下所示:

export const getNewsBycategory = gql`
  query($page: Int, $categoryId: String) {
    News(page: $page, categoryId: $categoryId) {
      results {
        category
        category_id
        title
        date
        body_preview
        is_published
        thumbnail_s
        id
      }
    }
  }
`;

解决了问题。

直到现在我才知道这个变量命名的事情,奇怪的是从网络上我可以看到变量被发送出去,但只有调试服务器我才设法弄清楚它并没有真正被发送最后出来