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

RTK-Query自动重获取功能失效问题求助

解决RTK-Query无法自动刷新关注用户新帖的问题

首先你搞反了providesTags和invalidatesTags的用法:invalidatesTags是给mutation用的,用来标记哪些标签对应的数据需要失效;而query需要用providesTags来声明自己提供了哪些标签的数据。你现在在query里写invalidatesTags完全起不到作用,先把这个错误修正:

第一步:修正API配置里的标签声明

修改FollowingUsersPostApi.js,把query的invalidatesTags换成providesTags:

// FollowingUsersPostApi.js
import { createApi, fetchBaseQuery } from '@reduxjs/toolkit/query/react';

export const followingUsersPostApi = createApi({
  reducerPath: 'followingUsersPostApi',
  baseQuery: fetchBaseQuery({ baseUrl: '/api' }),
  tagTypes: ['Post'],
  endpoints: (builder) => ({
    followingUsersPost: builder.query({
      query: () => `/followingUsersPost`,
      // 声明这个query提供Post标签的数据
      providesTags: ['Post'],
    }),
  }),
});

export const { useFollowingUsersPostQuery } = followingUsersPostApi;

第二步:解决无法感知外部更新的问题

因为你没办法控制关注用户发布新帖的mutation,没法通过调用自己的mutation来触发invalidatesTags,所以有几个可行方案:

方案1:开启轮询自动刷新

RTK-Query的useQuery钩子支持pollingInterval配置,可以定时自动重新请求数据。比如每30秒刷新一次:

// HomePage.jsx
import { useFollowingUsersPostQuery } from '../../Store/FollowingUsersPost';

const HomePage = () => {
  // 配置pollingInterval,单位毫秒
  const { data, isLoading, error, refetch } = useFollowingUsersPostQuery(
    undefined,
    { pollingInterval: 30000 }
  );

  return (
    <div>
      {/* 你的页面内容 */}
    </div>
  );
};

方案2:手动触发刷新

给页面加个刷新按钮,手动调用refetch函数获取最新数据:

// HomePage.jsx
import { useFollowingUsersPostQuery } from '../../Store/FollowingUsersPost';

const HomePage = () => {
  const { data, isLoading, error, refetch } = useFollowingUsersPostQuery();

  return (
    <div>
      <button onClick={() => refetch()}>刷新帖子</button>
      {/* 你的帖子列表渲染 */}
    </div>
  );
};

方案3:通过推送事件触发刷新(如果后端支持)

如果后端提供WebSocket或者Server-Sent Events(SSE)推送新帖通知,你可以在前端监听推送事件,手动触发标签失效,让RTK-Query自动重新获取数据:

// HomePage.jsx
import { useEffect } from 'react';
import { useDispatch } from 'react-redux';
import { useFollowingUsersPostQuery } from '../../Store/FollowingUsersPost';
import { followingUsersPostApi } from '../../Store/FollowingUsersPost';

const HomePage = () => {
  const dispatch = useDispatch();
  const { data, isLoading, error } = useFollowingUsersPostQuery();

  useEffect(() => {
    const socket = new WebSocket('ws://你的推送服务地址');
    socket.onmessage = (event) => {
      // 收到新帖推送时,触发Post标签失效
      dispatch(followingUsersPostApi.util.invalidateTags(['Post']));
    };

    return () => socket.close();
  }, [dispatch]);

  return (
    <div>
      {/* 你的页面内容 */}
    </div>
  );
};

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 13:10:24