useQuery 不返回最新数据

useQuery not returning up to date data

为什么useQuery 不return 正确的数量,直到我做另一页 刷新?

供参考,如下:

const Home = props => {
  const {data, loading, error} = useQuery(GET_PRODUCTS_LOGGED_IN, {
    variables: {
      userid: props.userid
    }
  });
  
  console.log(
    'data', data.products // this data is outdated after I go from /home -> /profile -> /home
  );

  return (
    <Container>
      {_.map(data.products, product => (
        <VoteButton
          hasVoted={product.hasVoted}
          likes={product.likes}
          productid={product.productid}
        />
      ))}
    </Container>
  );
}
const VoteButton = ({likes, hasVoted, productid}) => {
  const [localHasVoted, updateLocalHasVoted] = useState(hasVoted);
  const [likesCount, updateLikesCount] = useState(likes);
  const [onVote] = useMutation(VOTE_PRODUCT);

  const onClickUpvote = (event) => {
    onVote({
      variables: {
        productid
      }
    })
    updateLocalHasVoted(!localHasVoted);
    updateLikesCount(localHasVoted ? likesCount - 1 : likesCount + 1);
  }
  
  return (
    <VoteContainer onClick={onClickUpvote}>
        <VoteCount >{likesCount}</VoteCount>
    </VoteContainer>
  );
};

在您的 useQuery 调用中,您实际上可以向它传递一个名为 'fetch-policy' 的配置选项,它告诉 Apollo 您希望查询在进行调用或使用缓存之间如何执行。您可以在此处找到更多信息,Apollo fetch policy options。 一个快速的解决方案是将 fetch-policy 设置为缓存和网络,如下例所示。

  const {data, loading, error} = useQuery(GET_PRODUCTS_LOGGED_IN, {
    variables: {
      userid: props.userid
    },
    fetchPolicy: 'cache-and-network',
  });

你也可以这样当你的突变发生时,它会再次运行你的查询,方法是在 useMutation 上设置 'refetch-queries' 选项,就像下面的代码一样。 这将导致您的查询在突变发生后立即触发。 您可以在此处阅读更多相关信息 Apollo mutation options

const [onVote] = useMutation(VOTE_PRODUCT, {
  refetchQueries: [ {query: GET_PRODUCTS_LOGGED_IN } ],
});