Автор оригинала: Petar Vukašinović.
Привет! Это мой первый пост на кодамент, и я надеюсь, что вам это понравится. Я только что закончил проект среднего размера в Vue.js, и поскольку я создал комплексное приложение, мне нужно было решение для управления состоянием приложения. Я провел некоторое время, играя как с redux, так и vuex. В этом посту я собираюсь показать вам основные различия между этими двумя библиотеками, и которые из которых я выбрал для моего решения. Готовый? Пошли!
Государственное управление – это способ управлять государством в вашем приложении, убедившись, что ваш интерфейс всегда отражает ваши изменения приложения. Есть несколько способов управления состоянием в вашем приложении, и во многих случаях вам не нужны библиотеки, такие как redux или vuex, но если ваше приложение начинает становиться диким и сложным, государственное управление решение может помочь вам оценить эти проблемы.
В прошлом в нашей заявке было не редкость в нашей заявке, заправленной внутри контроллеров, услуг, маршрутов, директивах (Angularjs), локального хранения, хранения сеансов, файлов cookie и некоторых других альтернатив.
Когда приложение растет, этот подход действительно трудно масштабироваться, и это там, где флюс и реагируют.
Реагирование изменилось так, как мы приближаемся к управлению государством. Redux (на основе flux) находится в переднем и центре этого смещения, поскольку он ввел элегантный, но глубокий простым способом управления состоянием приложения. Vuex последовали redux и нашел разрабатывающую сумму Vue разработчиков.
Redux – это каркасная государственная библиотека государства. То, что я заметил во время разработки с реакцией, заключается в том, что redux создан с учетом реагирования. Если вы думаете об использовании Vue с Redux, Vuex, вероятно, является лучшей государственной библиотекой управления для поддержания производительности. Вот некоторые вещи, которые нужно знать о двух:
Действия
Давайте начнем с самой простой части redux. Действия! Действия являются очень простыми объектами с свойством «типа» и минимальным количеством других свойств и значений, которые необходимы для объяснения действий, которые мы намерены сделать в состоянии.
Действия – единственный способ изменить состояние и изменение состояния выполняется «диспетчерингом» действием с использованием магазина. Вот пример:
import { createStore } from 'redux' import { ActionTypes as types } from '../constants' var defaultState = { name: '' }; function reducer(state = defaultState, action) { switch(action.type) { case types.CHANGE_NAME: return { ...state, name: action.data.name } default: return state } } // Let's create the store, and add root reducer to it var store = createStore(reducer) // This is where we dispatch action to the store store.dispatch({type: types.CHANGE_NAME, data: {name: "Petar"}})
Вы можете видеть, что .Dispatch () принимает объект «Действие» и отправляет это на редуктор. Если действие не распознается, и никакие изменения не отправлены, состояние по умолчанию для старого состояния.
Редукторы
Это то, где происходит забавные вещи и где мы изменяем состояние в магазине на основе действия «Тип». Редукторы являются чистыми функциями, которые используются для реализации того, как следующее состояние рассчитывается из текущего состояния и действия.
Поскольку Redux имеет только один магазин, мы используем несколько редукторов для управления частями глобального состояния (Store). Эта концепция позволяет вам иметь несколько частей внутри вашего магазина, все управляемое разными редукторами.
Затем эти редукторы могут быть объединены в один корневой редуктор для управления всеми состояниями вашего приложения. Магазин Redux сохраняет полное состояние дерева, возвращаемое корневым редуктором.
Магазин
Это место, где вы храните состояние вашего приложения. В магазине не более чем объект, содержащий разные свойства и значения. В Redux есть только один магазин (корневой магазин) и один корневой редуктор. Точка с корневым магазином в том, что вы можете иметь несколько редукторов, которые работают на разных частях вашего магазина.
Чтобы изменить состояние, вы должны отправить к нему действие. Как только вы отправили действие, вы можете добавить смену слушателя под названием «Подписаться». Подписавшись на магазин, вы можете проверить, будет ли действие «отправлено», и ваше государственное дерево изменилось.
Хотя это работает, это может быть не лучшее решение для вашего проекта Vue.js. Самая большая причина, по которой redux заменяет объект состояния на каждое обновление.
Реагирование отличается от Vue в том, как IT-обрабатывает обновления: React отображает виртуальный DOM, затем рассчитывает оптимальные операции DOM, чтобы сделать в данный момент отображаемый в данный момент DOM соответствует новой виртуальной доме. Но он не имеет способов узнать, должен ли конкретный компонент должен перенаправить или не основываться на новых данных. Vue экземпляры следите за какими битами данных они зависят от представляют собой. Эти экземпляры автоматически регистрируют, что необходимо повторно рендерировать, когда данные изменяются.
Vuex очень похож на Redux, а также вдохновленный потоком. В отличие от Redux, Vuex мутирует состояние, а не сделать состояние неизменной. Этот подход удаляет необходимость у редуктора, поэтому в редукторах Vuex заменяется чем-то под названием мутаций.
Это позволяет Vue.js автоматически узнать, какие компоненты необходимо переиздать при изменении состояния. Вместо того, чтобы разбить государственную логику со специализированными редукторами, Vuex способен организовать свою государственную логику с магазинами, называемыми модулями.
Мутации
Единственный способ изменить состояние в магазине Vuex – совершать мутацию. Мутации очень похожи на события, и каждая мутация имеет тип строки и обработчик. Функция обработчика – это то, где мы выполняем фактические модификации состояния, и она получит состояние в качестве первого аргумента:
const store = new Vuex.Store({ state: { count: 1 }, mutations: { increment (state) { // mutate state state.count++ } } })
Вы не можете напрямую вызвать обработчик мутации. Подумайте об этом, как: «Когда мутация с приращением типа срабатывает, вызовите этот обработчик». Чтобы вызвать обработчик мутации, вам нужно позвонить в Store.comMit с его типом:
store.commit('increment')
Одна вещь, которую нужно помнить, так это то, что мутации всегда синхронно, чтобы гарантировать, что государство не зависит от времени и порядка непредсказуемых событий.
Действия
Действия аналогичны мутациям и работают как действия Redux. Действия не могут мутировать государство, скорее действий совершать мутации. Еще одно преимущество работы с действиями Vuex заключается в том, что действия могут содержать произвольные асинхронные операции. Это здорово, когда вам нужно позвонить в ваш API и гораздо более организовано по сравнению с Redux.
const store = new Vuex.Store({ state: { count: 0 }, mutations: { increment (state) { state.count++ } }, actions: { increment (context) { context.commit('increment') } } })
Отправить действие, которое мы используем:
store.dispatch('increment')
Магазин
Vuex использует одно состояние – то есть этот единственный объект содержит все состояние вашего уровня приложения и служит «единым источником правды». Это очень похоже на Redux, и в магазине является центром каждого приложения Vuex.
Поскольку Vue экземпляры отслеживают, какие биты данных они зависят от представляют собой, Vuex воспользуется этим, и когда компоненты получают состояние из магазина, эти компоненты могут реактивно и эффективно обновлять в любое время. Одно можно помнить, так это то, что штат магазина может быть изменен только путем совершения мутаций.
В то время как redux и Vuex – удивительные государственные библиотеки и шаблоны управления, я предпочитаю Vuex через Redux при работе с Vue. Вот основные причины:
- Мутации легче работать с Тогда редукторами
- Асинхронные действия гораздо более организованы в Vuex. Нет необходимости писать
_On_load
,_Success
или_Fail
Среднесрочные государственные действия. - Из коробки DEV Tools
- Намного проще настроек. Это легко, как Vue.use (Vuex)
- Vuex использует уникальность Vue.js
Я надеюсь, что вы найдете этот пост полезным, и я с нетерпением жду создания следующего