javascript - Vuex 计算属性仅在路由更改然后更改回来时更新

标签 javascript vue.js vuejs2 vue-router vuex

在我的应用程序的 main.js 中,我发送了一个操作,从我的 API 中获取公司并选择第一个。这个 Action 每次都派发,这里似乎没有失败。

new Vue({
  el: '#app',
  store,
  router,
  render: h => h(App),
  created: function () {
    this.$store.dispatch('getCompaniesAndSelectFirst');
  }
})

在另一个 View 中,我需要检索属于所选公司的事件,因此我使用 vue-resource 在挂载时执行此操作。

mounted: function () {
  if (this.selectedCompanyId) {
    this.$http.get('Campaigns', {params: {companyId: this.selectedCompanyId}}).then(response => {
      // success callback
      this.numbersTableData = response.body;
    }, response => {
      // error callback
    });
  }
}

selectedCompanyId 是我的计算属性,它返回 Vuex 中所选公司的 ID。

selectedCompanyId: function () {
  return this.$store.getters.selectedCompanyId;
}

问题是如果这是加载的第一个 View ,此时 selectedCompanyId 是未定义的。

如果我刷新页面 selectedCompanyId 仍然未定义,我的获取请求失败。

如果我在此 View 上打开应用程序,selectedCompanyId 未定义且获取请求失败,但如果我路由到另一个 View 然后路由返回 selectedCompanyId 已加载请求成功。

如果我在另一个 View 上打开应用程序,然后路由到 View selectedCompanyId 已定义并且 get 请求成功。

据我了解,这是因为我获取公司并选择第一个公司的获取请求需要时间才能完成。

我该如何解决这个问题?有没有更好的方法来完成我想做的事情?

最佳答案

我停止在 Vue 实例的 created 函数中调度 getCompaniesAndSelectFirst 操作。

我修改了 getCompaniesAndSelectFirst 操作以返回 promise :

export const getCompaniesAndSelectFirst = ({ commit, state }) => {
  return Vue.http.get('Companies').then(response => {
    // get body data
    var companies = response.body;

    commit('getCompanies', companies);
    commit('selectCompany', companies[0].Id);
  }, response => {
    // error callback
  });
}

我创建了一个导航守卫,如果状态不包含 selectedCompanyId 的真实值,它会调度操作,并且只有在从操作返回的 promise 得到解决后才继续路由。

关于javascript - Vuex 计算属性仅在路由更改然后更改回来时更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47985144/

相关文章:

laravel - 在<a>标签的href中编写VueJS数据绑定(bind)表达式

javascript - vuex 注册模块中的未知突变类型

javascript - 如何在 iFrame body 标记上设置 jQuery data() 并从 iFrame 内部检索它?

javascript - 使用 v-for 数据作为对象的 v-model 值

javascript - 在 Vuetify 中折叠展开的 v-data-table 时触发方法

javascript - 在 VueJS 中使用 prop 值作为变量

Vue.js:有没有办法知道组件实例何时挂载?

javascript - Web 组件 :host:hover

javascript - 即使在clearRect()之后, Canvas 内的文本仍然存在

javascript - 在 DOM 中显示视频文件第一帧的最快方法?