假设我有一个这样的Redux切片
const authSlice = createSlice({
name: 'authInfo',
initialState: {value: ""},
reducers: {
setAuthState: (state, action: PayloadAction<any>) => {
state.value = action.payload;
},
}
})
我还想通过异步调用在加密存储上保留authState。
到目前为止,我一直认为异步操作的首选是createAsyncThunk
,定义如下
export const storeAuthState = createAsyncThunk(
'authInfo/storeAuthState',
async (authState: any) => {
await EncryptedStorage.setItem('auth_state', JSON.stringify(authState));
return authState;
},
);
...
const authSlice = createSlice({
...
reducers: {
...
extraReducers: builder => {
builder.addCase(storeAuthState.fulfilled, (state, action) => {
state.value = action.payload;
})
...
并在每次更新时调度storeAuthState
。
然而,我刚刚发现了createListenerMiddleware
的存在,我可以用这种方式实现同样的目标:
export const listenerMiddleware = createListenerMiddleware()
listenerMiddleware.startListening({
actionCreator: setAuthState,
effect: async (action, listenerApi) => {
await EncryptedStorage.setItem('auth_state', JSON.stringify(action.payload))
}
})
对我来说,这两种方法没有太大区别,我理解Redux存储和加密存储的更新顺序不同,但最终结果是相同的。
也许第二种解决方案看起来更干净,所以我想知道这两种方法旨在解决的一些真实的用例是什么(rtk网站上的createListenerMiddleware示例非常模糊),以及何时应该采用一种解决方案而不是另一种?
1条答案
按热度按时间czfnxgou1#
它们是不同的工具,用于不同的目的。
thunk是“命令式的”,意思是“马上去做这件事”。
监听器是“被动的”,它是“当事情发生时,运行相应的代码”。
例如:注意在你的thunk例子中,异步逻辑首先发生,然后动作被分派,然后reducer更新。
使用侦听器,动作被分派,reducer更新,* 然后 * 侦听器运行并做更多的工作。
更具体地说,
createAsyncThunk
是“现在就去做一些异步工作,并在异步逻辑之前和之后分派动作”。createListenerMiddleware
是“每当分派这个动作时,就去做其他额外的工作”。打个比方,它就像一把锤子和一把螺丝刀,它们都是你用来盖房子的工具,但作为整个建筑工作的一部分,你在不同的时间使用它们来完成不同的任务。
另请参见Redux文档中的“副作用方法”页面: