gpt4 book ai didi

vuejs2 - Vuex - 'do not mutate vuex store state outside mutation handlers'

转载 作者:行者123 更新时间:2023-12-03 15:56:23 27 4
gpt4 key购买 nike

我正在尝试从 Firestore 初始化我的 Vuex 商店。最后一行代码 context.commit('SET_ACTIVITIES', acts) 是产生错误的原因。我不认为我在直接改变状态,因为我正在使用一个 Action 。我可能会错过什么?

这是我的 Vuex 商店:

export default new Vuex.Store({
strict: true,
state: {
activities: []
},
mutations: {
SET_ACTIVITIES: (state, activities) => {
state.activities = activities
},
},

actions: {
fetchActivities: context => {
let acts = []
let ref = db.collection('activities')
ref.onSnapshot(snapshot => {
snapshot.docChanges().forEach(change => {
if(change.type == 'added') {
acts.push({
id: change.doc.id,
name: change.doc.data().name,
day: change.doc.data().day
})
}
})
})
context.commit('SET_ACTIVITIES', acts)
}
}

此外,它给我的错误等于 Firestore 中的项目数。如果我只做一次提交,为什么会这样做?

控制台:

[Vue warn]: Error in callback for watcher "function () { return this._data.$$state }": "Error: [vuex] do not mutate vuex store state outside mutation handlers."




Error: [vuex] do not mutate vuex store state outside mutation handlers.
at assert (vuex.esm.js?2f62:87)
at Vue.store._vm.$watch.deep (vuex.esm.js?2f62:763)
at Watcher.run (vue.runtime.esm.js?2b0e:4562)
at Watcher.update (vue.runtime.esm.js?2b0e:4536)
at Dep.notify (vue.runtime.esm.js?2b0e:730)
at Array.mutator (vue.runtime.esm.js?2b0e:882)
at eval (store.js?c0d6:36)
at eval (index.cjs.js?e89a:21411)
at eval (index.cjs.js?e89a:4904)
at LLRBNode.inorderTraversal (index.cjs.js?e89a:1899)

最佳答案

您遇到了对象引用和异步方法的问题。

CollectionReference#onSnapshot() 是异步的,在 QuerySnapshot 上触发快照监听器/观察器事件。

基本上你的代码中发生的事情是你分配了空数组 actsstate.activities (相同的对象引用)在您的突变中,然后在稍后的快照事件处理程序中,直接将元素插入其中。

一个快速的解决方案是在 onSnapshot 中提交突变。观察者

fetchActivities: context => {
let ref = db.collection('activities')
ref.onSnapshot(snapshot => {
let acts = []
snapshot.docChanges().forEach(change => {
if(change.type == 'added') {
acts.push({
id: change.doc.id,
name: change.doc.data().name,
day: change.doc.data().day
})
}
})
context.commit('SET_ACTIVITIES', acts)
})
}

如果您只想对集合数据进行初始获取,请使用 CollectionReference#get() 反而。鉴于它返回一个 promise ,您可以使用它来执行您的操作 composable

async fetchActivities ({ commit }) {
let snapshot = await db.collection('activities').get()
let acts = snapshot.docChanges().filter(({ type }) => type === 'added')
.map(({ doc }) => ({
id: doc.id,
name: doc.data().name,
day: doc.data().day
}))
commit('SET_ACTIVITIES', acts)
}

关于vuejs2 - Vuex - 'do not mutate vuex store state outside mutation handlers',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56013298/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com