使用 Apollo React 钩子重新获取查询

Refetching queris with Apollo React hooks

我正在试用新的 Apollo React Hooks,并设置了一个小型商业示例。

function App() {
    const [cartId, setCartId] = useState('V1bvif5UxQThb84iukrxHx9dYQg9nr8j');

    const [removeItem, {loading: mutationLoading}] = useMutation(REMOVE_ITEM, {
        refetchQueries: [{query: CART_DETAILS, variables: {cartId}}]
    });
    const [addToCart] = useMutation(ADD_TO_CART, {
        refetchQueries: [{query: CART_DETAILS, variables: {cartId}}]
    });

    const {data, loading, error} = useQuery(CART_DETAILS, {
        variables: {cartId}
    });

    if (data && data.items) {
        console.log(`We have data`, data);
    }

    const handleRemove = itemId => {
        console.log(`Removing item with id ${itemId}`);
        removeItem({
            variables: {cartId, itemId}
        });
    };
    if (error) {
        console.log(`Some error happened`, error);
        return <h2>ERROR!</h2>;
    }
    if (loading) {
        return <p>Loading...</p>;
    }

    return ( ... some HTML skipped for brevity )

一切都按预期工作,removing/adding 一个项目正确地刷新了项目列表,但是在执行任何突变之后,查询的 loading 状态永远不会为真(结果是我不在 UI).

中看不到 Loading... 消息

loadingerror 变量不是应该在重新获取查询时更新吗?

refetchQueries 不会导致监视查询的 loading 属性 发生变化——它只是异步解析列出的查询并用结果更新缓存。

useMutation 还公开了一个 loading 属性。我相信您可以通过将 awaitRefetchQueries 设置为 true 来实现您正在寻找的效果。

const [removeItem, {loading: removeLoading}] = useMutation(REMOVE_ITEM, {
  refetchQueries: [{query: CART_DETAILS, variables: {cartId}}],
  awaitRefetchQueries: true,
});
const [addToCart, {loading: addLoading}] = useMutation(ADD_TO_CART, {
  refetchQueries: [{query: CART_DETAILS, variables: {cartId}}],
  awaitRefetchQueries: true,
});
const loading = queryLoading || addLoading || removeLoading

另一种方法是直接调用查询的 refetch 方法。