Итак, мы начали с шаблона в статье Давайте построим приложение vue. Затем мы добавили несколько маршрутов в Давайте направим приложение vue. Теперь нам нужно сохранить некоторые данные в приложении, мы используем vuex для их хранения. Давай проверим.

Сначала нам нужно добавить vuex в наше приложение.

npm install vuex

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

const state = {};

Просто объект

Круто, объект. С его помощью мы можем добавлять данные и получать данные в каждый компонент vue, который мы создаем. И если мы сделаем что-то в одном компоненте, мы можем автоматически получать данные из каждого компонента, который мы используем. Это может быть полезно, и до этого дойдет.

Давайте создадим магазин по-настоящему.

import Vue from 'vue';
import Vuex from 'vuex';
// import people from '@/modules/people/store';
Vue.use(Vuex);
export default new Vuex.Store({
  modules: {
    // people,
  },
  state: {
    count: 0,
  },
  mutations: {
    updateCount(state, payload) {
      Vue.set(state, 'count', state.count + payload);
    },
  },
  getters: {
    getCount: state => state.count,
  },
  actions: {
    incrementCount(context) {
      context.commit('updateCount', 1);
    },
    decrementCount(context) {
      context.commit('updateCount', -1);
    },
  },
});

Базовый магазин

В магазине у нас есть пара ключевых ценностей.

  • государство
  • мутации
  • добытчики
  • действия

Состояние - это тупой объект, о котором мы говорили ранее. Это ваше состояние вашего приложения. Все данные здесь. Мутации - это место, где вы ... мутируете свое состояние. Я люблю вызывать их только по действиям, чтобы все было проще. Действия - это место, которое вы используете в компонентах vue для запуска фактических мутаций. У нас есть несколько геттеров, это место, где ваш компонент получает фактические данные о состоянии.

Итак, в магазине у нас есть два действия: увеличение и уменьшение счетчика. У нас также есть один геттер, получаем счет. Давайте сопоставим их с компонентом.

<template>
    <div class="py-3">
        <h3>{{ count }}</h3>
        <button @click="decrementCount()" class="btn btn-outline-primary">subtract one</button>
        <button @click="incrementCount()" class="btn btn-outline-primary">add one</button>
    </div>
</template>

<script>
  export default {
    name: 'the-counter',
    computed: {
      count() {
        return this.$store.getters.getCount;
      },
    },
    methods: {
      incrementCount() {
        this.$store.dispatch('incrementCount');
      },
      decrementCount() {
        this.$store.dispatch('decrementCount');
      },
    },
  };
</script>

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

Модули

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

Почему все папки?

В последнем выпуске Let's vue я написал, что у меня вопрос, почему все папки в вашем приложении. Посмотрим, что я там делал.

src/modules/people/router/
src/modules/people/store/
src/modules/people/views/
src/router/
src/store/
src/views/

Ух ты, такая папка. Теперь мы собираемся разместить некоторые из них в папках с людьми. Я использую папку views в модуле de people для базовых базовых представлений создания, чтения, обновления и удаления (crud). В маршрутизаторе мы маршрутизируем их для этого модуля. А в магазине мы добавляем состояние только для людей. Таким образом, данные о людях находятся в модуле «Люди», и если нам нужны данные о людях, мы знаем, где их искать.

В папку store мы добавляем пару файлов, мне нравится разбивать действия состояний по файлам.

actions.js
getters.js
index.js
mutations.js

Опять известные имена. Отсутствует только одно состояние. Я добавляю его в index.js, чтобы мы могли легко импортировать магазин, позвольте мне показать вам.

import actions from './actions';
import getters from './getters';
import mutations from './mutations';

export default {
  namespaced: true,
  state: {
    items: [
      {
        id: '8d77b83a-c28e-430f-9177-8b443975d210',
        name: 'Charles C. Swain',
        phone: '615-233-5488',
        function: 'Director of photography',
        image: 'static/male.svg',
      },
      ...
    ],
  },
  actions,
  getters,
  mutations,
};

Состояние людей здесь, просто список предметов. В него добавлены действия, геттеры и мутации, теперь я могу просто иметь их в отдельных файлах. Опять же читабельность. Просто держите файлы небольшого размера, чтобы мы могли быстро найти то, что мы можем, хотим и будем делать.

Действия над персональным модулем

В этом примере я просто добавляю тайм-аут ко всем действиям, чтобы имитировать реальный мир. Позже я также добавлю реальный пример.

export default {
  addPerson(state, person) {
    setTimeout(() => state.commit('personIsAdded', { person }), 500);
  },
  patchPerson(state, person) {
    setTimeout(() => state.commit('personIsPatched', { person }), 500);
  },
  removePerson(state, personId) {
    setTimeout(() => state.commit('personIsRemoved', { personId }), 500);
  },
};

Добавить, исправить и удалить. Основные действия отдыха для человека. Допустим, мы используем axios для управления http-вызовами для них, и когда вызов возвращается, он возвращает данные о человеке в формате json, и наше состояние может это использовать.

addPerson(state, person) {
  return axios.post(url, { person })
    .then((response) => {
      state.commit('personIsAdded', { person: response.data });
      return result;
    })
    .catch((error) => {
      Promise.reject(new Error('User creation failed '.error.message));
    });
},

Это также быстрый пример действия create. Вы также можете использовать обещание return для использования в своем методе для перенаправления после создания. Но объяснить это несколько сложнее.

Мутировать человека

Круто, у нас есть действия. Мы можем сказать, что хотим действовать в соответствии с ними. Давайте обновим состояние в вашем магазине.

import Vue from 'vue';

export default {
  personIsAdded(state, payload) {
    state.items.push(payload.person);
  },
  personIsPatched(state, payload) {
    const { person } = payload;
    const items = state.items.map(item => (item.id === person.id ? person : item));
    Vue.set(state, 'items', items);
  },
  personIsRemoved(state, payload) {
    const items = state.items.filter(item => item.id !== payload.personId);
    Vue.set(state, 'items', items);
  },
};

Добавил, пропатчил, удалил. Готово. Теперь нам нужно вернуть

Получатели состояния

export default {
  getItems: state => state.items,
  getItem: state => payload => Object.assign({}, state.items.find(item => item.id === payload.id)),
};

Просто получите список или выберите человека из списка. Теперь мы можем сопоставить их с компонентами, которые хотим использовать в приложении. Поскольку у нас есть все действия по управлению состоянием в магазине, в компоненте vue выполняется минимальное количество вызовов. Это сценарий обзора лиц в приложении. Это весь сценарий, который там есть.

export default {
  name: 'people',
  computed: {
    items() {
      return this.$store.getters['people/getItems'];
    },
  },
};

Просто некоторые предметы. Больше нет, но нам нужно больше. Если мы мутируем данные, они будут видоизменены, и vue отобразит здесь состояние при мутации. В этом компоненте я просто визуализирую список людей, ссылающихся на их страницу с подробностями.

<router-link :to="{name: 'people-details', params: { id: item.id }}" v-for="item in items" key="item.id">
  {{ item.name }}
</router-link>

Давайте проверим это в Интернете!

Вы можете проверить просмотры модуля Мои люди на github, если хотите прочитать больше кода, или посмотрите пример на моей демонстрационной странице.

В следующий раз пока не знаю. Чтобы не связывать людей с сообщениями. И если у вас есть вопросы или вы хотите, чтобы моя следующая история что-то объясняла, дайте мне знать!

Фото Кларка Янга на Unsplash