6

我昨天刚开始使用 redux,在阅读了不同的库之后,我决定使用 RTK 的切片路由。

对于我的异步,我决定使用 RTK 查询,而不是使用 createAsyncThunk,我对从另一个切片访问状态的正确方法有疑问。

slice1 包含一些用户数据,例如:

export const initialState: IUserState = {
   name: 'example',
   id: null,
};

在我的 slice2 中,我有一个函数想要执行getSomethingByUserId(id)和我当前的实现之类的操作:

interface IApiResponse {
  success: true;
  result: IGotSomethingData[];
}

const getsomethingSlice: any = createApi({
  reducerPath: 'api',
  baseQuery: fetchBaseQuery({
    baseUrl: 'https://someapibase',
  }),
  endpoints(builder) {
    return {
      fetchAccountAssetsById: builder.query<IApiResponse, null>({
        query() {
          console.log('store can be called here', store.getState().user.id);
          return `/apipath?id=${store.getState().user.id}`;
        },
      }),
    };
  },
});

export default getsomethingSlice;
export const { useFetchAccountAssetsByIdQuery } = getsomethingSlice;

当我在某处读到 markerikson 提到导入商店而不是在 thunk 中使用 getState 不是一个好习惯时,我环顾四周并在文档中看到在 onStart 中存在用于查询的 getState 与 thunk 不同,您可以访问它从它的第二个参数。

有人对此有 onStart 实现吗?或者进口商店是否可以接受?

4

1 回答 1

8

一般来说,我们希望阻止人们这样做,这就是为什么你在getStore那里没有可用的(你在许多其他地方都有)。

您会看到,RTK-query 使用您在查询中提供的参数来确定缓存键。由于您没有传入参数,因此结果将存储为fetchAccountAssetsById(undefined).

因此,您提出了第一个请求,state.user.id即 5 并且提出了该请求。

现在,您state.user.id更改为 6。但是您的组件调用useFetchAccountAssetsByIdQuery()并且已经有一个缓存条目fetchAccountAssetsById(undefined),因此仍在使用 - 并且没有发出任何请求。

如果您的组件将调用useFetchAccountAssetsByIdQuery(5)并且它更改为useFetchAccountAssetsByIdQuery(6),则 RTK-query 可以安全地识别它有一个缓存条目fetchAccountAssetsById(5),但没有,fetchAccountAssetsById(6)并且将发出新请求,检索最新信息。

因此,您应该在组件中选择该值,useSelector并将其作为参数传递到查询挂钩中,而不是将其从query函数中的存储区中拉出。

于 2021-06-06T10:56:24.200 回答