【问题标题】:Vuex race conditionVuex 竞争条件
【发布时间】:2018-10-08 10:52:54
【问题描述】:

这里是 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),
});

getter 是这样的:

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 中获取项目,如果它还没有,但我真的不明白这一点,因为我最终会拥有所有这些。

我需要在这里做什么?

【问题讨论】:

  • 检查项目是否未定义,如果是,则显示加载屏幕直到它被定义
  • vuex.state 在重新加载时被清除。检查Vuex state on page refresh;如果用户重新加载,通常我所做的是重定向到登录/主页视图。但如果你不这样做,请查看上述 URL 的答案。

标签: javascript vue.js vuejs2 vuex


【解决方案1】:

问题是计算属性在组件生命周期的早期就被评估。

如果您知道该项目最终(并且很快)会在那里,只需在该项目尚不存在时在计算中返回一个默认值,因此 Vue 有 something 来呈现(甚至如果为空)在第一次执行中:

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

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

【讨论】:

  • 所以这消除了错误,但它不会在刷新时呈现
  • 嗯,我明白了。 Vuex 在页面刷新时确实会重置,因此您确实需要重新获取数据(此答案中提出的更改将允许您无错误地获取它)或者您应该使用持久的 Vuex 存储,将数据保存在浏览器中本地存储或 cookie。
  • 其实这是一个奇怪的问题。 this.id 设置为字符串,但在正常流程发生时设置为数字。
猜你喜欢
  • 2022-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多