使用 RTK 查询获取组件树中的数据

Get data in component tree using RTK Query

我想我误解了RTK查询的目的。

基本上我有一个应用程序,我需要在其中使用电子邮件和密码登录,此请求 returns 我的用户 ID。那是我的 API 文件

export const accountApi = createApi({
reducerPath: 'accountApi',
baseQuery: fetchBaseQuery({ baseUrl: location.origin }),
endpoints: (builder) => {
        getUserId: builder.query({
            query: ({ emailValue, passwordValue }) => ({
                            url: `/users`,
                            headers: {
                              'authentication-failure-code': 403,
                              'Authorization': `Basic btoa(`${(emailValue)}:${(passwordValue)}`)`,
                            }
                            responseHandler: (response) => response.text(),
            })
            transformResponse: (response) => applyDataCallback(response),
        }),
    }
},

在我的登录页面上,此请求 returns 我的用户 ID,我需要在我的应用程序中的所有未来请求中逐字使用它。但是,如果我显然没有电子邮件和密码,我如何在登录后在另一个组件中获取此 ID?

export default function MainApp() {
const { data: userId } = useGetUserIdQuery();

useGetUserIdQuery 需要登录和密码等参数,当然这样的代码会导致错误。

useSelector 在这里也不起作用,因为它只提供未规范化的缓存。

我是不是漏掉了一些基础知识?或者我应该只使用简单的 RTK 来保存我的 ID?

看起来您混淆了 API 层和存储。 RTK-Q 为您带来了一个包含缓存和其他 API-related 功能的包装层,使所有 data-fetching 获取生命周期在整个应用程序中更加轻松和一致。

您在寻找什么 - 是一个数据 storage-related 问题。它可以用任何现有的方法处理,如 Redux、Context、Localstorage 等。

我会说这里最适合您的解决方案 - 只需在登录后将 userId 放入 localStorage\cookies 一次,然后 - 在以后的所有请求中读取它。

为了帮助您解决这个问题 - 您可以定义一个自定义查询函数:

export const customBaseQuery: BaseQueryFn<string | FetchArgs, unknown, FetchBaseQueryError> 
  = async (args, api, extraOptions = {}) => {
  const userId = localStorage.getItem('userId')
  // Do what you want with userId, and pass it to the request

  const result = await fetchBaseQuery(args, api, extraOptions);

  // Optionally - can handle the response in some way
  return result;
};

之后你可以将它应用到你的 api 定义中,而不是 fetchBaseQuery:

baseQuery: customBaseQuery({ baseUrl: location.origin }),