【问题标题】:Load state with async action Vuex使用异步操作 Vuex 加载状态
【发布时间】:2018-10-05 14:27:56
【问题描述】:

我不知道如何让它工作。

我正在尝试在我的 data() 上加载一个属性 (productos),它必须从状态中捕获值。

我的组件:

    data () {
        return {
          productos: this.$store.state.mStock.productos
        }
     },
  created() {
    this.$store.dispatch('fetchProductos')
  }

此时我认为没关系,当我加载我的组件时,我调度我的操作以加载商店中的状态。 我认为问题在于我填充状态的方式是 ASYNC

商店:

import StockService from '@/services/StockService'

export const moduleStock = {
  strict: false,
  state: {
    productos: []
  },
  mutations: {
    setProductos (state, payload) {
      state.productos = payload.productos
    }
  },
  actions: {
    async fetchProductos ({commit}, payload) {
      const resp = await (StockService.getProductos())
      var productos = resp.data
      commit('setProductos', {productos: productos})
    }
  }
}

当我加载我的组件时,data() 上的属性“productos”为空,但是如果我从 Vuex 开发工具中看到“state.productos”,它就有数据!

我搞砸了。

【问题讨论】:

  • productos 用作计算属性,而不是在data() 中。

标签: javascript asynchronous vue.js async-await vuex


【解决方案1】:

data() 方法只运行一次。

如果组件和 vue 存储使用相同的对象实例,这似乎可行,但在这种情况下不起作用,因为在存储中分配了一个新的数组实例,而组件仍然具有前一个实例(空数组)

使用computed properties。我推荐使用mapState() 助手:

computed: mapState({
  productos: state => state.mStock.productos
})

没有 mapState 你会写:

computed: {
  productos() {
    return this.$store.state.mStock.productos
  }
}

【讨论】:

  • 我还应该将代码保留在“created()”中吗?
  • 是的,您只想调用一次fetchProductos,而不是在每次存储更改时调用的计算方法中。
猜你喜欢
  • 2021-08-02
  • 2023-04-04
  • 2019-01-18
  • 2011-07-02
  • 2018-06-03
  • 2016-09-20
  • 2017-12-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多