React Redux RTK中invalidateTags触发过早问题咨询
解决Redux mutation缓存失效时机问题
你遇到的核心问题是缓存失效触发过早,其实根本不需要用setTimeout这种临时方案——RTK Query本身就提供了可靠的时机控制机制。
问题根源
你当前代码里同时用了invalidatesTags配置和onQueryStarted里的手动失效逻辑,还额外加了3秒延时,这完全没必要。invalidatesTags的设计就是在mutation请求成功(后端返回响应)之后才会自动触发缓存失效,之所以你觉得失效在后端更新前,大概率是查询PendingOrder/PendingOrders时的providesTags配置不匹配,或是误解了失效的触发时机。
正确解决方案
直接移除onQueryStarted里的手动失效和延时逻辑,只保留invalidatesTags即可,RTK Query会自动在PATCH请求成功后执行缓存失效:
updateItemQuantity: builder.mutation<Cart.UpdateItemQuantityFunction.ReturnType, Cart.UpdateItemQuantityProps>({ query: ({ functionParameters: { csrfToken }, inputParameters: { pendingOrderItemNumber, pendingOrderNumber, newQuantity } }) => ({ url: `${path}PendingOrderItems(pendingOrderNumber='${pendingOrderNumber}',itemNumber='${pendingOrderItemNumber}')`, method: "PATCH", body: JSON.stringify({ orderQuantity: newQuantity.toString() }), credentials: "same-origin", headers: headers({ csrfToken }) }), // 仅保留自动失效配置 invalidatesTags: (_result, _error, props) => [ "PendingOrders", { type: "PendingOrder", id: props.inputParameters.pendingOrderNumber } ] }),
额外检查点
如果还是出现缓存更新不及时的情况,去核对查询PendingOrder和PendingOrders的代码,确保它们的providesTags和这里的invalidatesTags完全匹配:
- 查询单个PendingOrder的配置里,
providesTags应返回[{ type: "PendingOrder", id: pendingOrderNumber }] - 查询PendingOrders列表的配置里,
providesTags应返回["PendingOrders"]
只有标签完全匹配,RTK Query才能准确找到对应缓存并失效刷新。
内容的提问来源于stack exchange,提问作者Adam Harkus
相关产品推荐
相关产品推荐

