Vuex状态通过操作进行更新,但是计算出的属性没有响应

时间:2019-02-18 23:46:22

标签: vue.js vuejs2 vuex

我正在尝试从Firebase获取一些数据。我有一个store.js,并导入了main.js。因此,问题是,页面加载后数据没有正确打印出来。但是,console.log中的突变显示数据已正确提取。我猜问题是,该操作能够获取数据并更新状态,但是,在更改计算属性之前呈现页面吗?我注意到的另一件事是,每当我编辑某些内容并将其保存在vscode中时,内容就会突然显示出来,但是如果刷新页面,该内容就会消失。我认为这也意味着确实提取了数据,但是没有显示出来。想知道是否有人可以提供帮助。真的很感激。

// store.js

mport Vue from 'Vue'
import Vuex from 'vuex'
import globalAxios from 'axios'

Vue.use(Vuex)

export default new Vuex.Store({
  state: {
    dietRecords: {
      breakfest: {},
      lunch: {},
      dinner: {},
      snacks: {}
    }
  },
  mutations: {
    setDietRecords (state, data) {
      state.dietRecords = data
      console.log(state.dietRecords) // this print out correct data
    }
  },
actions: {
    fetchData ({commit, state}) {
      globalAxios.get('my_data.json')
      .then(res => {
        const data = res.data;
        const resultArray = {
          breakfest: {},
          lunch: {},
          dinner: {},
          snacks: {}
        };
        for (let key in data) {
          resultArray[data[key].meal_type][key] = data[key]
        };
        commit('setDietRecords', resultArray)
      })
    }
  },
  getters: {
    dietRecords (state) {
      return state.dietRecords
    }
  }
})

//myapp.vue
import { mapState } from 'vuex';
import axios from 'axios';
import EditRecord from "./editRecord.vue"

export default {
  data: function() {
    return {
      addRecord: {
        breakfest: false,
        lunch: false,
        dinner: false,
        snacks: false
      }
    }
  },
  computed: {
    diet () {
        return this.$store.getters.dietRecords
    }
  },
  methods: {
    fetchData() {
      this.$store.dispatch('fetchDietRecords')
      console.log(this.diet)
    }
  },
  created() {
    this.$store.dispatch('fetchDietRecords')
  }
}

2 个答案:

答案 0 :(得分:0)

首先,您正在调用fetchDietRecords操作,但它的名称是fetchData。 第二,您的fetchData方法是异步的,这意味着可能需要1秒钟才能进行axios调用,但是console.log会立即被调用。解决方案是从axios调用返回promise,然后在返回的promise上调用或使用async await。

return globalAxios.get('my_data.json') // in your action

第一个:

this.$store.dispatch('fetchDietRecords').then(() => {
    console.log(this.diet)
})

第二个:

created() {
    this.foo()
},
methods: {
   async foo() {
     await this.$store.dispatch('fetchDietRecords')
     console.log(this.diet)
    }
}

希望这会有所帮助

答案 1 :(得分:0)

虽然已经有一段时间了,但是我实际上是自己解决的。所以原因是我应该从“ vue”而不是“ Vue”导入Vue。经过大量工作后,这是一个很小的错误。希望这对其他人有帮助...请先检查您的包裹名称!