Концепция
Что такое Redux?
Redux — это библиотека для управления и обновления состояния приложения с использованием событий, называемых «действиями». Он служит централизованным хранилищем состояния, которое необходимо использовать во всем приложении, с правилами, гарантирующими, что состояние может обновляться только предсказуемым образом.
Redux более полезен, когда:
- У вас есть большое количество состояния приложения, которое необходимо во многих местах приложения
- Состояние приложения часто обновляется с течением времени
- Логика обновления этого состояния может быть сложной
- Приложение имеет кодовую базу среднего или большого размера, и над ним может работать много людей
Базовая концепция Redux
Для того чтобы нам легче было понять Redux нам нужно запомнить данную цепочку.
Давайте рассмотрим эту схему:
- State - источник правды, который управляет нашим приложением
- View - Пользовательский интерфейс, который отображается на основе этого состояния
- Actions - действия, которые происходят в пользовательском интерфейсе(можно представить в виде объекта JS)
const addTodoAction = {
type: 'todos/todoAdded',
payload: 'Buy milk'
}
- Reducer - это функция, которая получает текущий state и action, после этого решает как обновить состояние при необходимости, и возвращает новое состояние
- Store - объект в котором находиться текущее состояние приложения и прочее
- Middlewares - это дополнительное функции для работы с каким-либо api
Почему же @reduxjs/toolkit?
У вас может возникнуть вопрос - "Почему мы используем здесь @reduxjs/toolkit, когда есть такие библиотеки как redux, redux-thunk?" Ответ прост: RTK(Redux ToolKit) это официально рекомендованная библиотека redux, которая позволяет установить одну зависимость и начать работать с состоянием. А так же значительно сокращает код, который вам предстоит написать. Сравните эти 2 фрагмента которые выполняют одно и то же:
Пример кода библиотеки redux:
const ADD_TODO = 'ADD_TODO'
const TODO_TOGGLED = 'TODO_TOGGLED'
export const addTodo = text => ({
type: ADD_TODO,
payload: { text, id: nanoid() }
})
export const todoToggled = id => ({
type: TODO_TOGGLED,
payload: id
})
export const todosReducer = (state = [], action) => {
switch (action.type) {
case ADD_TODO:
return state.concat({
id: action.payload.id,
text: action.payload.text,
completed: false
})
case TODO_TOGGLED:
return state.map(todo => {
if (todo.id !== action.payload.id) return todo
return {
...todo,
completed: !todo.completed
}
})
default:
return state
}
}
Пример кода RTK:
import { createSlice } from '@reduxjs/toolkit'
const todosSlice = createSlice({
name: 'todos',
initialState: [],
reducers: {
todoAdded(state, action) {
state.push({
id: action.payload.id,
text: action.payload.text,
completed: false
})
},
todoToggled(state, action) {
const todo = state.find(todo => todo.id === action.payload)
todo.completed = !todo.completed
}
}
})
export const { todoAdded, todoToggled } = todosSlice.actions
export default todosSlice.reducer
Настройка магазина:
import { configureStore } from '@reduxjs/toolkit'
import todosReducer from '../features/todos/todosSlice'
import filtersReducer from '../features/filters/filtersSlice'
export const store = configureStore({
reducer: {
todos: todosReducer,
filters: filtersReducer
}
})
Видео
В данном уроке мы познакомились с базовой концепцией Redux.