vuex


Как менять состояние из компонента. Так делать не стоит но все же можно:

this.$store.state.user.info.new_messages_count++
# получение данных геттера
const data = this.$store.getters['data/data'](this.$route.query.name)

 

 

Освоение Vuex — с нуля до героя               пересказ статьи


Vuex можно рассматривать как единственный источник истины для всего приложения.

export default {
  state,  // JSON-объект
  getters, // Функции(state) будут возвращать данные из хранилища компонентам
//МУТАЦИИ СИНХРОННЫ  у них одна задача - изменить state
  mutations, // Функции(state, JSON-объект). Вызов this.$store.commit('SET_NAME', your_name); 
//Действия делают две задачи: обращаются к АПИ и потом вызывают мутации
  actions, // Функции(state, JSON-объект). Вызов this.$store.dispatch('SET_NAME', your_name);
};

ВОЗЬМИТЕ ЗА ПРАКТИКУ НИКОГДА НЕ ИНИЦИИРОВАТЬ МУТАЦИИ НАПРЯМУЮ. ДЛЯ ЭТОГО ВСЕГДА ИСПОЛЬЗУЙТЕ ДЕЙСТВИЯ.

 Пример :

mutations: {
  SET_NAME: (state, name) => {
    state.name = name;
  },
},

actions: {
  SET_NAME: async (context, name) => {
    let {data} = await Axios.post('http://myapiendpoint.com/api/name', {name: name});

    if (data.status == 200) {
      context.commit('SET_NAME', name);
    }
  },
}

 

ХРАНИЛИЩЕ VUEX НЕ ПРОСТО ИСТОЧНИК ТЕКУЩЕГО СОСТОЯНИЯ ВАШЕГО ПРИЛОЖЕНИЯ. ОНО ТАКЖЕ ЯВЛЯЕТСЯ ЕДИНСТВЕННОЙ ТОЧКОЙ, КОТОРАЯ ДОЛЖНА ИЗМЕНЯТЬ ЭТО СОСТОЯНИЕ.

 

store/index.js

import Vue from 'vue';
import Vuex from 'vuex';
import Axios from 'axios';
import todos from './modules/todos';

Vue.use(Vuex);

export const store = new Vuex.Store({
  state: {},
  getters: {},
  mutations: {},
  actions: {},
  modules: {
    todos,
  },
});

/modules/todos.js

import Axios from 'axios';

state = {
  todos: null,
};

getters = {
  TODOS: state => {
    return state.todos;
  },
};

mutations = {
  SET_TODO: (state, payload) => {
    state.todos = payload;
  },

  ADD_TODO: (state, payload) => {
    state.todos.push(payload);
  },
};

actions = {
  GET_TODO: async (context, payload) => {
    let {data} = await Axios.get('http://yourwebsite.com/api/todo');
    context.commit('SET_TODO', data);
  },

  SAVE_TODO: async (context, payload) => {
    let {data} = await Axios.post('http://yourwebsite.com/api/todo');
    context.commit('ADD_TODO', payload);
  },
};

export default {
  state,
  getters,
  mutations,
  actions,
};