将额外的参数传递给 redux 工具包中的 thunk payload

Pass extra arguments to thunk payload in redux toolkit

我正在使用 createAsyncThunk 方法处理带有 RTK 的 api 请求。

但是,我无法将额外的参数传递给 thunk 的 fulfilled 响应。我只能从返回的承诺中获取数据。

返回的承诺有这个数据:

{ items: [ [Object], [Object] ], metadata: {} }

动作:

export const getGroupsBySchoolId = createAsyncThunk(
  'groups/getGroupsBySchoolId',
  async (schoolId, _thunkAPI) => {
    const { items } = await fetch(someUrl); // simplified fetch request

    return { items, schoolId }; // this won't work in the reducer, only if I unwrap() the promise in the component
  },
);

在构建器的切片中,我试图获得 schoolId,但我只得到返回的承诺。

builder.addCase(getGroupsBySchoolId.fulfilled, (state, action) => {
  // console.log(action);
  const schoolId = action.payload.items.length > 0 ? action.payload.items[0].parentId : null; // i want to avoid this an get it from the payload
  state.items[schoolId] = action.payload.items;
  state.loading = false;
});

console.loging action 的输出,当然是返回的 promise 和 action 类型:

{
        type: 'groups/getGroupsBySchoolId/fulfilled',
        payload: { items: [ [Object], [Object] ], metadata: {} }
      }

我可以创建一个常规的 reducer 并在 promise 得到解决后调度它,但这听起来有点矫枉过正 - 我认为 - 应该在 fulfilled 构建器回调中解决。

根据你最后的评论,我明白你在问什么 - 你想知道如何访问 reducer 中的 thunk 参数。

换句话说,鉴于此:

dispatch(getGroupsBySchoolId(123))

您希望能够在操作到达减速器时在某处看到值 123

好消息是这很容易!具体来说,对于 createAsyncThunk,thunk 参数将始终作为 action.meta.arg 可用。所以,这应该有效:

builder.addCase(getGroupsBySchoolId.fulfilled, (state, action) => {
  // console.log(action);
  const schoolId = action.meta.arg;
  state.items[schoolId] = action.payload.items;
  state.loading = false;
});