Как удалить прослушиватель моментальных снимков Firestore из хранилища Vuex

Я пытаюсь понять, как удалить прослушиватель снимков из моего хранилища vue3 / vuex. Я видел ответы на другие похожие вопросы и множество ссылок на документы Firestore, но я не могу понять, ГДЕ в магазине vuex, чтобы вызвать функцию unsubscribe (). Может ли кто-нибудь помочь с тем, где и как вызвать функцию unsubscribe () при использовании vuex?

У меня есть компонент, который вызывает функцию bindAccts () в магазине, которая затем выполняет фиксацию / мутацию и заполняет состояние моих учетных записей. Вот код, который у меня есть в моем файле магазина vuex:

import { createStore } from 'vuex'
import { db } from '../main'

export default createStore({
  state() {
    return { categories: [], accounts: [], transactions: [], count: 1 }
  },
  mutations: {
    SET_ACCTS(state, data) {
      state.accounts = data
    },

  },
  actions: {
    bindAccts({ commit }) {
      this.unsubscribe = db
        .collection('accounts')
        .onSnapshot(function(querySnapshot) {
          let accounts = []
          querySnapshot.forEach(function(doc) {
            accounts.push(doc.data())
          })
          commit('SET_ACCTS', accounts)
        })
    },
...

Внутри моего тестового компонента я вызываю bindAccts () вот так и просто быстро отображаю состояние учетных записей в пользовательском интерфейсе:

<template>
  <button @click="bindAccts">Subscribe</button>
  <button @click="unsubscribe">Unsubscribe</button>
  <p>Accounts: {{ accounts }}</p>
</template>

<script>
import { mapActions, mapState } from 'vuex'
export default {
  components: {},

  data() {
    return {}
  },

  computed: {
    ...mapState({ accounts: state => state.accounts })
  },

  methods: {
    ...mapActions(['bindAccts', 'unsubscribe'])
  }
}
</script>

<style></style>

При этом я не могу найти функцию отказа от подписки.


person Soundpeck    schedule 03.01.2021    source источник


Ответы (1)


Есть два возможных решения:

Вернуть unsubscribe функцию из действия и вызвать компонент

  1. В действии Vuex верните unsubscribe из bindAccts({ commit }).
  2. В вашем компоненте для функции обработчика onClick кнопки подписки (новой) вы вызываете bindAccts и сохраняете возвращенную функцию в локальной data или переменной.
  3. Затем, когда пользователь нажимает кнопку «Отменить подписку», вы вызываете локальный сохраненный unsubscribe, если он определен.

Or

Сохраните unsubscribe в своем магазине Vuex

  1. Идея состоит в том, чтобы сохранить переменную unsubscribe в вашем существующем хранилище Vuex в качестве переменной состояния и использовать Getters и Mutations для получения / установки переменной (так же, как другие свойства в вашем текущем состоянии).
  2. Затем вы можете добавить unsubscribe в качестве другого действия Vuex, а в своем компоненте использовать mapActions для сопоставления действия как метода. Логика была бы довольно простой.
person マークさん    schedule 03.01.2021
comment
Спасибо за предложение, но я столкнулся с ошибкой при попытке реализовать ваше первое решение. Я возвращаю результат вызова bindAccts () и заполняю отказ от подписки под своими локальными данными. Vue devtools показывает, что он заполнен как Promise. Затем я пытаюсь вызвать функцию отмены подписки с помощью кнопки и получить ответ Uncaught TypeError: $ data.unsubscribe.apply не является функцией. Думаю, я становлюсь все ближе, и мне нравится предложенная вами логика, но мне все еще нужно решить, как успешно справиться с вызовом отказа от подписки. - person Soundpeck; 03.01.2021
comment
@Soundpeck Согласно firebase.google.com/docs/firestore/query- data / Я думаю, unsubscribe должно быть не обещанием, а функцией? В любом случае, если вы уверены, что возвращаете unsubscribe и это обещание, вы можете попробовать async/await синтаксис. - person マークさん; 04.01.2021
comment
Другое дело, что вы можете использовать отладчик Vue или консоль, чтобы распечатать $data.unsubscribe в локальном состоянии вашего компонента, чтобы убедиться, что ничего неожиданного не происходит. - person マークさん; 04.01.2021
comment
Спасибо за помощь! Мне пришлось изменить еще несколько вещей, но это определенно направило меня в правильном направлении. - person Soundpeck; 15.01.2021