Handle createAsyncThunk lifecycle actions
A thunk dispatches pending, fulfilled, and rejected actions that a slice must use to track loading or errors.
Redux Toolkit · Function
extraReducers lets a Redux Toolkit slice respond to actions defined outside its own reducers field. It registers handlers without generating additional action creators or action types.
extraReducers lets a slice handle action types defined elsewhere. Its builder callback registers case reducers, matchers, or a fallback handler; these reducers use Immer-style updates, but unlike entries in reducers, they do not create actions or action types.
extraReducers?: (builder: ActionReducerMapBuilder<State>) => void| Name | Type | Description |
|---|---|---|
extraReducers | (builder: ActionReducerMapBuilder<State>) => void | Callback receiving an ActionReducerMapBuilder<State> used to register case reducers, matchers, and a default handler. |
No standalone return value; it is a createSlice configuration option that contributes reducer cases.
reducers wins.import { createAction, createSlice } from '@reduxjs/toolkit'
const loggedOut = createAction('auth/loggedOut')
const sessionSlice = createSlice({
name: 'session',
initialState: { userId: 'u1' as string | null },
reducers: {},
extraReducers: (builder) => {
builder.addCase(loggedOut, (state) => {
state.userId = null
})
},
})
export default sessionSlice.reducerThe slice updates its state when an action created outside its own reducers is dispatched.
A thunk dispatches pending, fulfilled, and rejected actions that a slice must use to track loading or errors.
One domain event should clear or update state held by several independent slices.
A slice needs to synchronize state with an RTK Query endpoint result.
extraReducers solve?extraReducers registers reducer logic for actions that the slice did not generate itself. It is commonly used for actions from another slice, createAsyncThunk, or other external action creators.
Follow-up: How can a slice respond to an RTK Query result? Register an endpoint matcher such as api.endpoints.login.matchFulfilled with builder.addMatcher.
extraReducers configured?The builder callback receives an ActionReducerMapBuilder and can call methods such as addCase, addMatcher, and addDefaultCase. These methods associate external actions or matching predicates with state update logic.
Follow-up: Why is the builder form preferred in modern RTK? RTK 2.0 removed the object form and the builder form provides better TypeScript support.
extraReducers differ from reducers?Case reducers in extraReducers are wrapped in Immer, so they may use mutating syntax that safely updates draft state. They do not generate action creators or action types, unlike case reducers declared in reducers.
Follow-up: What happens on an action-type collision? The matching case reducer from reducers handles the action instead of the extraReducers case.
createSlicecreateReducercreateActioncreateAsyncThunkActionReducerMapBuilderbuilder.addCasebuilder.addMatcherbuilder.addDefaultCase