vuex中能否在getter方法中异步调用Axios取值?

先说一下我对vuex的理解吧,我认为应该把多个页面或组件都会用到的数据放到vuex中,避免每个页面都去加载接口数据,特别是一些字典表配置等,很少变化的内容,我的理解对吗?
假如有多个页面需要用到同一组数据,这组数据来自后台接口,需要用axios获取,那么vuex里要求显式的调用commit执行设值方法,我应该在每个页面都调用一个取值的异步Action吗?这样的话,其实每个页面都去调用接口,等于没有使用Vuex啊?
我希望这样,在vuex中设置state,设置action调用axios取值并调用mutaction赋给state,而在多个用到数据的页面,直接用getter方法取值,在这个getter方法中,先判断该数据是否为空,为空则调用actions取值赋值,state有了值再返回给调用的页面,即类似于缓存的用法,有则直接返回,无则先获取再返回,这个怎么实现呢?getter方法似乎都是直接返回值,如果其中还要处理异步,可以实现吗?

阅读 9.5k
3 个回答

最好不要在Getters里面处理异步请求,异步请求请放在actions里面,Getters你可以理解为vue的computed计算属性,是会有缓存的。
你可以考虑用watch方法

通过使用getter返回一个函数传参形式可以解决问题, 返回函数主要目的是为了实现懒加载,因为getter函数在vuex初始化时一定会执行,所以就不可避免的发送了请求,因此需要返回一个函数,在页面真正使用的时候调用这个函数实现懒加载,在请求响应后由于state被改变,getter重新计算返回一个新函数,从而触发业务页面内getter重新计算结果,间接触发视图更新,视图更新又会调用getter函数得到最终结果。

缺点
1、页面使用计算属性时要当作方法调用,
2、在请求发出未响应期间,由于页面其他state改变导致的视图重新渲染会导致多次发出请求。

解决方案
缺陷一无法避免,缺陷二可以通过一个开关来避免,

// vuex.getters 中的代码

paymentStatus(state) {
      let isFetch = null; // 此处是开关
      return (store) => {  // 此处的sotre是传递过来的
        if (state.sys_billing_payment_status.length || isFetch) {
          return state.sys_billing_payment_status;
        } else {
          isFetch = store.dispatch('dict/getDicts', 'sys_billing_payment_status');
          return [];
        }
      }
    }

// 业务页面模板中使用方式
  paymentStatus($store)
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题