- PVSM.RU - https://www.pvsm.ru -

Удобное использование Redux в vue-компонентах

vue mixinsНедавно перешел с PolymerJS [1]на VueJS [2]для некоторых задач. Совместно с polymer использовал Redux [3]через библиотеку polymer-redux [4]. Поэтому вся бизнес-логика уже была сформирована на уровне redux store. Для связки vue и redux выбрал библиотеку vuedeux [5]. В awesome vue [6] в разделе redux [7] представлена еще одна библиотека для связки с redux — revue [8], но мне показалось эффективней использовать именно vuedeux, за счет интеграции redux store непосредственно в «свой redux» для vue vuex [9], для возможного использования его в будущем.

После создание vuex store, используя плагин vuedeux [10] доступ к необходимым разделам redux store может быть осуществлен через computed свойства экземпляра vue-компонента. Например, вот так (часть кода из examples [11]):

...
 computed: {
    todos () {
      return this.$store.state.redux.todos
    },
    ...
  }
...

А action creators попадают в экземпляр компонента через раздел data, например [12]:

new Vue({
 ...
  data: {
    reduxActions: actionCreators,
  },
 ...
});

Диспатчить экшены можно, например, так:

methods: {
    addTodo () {
        this.$store.dispatch(this.$root.reduxActions.addingTodo(text))
    },
    ...
}

Остальные action creators можно «прокинуть» напрямую в раздел methods:


methods: {
  ...mapActions({
        toggleAll: 'COMPLETE_ALL',
        clearCompleted: 'CLEAR_COMPLETED'
  }),
  ...
}

Но как по мне это не очень удобно для использования, так как все action creators будут в корне контекста экземпляра компонента. И при их использовании будет не совсем понятно этот метод диспатчит экшен или просто выполняет какие-либо внутренние действия компонента. А хотелось бы сразу понимать, что данный метод является action creators.

Для этих целей я разработал миксин [13]redux-store-mixin [14] для интеграции с redux actions через единую точку входа в виде метода reduxActions aka метод dispatch из вышеупомянутой библиотеки polymer-redux [4].

Использование

Подключаем сам миксин:

import reduxStoreMixin from "redux-store-mixin"; 

Подключаем свои action creators:

import {actionCreators} from "store/store";

И подключаем метод mapState из vuex для удобного «прокидывания» необходимых свойств из redux store:

import { mapState } from "vuex";

И создаем экземпляр vue-компонента с миксином и необходимыми свойствами:

new Vue({
  mixins: [
                ...
		reduxStoreMixin(actionCreators),
                ...
  ],
  computed: {
		...mapState({
			prop1: state => state.redux.map.prop1,
                        ...
                        propN: state => state.redux.map.propN
                 }),
                 ...
  },
  ...
});

После этого вызов экшена будет выглядеть следующим образом:

this.reduxActions(<name action creator>, ...args);

где name action creator — наименование «action creator»-функции,
...args — перечень аргументов для ее вызова.

Всю прелесть данного метода особенно прочувствуют те, кто пользовался библиотекой polymer-redux [4].

Заключение

Подобные миксины уже существует, например: Vue-Redux-Mixin-Generator [15] и vue-redux-mixin [16]. Но по сравнению с ними мое решение имеет более простую настройку и более наглядно в использовании, с учетом, что интеграция vue и redux будет осуществлена через vuedeux [5].

GitHub [14]

Автор: kolesoffac

Источник [17]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/javascript/263312

Ссылки в тексте:

[1] PolymerJS : https://www.polymer-project.org/

[2] VueJS : https://ru.vuejs.org/index.html

[3] Redux : http://redux.js.org/dops/introduction/

[4] polymer-redux: https://github.com/tur-nr/polymer-redux

[5] vuedeux: https://github.com/Vuedeux/vuedeux

[6] awesome vue: https://github.com/vuejs/awesome-vue

[7] redux: https://github.com/vuejs/awesome-vue#redux

[8] revue: https://github.com/revue/revue

[9] vuex: https://vuex.vuejs.org/ru/intro.html

[10] vuedeux: https://github.com/Vuedeux/vuedeux#inserting-the-plugin-into-a-vuex-store

[11] из examples: https://github.com/Vuedeux/vuedeux/tree/master/examples/TodoMVC

[12] например: https://github.com/Vuedeux/vuedeux/blob/master/examples/TodoMVC/app.js

[13] миксин : https://learn.javascript.ru/mixins

[14] redux-store-mixin: https://github.com/kolesoffac/redux-store-mixin

[15] Vue-Redux-Mixin-Generator: https://github.com/seanpar203/Vue-Redux-Mixin-Generator

[16] vue-redux-mixin: https://github.com/exah/vue-redux-mixin

[17] Источник: https://habrahabr.ru/post/336352/