【问题标题】:Middleware to Vuex state not updating state?Vuex状态的中间件不更新状态?
【发布时间】:2019-10-15 07:56:33
【问题描述】:

我正在尝试获取要存储在我所在州的 Firestore 数据,但它没有显示在我所在州的 Vue 开发工具中。

当我 console.log() 通过 store 操作获得的数据时,我可以看到我获得了正确的数据,但它不会更新状态。

我在主页和另一个页面上使用中间件来调度我的操作以获取所需的数据。

我还在下面的中间件中使用了条件语句来尝试仅在我的其他状态变量不为空时调度操作,因为 firestore 查询需要 state.user

//this is check-auth middleware
 export default function(context) {
 // in initAuth we are forwarding it the req
  context.store.dispatch('initAuth', context.req)
  console.log('WE ARE GRABBING USER INFO')
  context.store.dispatch('grabUserInfo', context.req)
  console.log('There is already user info there')
  // context.store.dispatch('currentUser')
   }

我们正在调度 grabUserInfo 以运行其中包含 firestore 查询的操作。

  grabUserInfo(vuexContext, context) {
     let userInfo = []
     var userRef = db.collection('users')
      var query = userRef
        .where('user_id', '==', vuexContext.state.user)
        .get()
        .then(querySnapshot => {
          querySnapshot.forEach(doc => {
          console.log(doc.data())
          userInfo.push(doc.data())
          })
        })
      vuexContext.commit('setUserInfoSub', userInfo)
    }

我的

   console.log(doc.data()) is showing 

订阅者:["noFace2"] 订阅:[“noFace3”] user_id:“VbomJvANYDNe3Bek0suySs1L8oy1” 用户名:“noFace1”

我的信息应该经过突变并提交到状态,但它没有显示在我的状态 vue 开发工具中。

 setUserInfoSub(state, payload) {
    state.userInfoSub = payload
  }

我不明白数据为什么没有在我的状态下结束。这是我的状态和突变。

  const createStore = () => {
   return new Vuex.Store({
    state: {
     loadedCards: [],
     user: null,
     username: null,
     userInfoSub: [],
     token: null
   },
    mutations: {
    setCards(state, cards) {
    state.loadedCards = cards
    },
    setUser(state, payload) {
    state.user = payload
    },
     setUsername(state, payload) {
     state.username = payload
    },
    setUserInfoSub(state, payload) {
    state.userInfoSub = payload
    },
    setToken(state, token) {
    state.token = token
  }

【问题讨论】:

  • 你不能直接从一个动作改变状态,你需要一个突变。使用该操作提交突变,然后更新状态。对于从操作返回的两个参数,突变将采用 state 和您的用户数据作为 payload。 Vuex 文档很好地展示了这一点。
  • 我的突变代码就在问题中......它是 setUserInfoSub 并且在长代码片段的底部我提交了这个突变
  • 你能把你的状态的结构贴出来吗?
  • 好的,这是我的状态和突变,我的动作是第二段代码
  • 很好,所以我认为问题在于您正在尝试交换数组对象,而不是将信息推送到已经处于状态的数组中。在尝试将状态变量设置为它之前,您是否检查过 typeof(payload) ?这将是首先要做的事情,以确保它确实是一个数组。无论哪种方式,我认为最好将 info 对象推送到状态数组中,而不是覆盖状态变量。

标签: javascript firebase vue.js google-cloud-firestore vuex


【解决方案1】:

将您的突变更改为:

 setUserInfoSub(state, payload) {
    Vue.set(state, 'userInfoSub', payload);
    }

这将允许 Vue 的反应系统重新启动状态变量重新分配。

根据 @Alexander 的评论,鉴于 Firebase 查询的异步性质,您还应该将 commit() 移动到 then() 中。

【讨论】:

  • 谢谢!
  • 鉴于 Firebase 查询的异步性质,您应该更新此答案,使其还包括将 commit() 移动到 then() 内的关键部分。
  • 添加了详细信息
  • 嗨@LenJoseph,当我将突变更改为 Vue.set() 时,我得到 Vue 未定义...从“vue”导入 Vue 也不起作用
猜你喜欢
  • 2021-06-19
  • 2023-03-16
  • 2020-12-22
  • 2020-11-23
  • 2017-05-20
  • 1970-01-01
  • 2020-05-18
  • 2019-08-08
  • 1970-01-01
相关资源
最近更新 更多