React-Query入门者遇invalidateQueries失效:CRUD应用更新后数据未刷新
React-Query 备忘录更新后详情页数据不更新的解决办法
问题核心原因及修复步骤:
缓存键未关联ID,导致缓存匹配错误
详情页的useQuery缓存键使用["detail"],未包含备忘录ID,会让所有详情页共享同一缓存条目,失效操作无法精准定位目标缓存。同时你在详情页onSuccess中调用invalidateQueries(["detail"]),会触发当前查询重复请求,陷入无限循环。修复:将ID加入缓存键,并移除详情页
onSuccess中的失效逻辑:// detail.js const { isLoading, isError, data, error } = useQuery( ["detail", id], // 加入id作为缓存键的一部分,确保每个备忘录详情缓存独立 () => findOne(id), { select: (data) => data.data, onError: () => { console.error(`Error: ${error.message}`); }, } );Mutation参数传递错误,更新请求未正确携带ID
updateOne需要两个参数(updateContent, id),但useMutation的mutate函数仅接收一个参数,你当前mutations.mutate(updateContentObj, id)的调用方式,会把id当成配置参数而非updateOne的第二个入参,导致后端无法定位要更新的备忘录。修复:将参数包装为对象传递:
// UpdateList.js 调整mutation的参数接收逻辑 const mutations = useMutation(({ updateContent, id }) => updateOne(updateContent, id), { // ...其他配置 }); // 提交时的调用方式 mutations.mutate({ updateContent: updateContentObj, id });未在Mutation成功后触发缓存失效,且导航时机过早
当前未在更新请求完成后触发对应缓存的失效,且直接在mutate后立即跳转,可能更新请求还未完成,详情页就已加载旧缓存数据。修复:在mutation的
onSuccess中触发缓存失效,等待请求完成后再导航:// UpdateList.js const mutations = useMutation(({ updateContent, id }) => updateOne(updateContent, id), { onSuccess: (_, variables) => { // 精准失效对应ID的详情缓存 queryClient.invalidateQueries(["detail", variables.id]); }, }); // 提交按钮点击事件,等待mutation完成后再导航 const handleSubmit = async () => { await mutations.mutateAsync({ updateContent: updateContentObj, id }); navigate(`/detail/${id}`); };额外检查:API路径一致性
注意到findOne的请求路径是api.get(/${id}),而updateOne的路径是/api/content/${id},路径前缀不一致可能导致获取的不是正确的详情数据,请确认后端接口路径是否统一。
内容的提问来源于stack exchange,提问作者emillly
相关产品推荐
相关产品推荐

