Существует широкая терминология, которую часто использует экосистема Redux. Мы постараемся охватить самые распространенные из них.
В основе Redux лежат действия, поэтому давайте углубимся в тему.
Структура действий
Действия — это просто все интерактивные действия, которые пользователь может выполнять в приложении или на веб-странице. Это объекты Javascript с двумя свойствами (тип, полезная нагрузка). Вы можете думать о них как об инструкциях для операторов.
// Example 1 { type: 'categories/addNewCategory', payload: { id: 1, title: 'Hats', items: [], }, } // Example 2 { type: 'todos/addNewTodo', payload: 'Complete homework by Monday', }
Тип – это строка, представляющая действие, предпринятое пользователем. Он имеет структуру («domain/actionType»). Домен описывает, какому редьюсеру принадлежит действие. Вторая часть строки написана в соответствии с соглашением об имени регистра верблюдов в последнем Redux Toolkit.
полезная нагрузка может быть чем угодно, что нужно отправить редуктору для замены некоторых значений в хранилище. Как показано в приведенных выше примерах, это может быть объект, строка или число. Магазин представляет состояние приложения.
Отправка действий с помощью useDispatch()
Отправка означает отправку действия в пути для замены некоторых значений в магазине. Функция useDispatch()
используется для отправки действий, предпринимаемых пользователем, как показано ниже. Пользователь может выполнить два действия (добавить элемент, удалить элемент), нажав кнопки в примере ниже. Когда пользователь нажимает эти кнопки, соответствующее действие будет отправлено в избыточность.
const CartItem = ({ item }) => { const dispatch = useDispatch(); return ( <div className='item-buttons'> <button onClick={() => dispatch(addItemToCart(item))}>Add Item</button> <button onClick={() => dispatch(deleteItemFromCart(item))}>Delete Item</button> </div> </div> ); };
Что такое магазин?
Вы можете думать о хранилище как о складе для вашего приложения. Хранилище — это объект, который содержит все динамические состояния, которые вы будете использовать для визуализации своих компонентов. Он начинается с начального состояния и изменяется с течением времени в зависимости от действий, предпринимаемых пользователем. Существует только одно rootState
, и несколько подсостояний принадлежат rootState
. В приведенном ниже примере есть три подсостояния.
//User const initialState = { currentUser: null, isLoading: false, error: null, }; //Categories const initialState = { categories: [], isLoading: false, error: null, }; //Cart const initialState = { isCartOpen: false, cartItems: [], }; //Root store will initially look something like this rootStore = { user: { currentUser: null, isLoading: false, error: null, }, categories: { categories: [], isLoading: false, error: null, }, cart: { isCartOpen: false, cartItems: [], } } //This store has all the states we need to render our application components
Что такое редукторы?
Редюсеры можно рассматривать как операторы, которые могут распознать отправленное действие и внести необходимые изменения в хранилище. Мы используем функцию createSlice()
для определения всех связанных редукторов. Мы создаем пользовательскую часть магазина в примере ниже. В Redux Toolkit есть шаблонный код для настройки вашего магазина Redux. Команда разработчиков определяет и использует лучшие практики для своего подхода, поэтому нам будет полезно соблюдать эти стандартные коды.
const userSlice = createSlice({ name: 'user', //this defines the domain part of the action initialState, reducers: { checkUserSession(state) { state.isLoading = true; }, googleSignInStart(state) { state.isLoading = true; }, emailSignInStart(state, action) { state.isLoading = true; }, signInSuccess(state, action) { state.currentUser = action.payload; state.isLoading = false; state.error = null; }, signInFail(state, action) { state.currentUser = null; state.isLoading = false; state.error = action.payload; }, }, });