React & Modern Frontend (445 Qs)•Part 10: Modern React 18, React 19 & Next.js Patterns (317 - 353)
How do you handle cross-slice communication?
Since each createSlice only manages its own piece of state, a few patterns let one slice react to actions or data from another:
extraReducers: listen for another slice's action type without importing its reducer.
javascript
const notificationsSlice = createSlice({
name: "notifications",
initialState: [],
reducers: {},
extraReducers: (builder) => {
builder.addCase(postsSlice.actions.postAdded, (state, action) => {
state.push({ message: `New post: ${action.payload.title}` });
});
},
});
- Thunks that touch multiple slices: a single
createAsyncThunk/thunk candispatchactions belonging to several slices, or readgetState()to combine data before deciding what to dispatch. - Selectors that combine slices: a
createSelectorcan take input selectors from different slices (e.g., posts + users) and join them together for the UI, without the slices knowing about each other. - Listener middleware / sagas:
createListenerMiddleware(RTK) orredux-saga'stakeEverycan watch for an action dispatched by one slice and, in response, dispatch actions belonging to a completely different slice.
In all cases, slices stay decoupled — they communicate only through dispatched actions or shared selectors, never by directly importing and mutating each other's reducer state.