我目前正在将一个旧的redux代码库转换为使用redux工具包(RTK),我似乎不明白这些方法之间的区别。请考虑以下切片:
interface MyState {
someItems: string[];
}
const myInitialState: MyState = {
someItems: []
};
const mySlice = createSlice({
name: 'mySlice',
initialState: myInitialState,
reducers: {
setItems(state, action: PayloadAction<string[]>) {
state.someItems = action.payload;
}
},
extraReducers: builder => {
builder.addCase(fetchItems.fulfilled, (state, action) => {
state.someItems = action.payload;
});
}
});
字符串
我使用redux的传统方式是直接从Thunk调用reducer,但我认为在extraReducers中定义的方式也是可能的。
const fetchItems = createAppAsyncThunk(
'mySlice/fetchItems',
async (_, thunkAPI) => {
try {
//Get data from backend
const response = await getItems();
//Option 1
thunkAPI.dispatch(mySlice.actions.setItems(response));
//Option 2
return response;
} catch (e) {
return thunkAPI.rejectWithValue('failed');
}
}
);
型
这两种方法之间有何区别?他们中有谁比另一个更受欢迎吗?最后,在做更改时,我经常要重新加载数据以获得最新更新。这一次我相信我 * 已经 * 在Thunk中使用了dispatch
。还是有其他选择?
const editItem = createAppAsyncThunk<void, string>(
'mySlice/fetchItems',
async (changedValue, thunkAPI) => {
try {
//Send data to backend
await sendSomethingToBackend(changedValue);
thunkAPI.dispatch(fetchItems());
} catch (e) {
return thunkAPI.rejectWithValue('failed');
}
}
);
型
1条答案
按热度按时间alen0pnh1#
给出:
字符串
这两种方法之间有何区别?
从总体上看,就单个
mySlice
状态片而言,两者之间没有太大区别。主要的区别归结为什么,或者在哪里,可以处理“解析的”thunk。thunkAPI.dispatch(mySlice.actions.setItems(response));
个mySlice
setItems
减速器函数可以响应并处理此操作。return response;
个extraReducers
函数都可以响应并处理fetchItems.fulfilled
操作。他们中有谁比另一个更受欢迎吗?
这是主观的,但使用Thunk的
.pending
、.fulfilled
和.rejected
操作可能是普遍接受的首选方法,因为它提供了更大的灵活性。RTK的一个最重要的目标是减少您需要自己编写的代码量。使用自动生成的Thunk操作是此目标的一部分。型
最后,在做更改时,我经常要重新加载数据以获得最新更新。这一次我相信我必须在thunk内部使用调度。
是的,在这里您绝对 * 需要 * 调度
fetchItems
操作来重新获取sendSomethingToBackend
可能已经在后端更新的数据。或者有其他选择吗?
如果您正在获取和更新数据,则可以使用Redux-Toolkit Query(RTK查询)作为替代方法。您将创建一个管理查询和变异的API切片。将
fetchItems
Thunk转换为查询,将editItem
Thunk转换为突变,使用cache tags突变可以使查询的数据无效并触发查询自动重新获取。换句话说,进一步减少您编写的代码。