Как устроена организация данных в Redux Toolkit с использованием слайсов
Что проверяют
Понимаете ли вы, как делить состояние приложения на слайсы и что createSlice генерирует за вас. Пересказ примера со счётчиком не засчитают, ждут разговора о границах слайсов, асинхронности и серверных данных. Следом часто спрашивают, как один слайс реагирует на действие другого.
Как отвечать
Слайс это кусок состояния под одним ключом стора вместе с логикой его изменения. createSlice принимает name, initialState и reducers и возвращает редьюсер и экшен-криейторы с типами вида todos/added.
- Immer: внутри кейс-редьюсера можно «мутировать»
state, Immer соберёт из этого новый неизменяемый объект. Либо мутируйте черновик, либо возвращайте новое значение, но не то и другое сразу; - extraReducers: реакция на чужие действия и на
createAsyncThunkчерезbuilder.addCase(fetchTodos.fulfilled, ...). В RTK 2.0 объектная запись здесь удалена, остался только builder; - нормализация: коллекции хранят как
idsиentitiesчерезcreateEntityAdapter, он же даёт готовые редьюсеры и селекторы; - селекторы: с RTK 2.0 их можно объявить прямо в слайсе полем
selectors, а производные данные считать черезcreateSelector; - сборка:
configureStore({ reducer: { todos, auth } })илиcombineSlicesс ленивым подключением слайсов для code splitting.
Делите слайсы по доменам (auth, cart, filters), а не по компонентам. Отдельно скажите про серверные данные: список заказов с кэшем, повторными запросами и инвалидацией лучше отдать RTK Query (createApi), а в слайсах держать клиентское состояние.
Покажите структуру: фича со своим slice.ts, селекторами и типизированными хуками useAppSelector и useAppDispatch.
Где спотыкаются
Мутируют state и одновременно делают return. Immer выбрасывает ошибку, а кандидат не понимает, откуда она.
Складывают в стор несериализуемые значения: Date, Map, промисы, экземпляры классов. Встроенная проверка сериализуемости в dev-режиме начинает сыпать предупреждениями, а DevTools показывают мусор.
Дублируют серверные данные в слайсах вручную, с флагами isLoading в каждом. Через полгода в проекте десяток одинаковых редьюсеров и рассинхронизированный кэш.