Динамическая загрузка модулей Vuex

Динамическая загрузка модулей Vuex

Vuex – это простое и производительное средство для управления состоянием. Оно упрощает управление крупными приложениями Vue.js, обеспечивает предсказуемость изменения состояния и предоставляет централизованное хранилище данных. Возможно, ранее вы уже слышали о Vuex.

Читайте также: Введение в Vuex: управление состоянием Vue.js

Вы можете определить модули в своем хранилище Vuex следующим образом:

const dogs = {

  state: {

    data: []

  },

  mutations: {

    addDog(state, dog) {

      state.data.push(dog)

    }

  }

}

const store = new Vuex.Store({

  modules: {

    dogs

  }

});

 Большое приложение, как правило, состоит из нескольких модулей. Все они статически определяются в индивидуальных файлах и объединяются при вызове new Vuex.Store – это следует делать практически во всех случаях.

Конечно, бывают исключения. В отдельных ситуациях вам может понадобиться динамически загрузить модуль Vuex в приложение, расширив на этом этапе текущее хранилище.

В каких ситуациях такой функционал может понадобиться? К примеру, если вы пишете внешнюю библиотеку компонентов, которая зависит от Vuex. То же самое может относиться к приложениям, разделенным на несколько внутренних пакетов. Каждый пакет может иметь свои собственные компоненты и хранилища.

Обычно это касается распространенных в приложениях модулей повторного использования. Например, это модуль, отвечающий за отправку уведомлений, или модуль, который расширяет хранилище приложений и добавляет новые модули, доступные в приложении глобально.

Динамическое добавление модуля в хранилище

Давайте представим, что у нас есть приложение с обычной настройкой Vuex, где нам нужно создать папку для уведомлений (предположим, это внешний пакет). Вы можете разместить папку где угодно.

Добавьте в нее файл state.js с базовым модулем Vuex:

export default {

  state: [],

  mutations: {

    addNotification(state, notification) {

      state.push(notification);

    }

  }

};

Затем создайте файл Notifications.vue, в который вы его импортируете. Затем давайте получим доступ к переменной экземпляра $store (предположим, что у нас есть хранилище Vuex для получения состояния и фиксации addNotification):

<template>

  <div>

    <p v-for="notification in notifications">

      {{notification}}

    </p>

    <button @click="addHey">Add Hey!</button>

  </div>

</template>

<script>

import state from "./state";

export default {

  computed: {

    notifications() {

      return this.$store.state.notifications;

    }

  },

  methods: {

    addHey() {

      this.$store.commit("addNotification", "Hey!");

    }

  }

};

</script>

На этом этапе идея состоит вот в чем: модули уведомлений Vuex добавляются, когда используется этот компонент. Таким образом, если внешнее приложение использует этот компонент, все необходимое уже упаковано, и приложению не нужно добавлять его напрямую. Мы могли бы использовать для этого хук created.

Чтобы динамически добавить модуль Vuex, мы можем использовать свойство экземпляра $store.registerModule (в файле notifications/Notifications.vue):

import state from "./state";

export default {

  // ...

  created() {

    this.$store.registerModule("notifications", state);

  }

};

Теперь модуль будет зарегистрирован при использовании компонентов уведомлений.

Заключение

В больших приложениях хранилище Vuex организовано статически с помощью различных модулей. Так и должно быть. Но иногда, в конкретных случаях вам может потребоваться расширить хранилище и динамически добавить модуль.

Найти рабочую демонстрацию и код из этой статьи можно в этой песочнице Codesandbox.

Tags: ,

Добавить комментарий