如何从 Vuex 存储中删除 Firestore 快照侦听器
How do I remove a Firestore snapshot listener from a Vuex store
我想知道如何从我的 vue3/vuex 存储中删除快照监听器。我已经看到了其他类似问题的答案以及指向 Firestore 文档的许多链接,但我无法弄清楚 vuex 商店中的什么地方可以调用 unsubscribe()。有人可以帮助解决在使用 vuex 时在哪里以及如何调用 unsubscribe() 函数吗?
我有一个组件调用商店中的 bindAccts(),然后运行 commit/mutation 并填充我的“帐户状态。这是我的 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() 并且只是 quickly 在 ui:
上显示帐户状态
<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>
这样做我找不到退订功能。
有两种可能的解决方案:
Return unsubscribe
从 action 调用组件
- 在您的 Vuex 操作中,return 来自
bindAccts({ commit })
的 unsubscribe
。
- 在您的组件中,对于订阅按钮
onClick
处理函数(一个新函数),您调用 bindAccts
并将 returned 函数存储在本地 data
或一个变量。
- 然后,当用户点击退订时,你调用本地存储的
unsubscribe
如果定义。
或者
在您的 Vuex 商店中保存 unsubscribe
- 想法是将
unsubscribe
变量保存在现有 Vuex 存储中作为状态变量,并使用 Getters
和 Mutations
到 get/set 变量(相同与您当前状态下的其他属性一样)。
- 然后,您可以添加
unsubscribe
作为另一个 Vuex 操作,并在您的组件中使用 mapActions
将操作映射为方法。逻辑会很简单。
我想知道如何从我的 vue3/vuex 存储中删除快照监听器。我已经看到了其他类似问题的答案以及指向 Firestore 文档的许多链接,但我无法弄清楚 vuex 商店中的什么地方可以调用 unsubscribe()。有人可以帮助解决在使用 vuex 时在哪里以及如何调用 unsubscribe() 函数吗?
我有一个组件调用商店中的 bindAccts(),然后运行 commit/mutation 并填充我的“帐户状态。这是我的 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() 并且只是 quickly 在 ui:
上显示帐户状态<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>
这样做我找不到退订功能。
有两种可能的解决方案:
Return unsubscribe
从 action 调用组件
- 在您的 Vuex 操作中,return 来自
bindAccts({ commit })
的unsubscribe
。 - 在您的组件中,对于订阅按钮
onClick
处理函数(一个新函数),您调用bindAccts
并将 returned 函数存储在本地data
或一个变量。 - 然后,当用户点击退订时,你调用本地存储的
unsubscribe
如果定义。
或者
在您的 Vuex 商店中保存 unsubscribe
- 想法是将
unsubscribe
变量保存在现有 Vuex 存储中作为状态变量,并使用Getters
和Mutations
到 get/set 变量(相同与您当前状态下的其他属性一样)。 - 然后,您可以添加
unsubscribe
作为另一个 Vuex 操作,并在您的组件中使用mapActions
将操作映射为方法。逻辑会很简单。