Redux工具包,何时使用createListenerMiddleware而不是createAsyncThunk

ebdffaop  于 2023-03-12  发布在  其他
关注(0)|答案(1)|浏览(223)

假设我有一个这样的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示例非常模糊),以及何时应该采用一种解决方案而不是另一种?

czfnxgou

czfnxgou1#

它们是不同的工具,用于不同的目的。
thunk是“命令式的”,意思是“马上去做这件事”。
监听器是“被动的”,它是“当事情发生时,运行相应的代码”。
例如:注意在你的thunk例子中,异步逻辑首先发生,然后动作被分派,然后reducer更新。
使用侦听器,动作被分派,reducer更新,* 然后 * 侦听器运行并做更多的工作。
更具体地说,createAsyncThunk是“现在就去做一些异步工作,并在异步逻辑之前和之后分派动作”。createListenerMiddleware是“每当分派这个动作时,就去做其他额外的工作”。
打个比方,它就像一把锤子和一把螺丝刀,它们都是你用来盖房子的工具,但作为整个建筑工作的一部分,你在不同的时间使用它们来完成不同的任务。
另请参见Redux文档中的“副作用方法”页面:

相关问题