Sobes.tech
Middle
112
questionbank

Как организовать взаимодействие с Vuex в приложении на Vue.js?

Ответ от нейросети

sobes.tech AI

Для организации взаимодействия с Vuex в приложении на Vue.js используются следующие основные подходы:

  1. Получение состояния (Getters): Используется для получения производного состояния (computed properties) из состояния хранилища.

    // в компоненте
    import { mapGetters } from 'vuex';
    
    export default {
      computed: {
        // сопоставление геттера хранилища с локальным вычисляемым свойством
        ...mapGetters([
          'doneTodosCount',
          'getTodoById'
        ])
        // или сопоставление с другим именем
        // ...mapGetters({
        //   // сопоставить this.localName к this.$store.getters.getterName
        //   localTodosCount: 'doneTodosCount'
        // })
      },
        methods: {
           // использование геттера с аргументами
           getSpecificTodo(id) {
              return this.getTodoById(id); // Доступ к геттеру как к свойству или методу
           }
        }
    }
    
  2. Получение состояния (State): Прямой доступ к состоянию хранилища.

    // в компоненте
    import { mapState } from 'vuex';
    
    export default {
      computed: {
        // сопоставление свойства состояния хранилища с локальным вычисляемым свойством
        ...mapState([
          'count'
        ])
        // или сопоставление с другим именем
        // ...mapState({
        //   // сопоставить this.localCount к this.$store.state.count
        //   localCount: 'count'
        // })
      }
    }
    
  3. Изменение состояния (Mutations): Единственный способ изменить состояние хранилища. Должны быть синхронными.

    // в компоненте
    import { mapMutations } from 'vuex';
    
    export default {
      methods: {
        // сопоставление мутации хранилища с локальным методом
        ...mapMutations([
          'increment' // сопоставить this.increment() к this.$store.commit('increment')
        ])
        // или сопоставление с другим именем
        // ...mapMutations({
        //   add: 'increment' // сопоставить this.add() к this.$store.commit('increment')
        // })
      },
        // вызов мутации
        someMethod() {
           this.increment(); // Или this.add();
        }
    }
    
  4. Асинхронные операции (Actions): Используются для асинхронных операций и вызова мутаций.

    // в компоненте
    import { mapActions } from 'vuex';
    
    export default {
      methods: {
        // сопоставление действия хранилища с локальным методом
        ...mapActions([
          'incrementAsync' // сопоставить this.incrementAsync() к this.$store.dispatch('incrementAsync')
        ])
        // или сопоставление с другим именем
        // ...mapActions({
        //   addAsync: 'incrementAsync' // сопоставить this.addAsync() к this.$store.dispatch('incrementAsync')
        // })
      },
        // вызов действия
        someMethod() {
            this.incrementAsync(); // Или this.addAsync();
        }
    }
    
  5. Модули (Modules): Разделение хранилища на модули для лучшей организации большого приложения.

    // Пример структуры модулей
    // store/index.js
    import Vue from 'vue';
    import Vuex from 'vuex';
    import moduleA from './modules/moduleA';
    import moduleB from './modules/moduleB';
    
    Vue.use(Vuex);
    
    export default new Vuex.Store({
      modules: {
        a: moduleA,
        b: moduleB
      }
    });
    
    // store/modules/moduleA.js
    const moduleA = {
      namespaced: true, // Включение пространства имен
      state: {
        count: 0
      },
      mutations: {
        increment (state) {
          state.count++;
        }
      },
      actions: {
        incrementIfOdd ({ state, commit }) {
          if ((state.count + 1) % 2 === 0) {
            commit('increment');
          }
        }
      },
      getters: {
        doubleCount (state) {
          return state.count * 2;
        }
      }
    };
    
    export default moduleA;
    

    В компоненте доступ к элементам модуля осуществляется через пространство имен:

    // в компоненте
    import { mapState, mapGetters, mapMutations, mapActions } from 'vuex';
    
    export default {
      computed: {
        ...mapState('a', [ // Доступ к состоянию модуля 'a'
          'count'
        ]),
        ...mapGetters('a', [ // Доступ к геттерам модуля 'a'
          'doubleCount'
        ])
      },
      methods: {
        ...mapMutations('a', [ // Доступ к мутациям модуля 'a'
          'increment'
        ]),
        ...mapActions('a', [ // Доступ к действиям модуля 'a'
          'incrementIfOdd'
        ])
      }
    }