存储在 vuex axios 响应中无法正常工作

Posted

技术标签:

【中文标题】存储在 vuex axios 响应中无法正常工作【英文标题】:Storage not working properly in vuex axios response 【发布时间】:2019-04-03 10:11:45 【问题描述】:

每当我使用 axios 响应将数据发送到 vuex 存储时,例如。

** Sidebar.vue **
  created()
    this.getRoles();
  ,
  methods: 
    getRoles()
      var _this = this
      var roles = null
      this.$http.get('/api/userroles/userroles').then(function(response)
        // Passing data to vuex within response
        _this.$store.dispatch('setUserRoles', response.data.data)
      
    
    check_role()

    
  

当我像 console.log(this.$store.state.userStore.roles) 这样在侧边栏中进行控制台时它具有价值,但是当我在仪表板中控制台时它返回 null 并且当我看到 vuex chrome 扩展它包含值(下图),但在仪表板中它返回 null

eg in dashboard 

** dashboard.vue **
created()
  console.log(this.$store.state.userStore.roles)
  // null
,

现在,当我在 axios 响应之外分派到 vuex 时,它可以完美运行并在仪表板中提供价值,但它会抛出错误,例如 Error: [vuex] Do not mutate vuex store state outside mutation handlers。例如。

created()
  this.getRoles();
,
methods: 
  getRoles()
    var _this = this
    var roles = null
    this.$http.get('/api/userroles/userroles').then(function(response)
      _this.roles_data = response.data.data
    
    _this.$store.dispatch('setUserRoles', _this.roles_data)
  

例如在仪表板中,如果我在 axios 之外使用调度,它会提供价值

** dashboard.vue **
created()
  console.log(this.$store.state.userStore.roles)
  // (25) […, …, …, __ob__: Observer]
,

我错过了什么吗???

【问题讨论】:

【参考方案1】:

试试这个:

created () 
  this.getRoles()
,

methods: 
  getRoles () 
    this.$http
      .get('/api/userroles/userroles')
      .then((data: data) => 
        this.$store.dispatch('setUserRoles', data)
      )
  

并且不要尝试在 created 方法中控制台角色。因为它不能工作,axios是异步的,你会在数据到达之前控制台状态。如果,也可以在 axios 回调中对其进行控制台:

created () 
  this.getRoles()
,

methods: 
  getRoles () 
    this.$http
      .get('/api/userroles/userroles')
      .then((data: data) => 
        this.$store.dispatch('setUserRoles', data)
        // here, not in created method
        console.log(this.$store.state.userStore.roles)
      )
  

【讨论】:

我仍然在dashboard.vue中得到空值 并且axios回调中的console.log按预期工作? 是的。它显示了结果。当我在 vmodel 中传递响应然后将 vmodel 分派到 vuex 时,它不起作用。但是当我在 axios 外部传入一个变量时,它可以正常工作,但会抛出类似 "Error: [vuex] Do not mutate vuex store state outside mutation handlers." 之类的错误。 然后,一切都按预期进行。您无法在 created 方法中控制 dashboard.vue 中的这些值。 那么我怎样才能在仪表板中获得角色访问权限。我不想每次页面加载时都触发 api。【参考方案2】:

您正在尝试在调用 api 之前控制 store.state.userStore.roles。避免在 created() 中访问存储值

【讨论】:

以上是关于存储在 vuex axios 响应中无法正常工作的主要内容,如果未能解决你的问题,请参考以下文章

使用 axios 响应中的操作改变 vuex 存储状态 - 提交不起作用

Vuex axios调用无法处理422响应

无法在 Axios 拦截器中获取 Vuex 存储

Axios 拦截器 - 如何从 vuex 商店返回响应

Vuex:Axios GET 请求在组件内部返回未定义

vuex应用状态管理和axios网络请求响应