防止缓存特定 RTK 查询端点

Prevent Caching on a specific RTK Query Endpoint

我正在使用 rtq 查询并且我有一个端点从全局存储中获取 azure-ad oid 并向后端查询以检查用户是否存在于后端以检查用户是否存在。如果用户存在,那么我将用户重定向到仪表板,否则我不重定向用户。

问题在于,尽管试图阻止该端点上的缓存,它仍然使用缓存的数据,并且当真正的数据来自服务器时,重定向已经发生。以下是我为防止这种情况发生而采取的一些步骤。

  1. 使用重新获取
  2. 设置 refetchOnMountOrArgChange: true,
  3. 设置 keepUnusedDataFor: 0.0001 几乎立即使缓存失效

关键是我不希望此端点使用任何缓存数据。

下面是我的组件:

 const [isSignedIn] = useIsSignedIn();
  const history = useHistory();
  const dispatch = useAppDispatch();
  const ongraphLogin = async (role: string) => {
    if (Providers.globalProvider.login) {
      dispatch(setloginType(role));

      await Providers.globalProvider.login();
    }
  };
  const userState = useAppSelector(state => state.userState);

 
  console.log(userState?.currentUser?.id);
  const { data, error, isLoading, refetch } = useGetUserByOidQuery(userState?.currentUser?.id, {
    skip: isSignedIn,
    refetchOnMountOrArgChange: true
  });
  
  useEffect(() => {
    refetch();
    // console.log(res);
    if (isSignedIn) {
      console.log('I am in');
      // Check if the user exists in the ndovysystem
      if (data?.status === 'success') {
        console.log(data);
        history.push('/user');
      } else if (userState.loginType === 'volunteerRegistration') {
        history.push('/register/volunteer');
      } else if (userState.loginType === 'menteeRegistration') {
        history.push('/register/mentee');
      }
    }
  }, [isSignedIn, data]);

下面是终点

import { ndovuAPI } from './ndovuAPI';

export const ndovuUserAPI = ndovuAPI.injectEndpoints({
  endpoints: builder => ({
    getUserByOid: builder.query({
      query: (oid: string) => `/users/oid/${oid}`,
      keepUnusedDataFor: 0.0001
    })
  })
});

// Export hooks for usage in functional components
export const { useGetUserByOidQuery} = ndovuUserAPI;

请帮我解决这个问题。

嗯。你不能真正阻止查询缓存,但你可以使它成为一个突变——默认情况下,即使两个具有相同参数的突变也永远不会共享一个缓存条目。

您可以将时间戳作为查询的参数传递。这就是我为防止在安装组件时缓存所做的。

像这样

const timestampRef = useRef(Date.now()).current;
const {data = [], isFetching} 
    = useGetChatMessagesQuery({id: chatId, lastMessageId, sessionId: timestampRef});