You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React Query invalidateQuery失效:乐观更新生效但未重获数据

React Query 删除操作后未触发数据重新获取的问题修复

核心问题

你的代码中onSettled里调用queryClient.invalidateQueries("products")时,传入的是字符串形式的queryKey,但实际查询的key是数组类型["products"],React Query无法匹配到对应的查询,因此不会触发重新拉取。

修复方案

将invalidateQueries的参数改为数组形式的queryKey,与查询定义保持一致:

// useDeleteProductsHook.js 中的 onSettled 方法修改
onSettled: () => {
    // 改为数组形式的 queryKey
    queryClient.invalidateQueries(["products"]);
    console.log("invalidation");
},

额外检查点

  • 确认enabled状态:Home.jsx中useQuery的enabled: isSeeded,需确保删除操作完成后isSeeded仍为true。如果isSeeded变为false,即使查询被标记为失效,也不会重新执行。
  • 验证查询缓存状态:可在onSettled中添加日志查看查询状态,确认是否匹配:
    onSettled: () => {
        const query = queryClient.getQueryState(["products"]);
        console.log("Query state after invalidation:", query);
        queryClient.invalidateQueries(["products"]);
        console.log("invalidation");
    },
    
  • 检查staleTime配置:虽然你设置了staleTime: 0确保数据失效后立即重新拉取,但如果queryKey不匹配,该配置也无法生效。

修复后的完整useDeleteProduct代码

import { useMutation, useQueryClient } from "@tanstack/react-query";
import { deleteProductService } from "../services/productServices";
import toast from "react-hot-toast";

export function useDeleteProduct() {
    const queryClient = useQueryClient();

    const { isLoading: isDeleting, mutate: deleteProduct } = useMutation({
        mutationFn: deleteProductService,

        onMutate: async (productId) => {
            await queryClient.cancelQueries(["products"]);
            const previousProducts = queryClient.getQueryData(["products"]);

            queryClient.setQueryData(["products"], (oldProducts) => {
                const updatedProducts = oldProducts.filter(
                    (product) => product._id !== productId,
                );
                return [...updatedProducts];
            });
            return { previousProducts };
        },

        onError: (err, productId, context) => {
            queryClient.setQueryData(["products"], context.previousProducts);
            toast.error(err.message);
        },

        onSettled: () => {
            // 修复:使用数组形式的 queryKey
            queryClient.invalidateQueries(["products"]);
            console.log("invalidation");
        },

        onSuccess: () => {
            toast.success("Product deleted successfully");
        },
    });

    return { isDeleting, deleteProduct };
}

内容的提问来源于stack exchange,提问作者Georgios

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 17:52:20