Redux工具包中的减速机和外减速机有什么不同?

ujv3wf0j  于 2022-09-21  发布在  React
关注(0)|答案(3)|浏览(187)

我已经学习redux工具包两个月了,在createSlice中有reducersextrareducers,我知道它们用来从调度状态改变,但我不知道有什么区别,我们应该在哪里使用它们?

nfeuvbwi

nfeuvbwi1#

reducers属性既创建操作创建器函数,又响应切片缩减器中的该操作。extraReducers允许您响应切片缩减器中的操作,但不创建操作创建器函数。

您将在大部分时间使用reducers

当您正在处理已在其他地方定义的操作时,您将使用extraReducers。最常见的示例是响应createAsyncThunk操作和响应来自另一个片的操作。

nx7onnlm

nx7onnlm2#

extrareducers实际上与reducers类似,但具有增强功能,但它被构建为处理更多选项,特别是其他操作(如在其他切片中生成的操作或由createActioncreateAsyncThunk执行的操作)。一句话
您可以在Redux中发送的所有内容都可以添加到它中。

createSlice中的extrareducers属性可以用作函数对象

函数表单具有名为builder的输入参数。

示例1:builder.addCase函数添加来自另一个片的操作(具有类型安全)。

const {actions,reducer} = createSlice({
  name:'users',
  reducers:{
    ......
  },
  initialState:.... ,
  extraReducers:(builder) => {
    builder.addCase(authActions.logout, state => {
      state.isLoggedIn = false;
    });
  }
});

这里的authActions.logout是来自另一个切片的另一个操作。

如果您使用createAsyncThunk函数(从“@reduxjs/TOOLKIT”导入)创建操作,则可以处理加载、成功和失败状态。

示例2:处理来自异步突破器的加载状态:

const fetchUserById = createAsyncThunk(
  'users/fetchByIdStatus',
  async (userId, thunkAPI) => {
    const response = await userAPI.fetchById(userId)
    return response.data
  }
)

const {actions,reducer} = createSlice({
  name:'users',
  reducers:{
    ......
  },
  initialState:.... ,
  extraReducers: (builder) => {
    ......
    ......

    builder.addCase(fetchUserById.pending, (state, action) => {
      state.loading=true;
      state.whoseDataIsLoading = action.payload;
    })
  }
});

1.fetchUserById.Pending(处理asyncThunk的加载状态)
1.fetchUserById.rejected(处理失败状态)
1.fetchUserById.Fuled(句柄成功状态)

构建器还接受addDefaultCaseaddMatcher,其中addDefaultCase用作常规减速器(没有工具包的减速器中的减速器)使用的Switch语句中的缺省情况,

AddMatcher与类型 predicate 函数*一起使用,该函数用于推断某些输入具有某种特定类型(此处为操作类型)*以确保该操作具有特定类型,然后状态更改。

示例3:将extrareducers作为对象:

const {actions,reducer} = createSlice({
  name:'users',
  reducers:{
    ......
  },
  initialState:.... ,
  extraReducers: {
    ['incrementBy']: (state, action) => {
      state.someValue += action.payload
    }
  }
  });

参考资料:

1.https://redux-toolkit.js.org/api/createSlice#extrareducers
1.https://redux-toolkit.js.org/usage/usage-with-typescript#type-safety-with-extrareducers
1.https://redux-toolkit.js.org/api/createAsyncThunk
1.https://redux-toolkit.js.org/usage/usage-with-typescript#typing-builderaddmatcher
1.https://redux-toolkit.js.org/api/createReducer#builderadddefaultcase

7jmck4yq

7jmck4yq3#

如果动作应该由一个减速器处理,则使用reducers

如果动作应该由多个减速器处理,请使用extraReducers

相关问题