我已经学习redux工具包两个月了,在createSlice中有reducers和extrareducers,我知道它们用来从调度状态改变,但我不知道有什么区别,我们应该在哪里使用它们?
createSlice
reducers
extrareducers
nfeuvbwi1#
reducers属性既创建操作创建器函数,又响应切片缩减器中的该操作。extraReducers允许您响应切片缩减器中的操作,但不创建操作创建器函数。
extraReducers
您将在大部分时间使用reducers。
当您正在处理已在其他地方定义的操作时,您将使用extraReducers。最常见的示例是响应createAsyncThunk操作和响应来自另一个片的操作。
createAsyncThunk
nx7onnlm2#
extrareducers实际上与reducers类似,但具有增强功能,但它被构建为处理更多选项,特别是其他操作(如在其他切片中生成的操作或由createAction或createAsyncThunk执行的操作)。一句话您可以在Redux中发送的所有内容都可以添加到它中。
createAction
createSlice中的extrareducers属性可以用作函数或对象。
函数表单具有名为builder的输入参数。
builder
示例1:builder.addCase函数添加来自另一个片的操作(具有类型安全)。
builder.addCase
const {actions,reducer} = createSlice({ name:'users', reducers:{ ...... }, initialState:.... , extraReducers:(builder) => { builder.addCase(authActions.logout, state => { state.isLoggedIn = false; }); } });
这里的authActions.logout是来自另一个切片的另一个操作。
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(句柄成功状态)
构建器还接受addDefaultCase和addMatcher,其中addDefaultCase用作常规减速器(没有工具包的减速器中的减速器)使用的Switch语句中的缺省情况,
addDefaultCase
addMatcher
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#extrareducers1.https://redux-toolkit.js.org/usage/usage-with-typescript#type-safety-with-extrareducers1.https://redux-toolkit.js.org/api/createAsyncThunk1.https://redux-toolkit.js.org/usage/usage-with-typescript#typing-builderaddmatcher1.https://redux-toolkit.js.org/api/createReducer#builderadddefaultcase
7jmck4yq3#
如果动作应该由一个减速器处理,则使用reducers。
如果动作应该由多个减速器处理,请使用extraReducers。
3条答案
按热度按时间nfeuvbwi1#
reducers
属性既创建操作创建器函数,又响应切片缩减器中的该操作。extraReducers
允许您响应切片缩减器中的操作,但不创建操作创建器函数。您将在大部分时间使用
reducers
。当您正在处理已在其他地方定义的操作时,您将使用
extraReducers
。最常见的示例是响应createAsyncThunk
操作和响应来自另一个片的操作。nx7onnlm2#
extrareducers
实际上与reducers
类似,但具有增强功能,但它被构建为处理更多选项,特别是其他操作(如在其他切片中生成的操作或由createAction
或createAsyncThunk
执行的操作)。一句话您可以在Redux中发送的所有内容都可以添加到它中。
createSlice
中的extrareducers
属性可以用作函数或对象。函数表单具有名为
builder
的输入参数。示例1:
builder.addCase
函数添加来自另一个片的操作(具有类型安全)。这里的
authActions.logout
是来自另一个切片的另一个操作。如果您使用
createAsyncThunk
函数(从“@reduxjs/TOOLKIT”导入)创建操作,则可以处理加载、成功和失败状态。示例2:处理来自异步突破器的加载状态:
1.fetchUserById.Pending(处理asyncThunk的加载状态)
1.fetchUserById.rejected(处理失败状态)
1.fetchUserById.Fuled(句柄成功状态)
构建器还接受
addDefaultCase
和addMatcher
,其中addDefaultCase
用作常规减速器(没有工具包的减速器中的减速器)使用的Switch语句中的缺省情况,AddMatcher与类型 predicate 函数*一起使用,该函数用于推断某些输入具有某种特定类型(此处为操作类型)*以确保该操作具有特定类型,然后状态更改。
示例3:将
extrareducers
作为对象:参考资料:
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
7jmck4yq3#
如果动作应该由一个减速器处理,则使用
reducers
。如果动作应该由多个减速器处理,请使用
extraReducers
。