Vuex比赛状况

时间:2018-04-27 14:52:34

标签: javascript vue.js vuejs2 vuex

新手提问Vuex。可能做错了什么。我有这个简单的商店:

export default new Vuex.Store({
  strict: process.env.NODE_ENV !== 'production',
  state: {
    items: []
  },
  getters: Object.assign({}, itemGetters),
  mutations: Object.assign({}, itemMutations),
  actions: Object.assign({}, itemActions),
});

吸气剂是这样的:

export const itemGetters = {
  allItems: state => state.items,
  itemById: (state, getters) => id => getters.allItems.filter(s => s.id === id)[0],
};

现在,我有这个视图,其中有一个嵌套视图。基本上是每个项目的信息模式。

如果我点击链接,我希望能够看到填充项目的元素模态。

export default {
  name: 'Landing',
  computed: {
    items() {
      return this.$store.getters.allItems;
    }
  },
  created() {
    if (this.items.length === 0) {
      this.$store.dispatch('allItems');
    }
  }
};

现在,进入该视图按预期工作,如果我点击嵌套视图,如下所示:

<template>
  <div class="text">
    <h1 class="heading">{{ item.title }}</h1>
  </div>
</template>
<script>
export default {
  name: 'InfoModal',
  props: ['id'],
  computed: {
    item() {
      return this.$store.getters.itemById(this.id);
    }
  }
};
</script>

它也有效。但是,当我重新加载页面时,它不起作用,而item还没有出现错误。

我可以做同样的事情并添加一个动作来从API获取该项目,如果它还没有,但我真的没有看到这一点,因为我最终将拥有所有这些。

我需要在这做什么?

1 个答案:

答案 0 :(得分:3)

事情是计算属性首先在组件生命周期的早期得到评估。

如果您知道该项目最终(并且很快)存在,只需在项目不存在时返回计算中的默认值,因此Vue有某些进行渲染(甚至如果是空的)在第一次执行中:

  computed: {
    item() {
      return this.$store.getters.itemById(this.id) || {}; // added {} as default.
    }
  }

一旦项目可用,计算将自动重新评估(因为getter会)。