在vue3中如何优雅的管理loading状态

时隔多日,我又来了。近期工作实在是太忙了,基本处于天天加班的状态,整个人都麻木了,导致最近一直没有更新什么东西,感觉都快荒废了。还好,这两天处于下个项目开发前,当前项目已提测,好歹能有一点时间来学点东西,写点东西。

好了,废话不多说,本次是给大家分享一下我这两天写的一个插件。本来是写了一个公共方法自己用来着,想着近期在网上没看到好的方法,索性做成插件,分享出来,也让各位大佬们看看还有没有改进的地方。

直接先上链接vite-plugin-auto-loading

接下来,就说说我为什么要写这个插件,以及这个插件的基本用法

一、当前已有插件的问题

其实,目前对于loading的状态管理已经有很多的处理方案了,简单列举一下

1、请求拦截

也就是在请求接口的时候进行统一封装,发出请求展示loading,请求结束关闭loading。

弊端:公共loading,没法单独配置到各个按钮以及操作上面,同时多个请求的时候不做特殊处理的话loading会闪现

2、公共方法封装

封装一个公共的方法,让后在写具体方法的时候给包一层,方法具体咋写这里就不列举了,给大家看看具体实现

// 原
const fun1 = ()=>{..........}

// 改
const fun2 = ()=>{
    loadingFun(fun1())
}
const fun1 = ()=>{..........}

这种方式的问题,不用说了吧,多了一步包裹的操作,但实际上,这种方式是最简单实现,也是最合理的,想用就用,不想用拉倒,具体传参与否就看自己怎么封装了。

3、笨办法,每个地方单独写(反正是复制粘贴)

const fun1 =async ()=>{
    	loading.value = true
    try{
    	await api() 
    }catch (e) {
    	loading.value = false
    }
}

相信这种写法的不在少数,毕竟有时候因为各种原因没工夫去封装,但又要管理loading,反正我自己用这种方式用的也不少。

4、其他方法

其他还有一些通过自定义指令啊,或者通过注入,更有甚者用vue3不建议的mixin的,这就不提了,很多时候其实大家都是迫于无奈,想改吧,牵扯太大,时间不够等等,就不说了。

二、要处理的问题

1、得能在任意的地方使用

2、尽可能少的代码,不要繁琐的步骤

3、要不改变原方法结构

4、要简单易懂

三、解决

就上述说的一样,我自己也一直在想怎么才能很好的处理loading状态,毕竟我自己很懒,能少写代码就少写代码,于是经过一段时间的问题修复,我的第一个版本成了。下面说一下具体用法,这里说一下前提,vue3+vite

1、安装
npm install vite-plugin-auto-loading -D
2、配置
// vite.config.ts
import { defineConfig } from 'vite'
import { autoLoadingPlugin } from 'vite-plugin-auto-loading'
export default defineConfig({
plugins: [
    autoLoadingPlugin()
  ]
})
// autoLoadingPlugin({debug: true // 开启调试日志}) 是否需要日志自选
3、使用

插件会自动读取loading变量同名的方法,且同时含有async以及await,如loading.handleSearch会根据handleSearch的执行结果来改变状态,loading中没有同名,或者只有async或await,都不会做任何操作

<el-button :loading="loading.handleSearch">查询</el-button>

<list :loading="loading.getData"></list>


const loading = reactive({
    getData: false,
    handleSearch: false,
});

const getData = async() =>{
	await getApi(xxxxxxxx)
}

const handleSearch = async() =>{
	const queryData = {
		a:1,
		b:2
	}
	await postApi(queryData)
}

4、原理

通过vite插件,读取.vue文件中声明的loading变量,不论是ref还是reactive声明的都可,获取里面的key值,并匹配与key值同名的方法,当匹配到的时候,查看是否满足同时有async 以及await,符合条件的时候重写方法。如:

// 原
const handleSearch = async() =>{
	const queryData = {
		a:1,
		b:2
	}
	await postApi(queryData)
}

// 变为
const handleSearch = async() =>{
    loading.handleSearch = true
    try{
        const queryData = {
            a:1,
            b:2
        }
        await postApi(queryData)
    } finally {
       loading.handleSearch = false
    }
	
}

当然,这些都是在vite编译的时候进行,不用我们进行任何操作。

注意:不仅仅是箭头函数的方式可以,其他声明函数的方式也可以的,有做了适配

有其他问题的话,欢迎大家指正哦,转载请注明出处!

源码地址:

github:https://github.com/sha-chong/vite-plugin-auto-loading

gitee:https://gitee.com/shachongji/vite-plugin-auto-loading

查看源码可以的话请给我一个star(^U^)ノ~YO

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值