Last updated
Last updated
🔗
Redux Toolkit - это набор инструментов, разработанный командой Redux для упрощения и ускорения процесса разработки приложений на React с использованием Redux. Он предоставляет удобные абстракции над стандартным Redux API, которые позволяют сократить количество бойлерплейта, необходимого для настройки хранилища Redux и управления его состоянием.
Одной из основных проблем, которую решает Redux Toolkit, является упрощение процесса создания Redux-хранилища и управления его состоянием. Вместо того, чтобы создавать отдельные действия (actions), редьюсеры (reducers) и селекторы (selectors) вручную, Redux Toolkit предоставляет готовые инструменты для автоматической генерации всех этих элементов, используя более простой и интуитивно понятный API.
Кроме того, Redux Toolkit также предоставляет множество дополнительных функций, таких как middleware, thunk-функции и immer, которые помогают улучшить производительность, расширяемость и поддерживаемость кода, написанного с использованием Redux.
Store в RTK создается при помощи функции configureStore
configureStore - это функция, предоставляемая Redux Toolkit, которая делает настройку Redux store (хранения состояния приложения). Она облегчает создание store и добавляет некоторые полезные функции по умолчанию.
Например, configureStore автоматически включает проверку типов данных (type checking) с помощью пакета Redux Toolkit "redux-immutable-state-invariant". Это означает, что если вы случайно измените неизменяемое состояние в своем приложении, Redux Toolkit выдаст предупреждение об этом.
Также configureStore позволяет вам настраивать middleware (промежуточное программное обеспечение), которое позволяет вам добавлять дополнительную функциональность к вашему приложению, например, логирование или обработку ошибок.
Кроме того, configureStore автоматически включает Redux DevTools Extension, которое позволяет вам отслеживать состояние вашего приложения и действия пользователя в браузере.
Таким образом, configureStore облегчает настройку Redux store в вашем приложении и добавляет множество полезных функций по умолчанию, которые могут помочь улучшить производительность и надежность вашего приложения.
В инициализационной конфигурации store уже создан, поэтому летим дальше 🚀
Теперь давайте научимся создавать редьюсеры в RTK.
createSlice - это функция, которая позволяет вам быстро создавать "slice" (часть) вашего глобального состояния в Redux.
"Slice" - это кусок вашего хранилища (store), который содержит данные и функции для их изменения. Например, если у вас есть приложение с заметками, то "slice" может содержать все заметки и функции для добавления/удаления заметок.
createSlice позволяет вам определить начальное состояние "slice" и функции, называемые "reducers", которые изменяют состояние. Кроме того, она автоматически генерирует действия (actions) для каждого редьюсера, которые вы можете использовать в своем приложении.
Например, если вы хотите создать "slice" для списка заметок, вы можете использовать createSlice для определения начального состояния (например, пустого массива заметок) и редьюсеров, таких как addNote и deleteNote, которые будут добавлять или удалять заметки из списка. Затем вы можете использовать созданные действия (actions), такие как "addNote" или "deleteNote", в своем компоненте для обновления списка заметок.
В целом, createSlice упрощает процесс создания "slice" в Redux и сокращает количество кода, необходимого для создания начального состояния, редьюсеров и действий. Это может помочь ускорить разработку вашего приложения и улучшить его производительность.
4.1) На основании примера из документации перепишем authReducer на slice
4.2) По аналогии переводим app-reducer.ts
⌚Самостоятельная работа. Начинаем самостоятельно, с преподавателем продолжаем
❗Т.к. экшены с app используются во многих санка / тестах / утилитных функциях, то рефакторинга будет много. Но ничего страшного, проделываем, набиваем руку. В любом случае сейчас или потом рефакторить придется
❗Если мы не выносим стейт в slice, то у нас будут проблемы с тестами, т.к. в тестах мы используем такой же стейт, но если мы допустим в нем ошибку, то TS не ругнется. Чтобы решить эту проблему и не выносить отдельно стейт напишем следующую типизацию
export type AppInitialStateType = ReturnType<typeof slice.getInitialState>
4.3) По аналогии переводим todolists-reducer.ts
Т.к. в тудулисте будут не совсем тривиальное изменение стейта, держите подсказки
Распространенная ошибка заключается в попытке напрямую присвоить state = someValue. Это не сработает! Это лишь указывает локальную переменную state на другую ссылку. Таким образом, не происходит ни мутации существующего объекта/массива состояния в памяти, ни возвращения совершенно нового значения, поэтому Immer не вносит никаких реальных изменений.
❗ Чтобы протестировать работоспособность:
todolists-reducers
в tasks-reducer.ts в ActionType добавим any
в компоненте Todolist сделаем проверку на undefined c помощью оператора ?
4.4) По аналогии переводим tasks-reducer.ts
не самые проcтые изменения в редьюсерах и для того чтобы переписать некоторые кейсы нам понадобятся знания об extraReducers
⬇️
5.1) Когда нам необходимо обработать case, который был создан в другом slice (т.к. не принадлежит текущему), тогда нам необходимо в функцию createSlice добавить свойство extraReducers
Пример. Мы создали todolists-reducer с помощью createSlice, но когда мы добавляем тудулист, то нам необходимо в task-reducer написать case, который будет добавлять пустой массив тасок в только что созданный тудулист. Т.е. как раз таки и получается, что мы будем task-reducer обрабатывать case, который создан в todolists-reducer
Подсказка
5.2) синтаксис extrarReducer
addCase
addMatcher
addDefaultCase
3.1) Теперь создадим store согласно @reduxjs/toolkit
3.2) Изменим немного типизацию стейта всего приложения, чтобы соответствовать документации
3.3) thunk middleware идет по умолчанию, поэтому его не обязательно добавлять. Но если / когда понадобится делаем это следующим образом
В принципе можно создать редьюсер через , но это применяется редко на практике, поэтому давайте сразу будем делать создание редьюсеров через
при работе с массивом пользуемся если это возможно мутабельными способами изменения - -
Например , push, pop, unshift...
❗ Рассказать что
❗ Рассказать как
✅ (рекомендуемый способ работы с TS)
5.3) Builder предоставляет 3 метода