Несколько компонентов Vue.js в одном магазине Vuex - PullRequest
1 голос
/ 08 октября 2019

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

Ниже приведен нормальный рабочий процесс, который работает нормально.

  1. Компонент 1 - загрузка данных завершена (асинхронно, ожидайте)
  2. Пользователь переходит к Компоненту 2
  3. Данные компонента 1 очищаются в деактивированном событии
  4. Компонент 2 отображается нормально

Теперь, когда пользователь открывает компонент 1 и быстро переходит к компоненту 2.

  1. Компонент 1 - запрос данных инициирован, но данные еще не загружены
  2. Пользователь переходит к компоненту 2
  3. Данные компонента 1 очищаются при деактивированном событии
  4. Асинхронная операция компонента 1 завершена, и данные загружаются в состояние
  5. Компонент 2 отобразит данные, предназначенные для Компонента 1

Ответы [ 2 ]

1 голос
/ 09 октября 2019

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

Views
- View A
- View B
Components
  Common
    - Sidebar (the common sidebar that is loaded in both View A and View B)
  - Some other components specific to view a and b

Если вы намерены продолжить использовать хранилище для локальных данных, я думаю, у вас есть несколько вариантов:

  • Вы можете нажатьВаш загрузчик с URL или именем представления. Если в вашем штате вы обычно просто располагаете данными, теперь у вас есть объект, который отображает маршрут или имя вида на некоторые данные. Затем вы используете метод получения, который автоматически получает правильные данные для вас. Дополнительным преимуществом этого является то, что вы можете оставить свои данные, если хотите, что ускоряет загрузку, когда вы возвращаетесь к этому представлению (вам больше не нужно выполнять вызов API).
  • Вы фиксируете некоторыетокен в хранилище и переопределяет данные в состоянии вашего хранилища только тогда, когда токен совпадает с токеном извлечения. (Например, dispatch('get/my/data', { token: 'asdf' }) при выполнении ранее commit('switch/to/view', 'asdf'). Если представление не соответствует представлению, в котором мы находимся в данный момент, мы просто отбрасываем данные.

В обоих случаях вы бы отправили действие загрузки счто-то вроде dispatch('get/my/data', { view: this.$options.name }) (или: this.$route.path или this.$route.name)

Если вы идете по пути использования имени компонента, вам придется выполнить коммит, как указано выше. В противном случае вы можетепросто импортируйте ваш маршрутизатор с import router from '../router' или чем-то похожим.

Для первого варианта вы получите что-то вроде этого:

импорт маршрутизатора из '../router'; импорт Vue из 'vue';

{
  state: {
    data: {},
  },
  getters: {
    getData (state) {
      return state.data[router.currentRoute.path];
    }
  },
  mutations: {
    setData (state, { view, data }) {
      Vue.$set(state.data, view, data);
    }
  },
  actions: {
    async fetchData ({ commit }, { view }) {
      const data = await myApiPromise;

      commit('setData', { view, data });
    }
  }
}

Теперь getData либо возвращает данные, если вы загрузили данные для этого представления, либо undefined, если вы этого не сделали. Переключение просто захватит ранее сохраненные данные, которые могут или могут бытьполезно для вас.

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

{
  state: {
    data: null,
    view: '',
  },
  getters: {
    getData (state) {
      return state.data[router.currentRoute.path];
    }
  },
  mutations: {
    clearData (state) {
      Vue.$set(state, 'data', null);
    },
    setData (state, { view, data }) {
      if (state.view !== view) {
        // Do not update
        return;
      }

      Vue.$set(state, 'data', data);
    },

    setView (state, { view }) {
      Vue.$set(state, 'view', view);
    }
  },
  actions: {
    async fetchData ({ commit }, { view }) {
      commit('clearData');
      const data = await myApiPromise;

      commit('setData', { view, data });
    }
  }
}
0 голосов
/ 08 октября 2019

Использование разрушенного обратного вызова в жизненном цикле Vue для очистки хранилища при переходе пользователя от компонента 1 к компоненту 2

Источник: https://vuejs.org/v2/api/#destroyed

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...