以下代码按预期工作。使用 createEntityAdapter 填充状态。
import { createSlice, createAsyncThunk, createEntityAdapter } from '@reduxjs/toolkit';
export const fetchUsers = createAsyncThunk('users/fetchUsers', async () => {
const response = await fetch('https://mysite/wp-json/wp/v2/users');
return response.json();
});
export const usersAdapter = createEntityAdapter();
const initialState = usersAdapter.getInitialState({ status: 'idle' });
export const usersSlice = createSlice({
name: 'users',
initialState,
reducers: {},
extraReducers: (builder) => {
builder.addCase(fetchUsers.pending, (state) => {
state.status = 'pending';
});
builder.addCase(fetchUsers.fulfilled, usersAdapter.upsertMany);
},
});
export default usersSlice.reducer;
但是,随着承诺的履行,我还想将状态的“状态”属性更新为“空闲”。
当我将已完成的案例更改为:
builder.addCase(fetchUsers.fulfilled, (state, action) => {
usersAdapter.upsertMany;
state.status = 'idle';
});
当我添加一个参数时,upsertMany
builder.addCase(fetchUsers.fulfilled, (state, action) => {
usersAdapter.upsertMany(action.payload);
state.status = 'idle';
});
我收到错误:可能未处理的 Promise Rejection (id: 0)
除了如何使它工作的问题,我可以再问一个问题吗?在第一个代码片段中(那个有效的):
builder.addCase(fetchUsers.fulfilled, usersAdapter.upsertMany);
我知道 addCase 有两个参数:动作类型/创建者(fetchUsers.fulfilled 是这里的动作创建者)和一个减速器(在这种情况下是 usersAdapter.upsertMany)。这里 fetchUsers 返回对象,但是usersAdapter.upsertMany 如何知道要插入/更新什么作为有效负载?那里没有参数(例如usersAdapter.upsertMany(action.payload)。在所有其他需要一些有效负载的reducer中,总是有一个参数(状态,动作),例如。
builder.addCase(incrementBy, (state, action) => state.counter += action.payload)