实现一个vuex-loading插件

本文介绍了如何实现一个基于Vue和Vuex的loading插件,用于管理项目中的异步操作状态。通过分析Vuex的源码,作者模仿dva-loading的思想,利用Vue的生命周期方法实现了一个插件,并提供了在Vuex中使用该插件的方法,需要Vue版本升级至特定要求。
摘要由CSDN通过智能技术生成

前言

在项目中,如何管理loading是一个很头疼的方式,有的是在请求封装里去做了一个全屏loading,有的是在单页面中管理一个loading,比如如下:

data(){
   
    return{
   
        loading:false
    }
},
methods:{
   
    async change(){
   
        this.loading = true
        // 执行异步操作
        await asyncAction()
        this.loading = false
    }    
}

如果管理的是一个还好,但是如果页面上存在着多个异步操作,维护起来简直要命。

之前有使用过dva这个基于react-saga的数据流框架,他有一个插件dva-loading非常的好用,但由于是React框架上的。一直想着如何借鉴其思路实现一个基于vuexloading插件,是非常想做的一件事。

好在,vuex@3.1.0中新增了一个subscribeAction这个方法。

store.subscribeAction({
   
  before: (action, state) => {
   
    console.log(`before action ${
     action.type}`)
  },
  after: (action, state) => {
   
    console.log(`after action ${
     action.type}`)
  }
})

简单来说就是我们在发起的每一个action都可以在这个方法中订阅到,beforeafter两个过程。心里一想,这岂不是跟dva-loading有一样的一个动作吗。

如何实现

先看一下dva-loading的源码,分析一下:

为了方便描述,直接贴源码补充注释,具体dva的使用与vuex的异同,可以看我之前写的那篇如何使用dva与服务端进行数据交互

const SHOW = '@@DVA_LOADING/SHOW'; // 定义reducer 类似于mutation
const HIDE = '@@DVA_LOADING/HIDE';
const NAMESPACE = 'loading';  // 定义命名空间

function createLoading(opts = {
   }) {
   
  // 获取参数中的命名空间或者本地的名称
  const namespace = opts.namespace || NAMESPACE;

  const {
    only = [], except = [] } = opts;
  if (only.length > 0 && except.length > 0) {
   
    throw Error('It is ambiguous to configurate `only` and `except` items at the same time.');
  }

  // 初始化state
  const initialState = {
   
    global: false, // 定义全局 loading 
    models: {
   }, // 定义
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值