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

embedded/2024/11/20 3:59:11/

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

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

直接先上链接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 = truetry{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 = truetry{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


http://www.ppmy.cn/embedded/138960.html

相关文章

热点更新场景,OceanBase如何实现性能优化

案例背景 这个案例来自一个保险行业的客户&#xff1a;他们的核心系统底层采用了OceanBase数据库作为存储解决方案&#xff0c;然而&#xff0c;在系统上线运行后&#xff0c;出现了一个异常情况&#xff0c;执行简单的主键更新语句时SQL执行时间出现了显著的波动。为了迅速定…

算法编程题-golang语言协程池

算法编程题-golang语言协程池 协程池代码实现 实现线程池或者协程池是面试经常需要手写的题型。本文将介绍协程池如何实现。 协程池 池化技术是很重要的一种思想&#xff0c;将一些频繁使用但是创建开销比较大的对象自定义保存起来&#xff0c;反复使用&#xff0c;典型的有线…

unity小:shaderGraph不规则涟漪、波纹效果

实现概述 在本项目中&#xff0c;我们通过结合 Sine、Polar Coordinates 和 Time 节点&#xff0c;实现了动态波纹效果。以下是实现细节&#xff1a; 核心实现 Sine 波形生成&#xff1a; 使用 Sine 节点生成基本的波形。该节点能够创建周期性变化&#xff0c;为波纹效果提供…

不同规模的企业需要部署哪种组网?

针对不同规模的企业&#xff0c;合理的企业组网方式可以帮助优化网络性能和管理效率。以下是适合各类企业的组网建议。 一、小型企业&#xff08;少于50用户&#xff09; 选择经济实用的网络设备 小型企业可选择简单、成本合理的网络设备&#xff0c;如家庭路由器或小型商用路由…

前端学习八股资料CSS(三)

更多详情&#xff1a;爱米的前端小笔记&#xff0c;更多前端内容&#xff0c;等你来看&#xff01;这些都是利用下班时间整理的&#xff0c;整理不易&#xff0c;大家多多&#x1f44d;&#x1f49b;➕&#x1f914;哦&#xff01;你们的支持才是我不断更新的动力&#xff01;找…

使用uniapp开发微信小程序使用uni_modules导致主包文件过大,无法发布的解决方法

在使用uniapp开发微信小程序时候&#xff0c;过多的引入uni_modules的组件库&#xff0c;会导致主包文件过大&#xff0c;导致无法上传微信小程序&#xff0c;主包要求大小不超过1.5MB.分包大小每个不能超过2M。 解决方法&#xff1a;分包。 1.对每个除了主页面navbar的页面进…

解决在使用JetBrains IDEs(如PyCharm或CLion)进行GitHub项目分享时,用户经常遇到“此站点的访问已被限制”的问题

解决在使用JetBrains IDEs&#xff08;如PyCharm或CLion&#xff09;进行GitHub项目分享时&#xff0c;用户经常遇到“此站点的访问已被限制”的问题 在使用JetBrains IDEs&#xff08;如PyCharm或CLion&#xff09;进行GitHub项目分享时&#xff0c;用户经常遇到“此站点的访…

IT行业现状与未来趋势

IT行业现状与未来趋势 在这个快速变化的世界里&#xff0c;IT行业的风向标总是引人注目。就像海面上的潮汐&#xff0c;科技带来的变化时常令人惊叹。你是否曾想过&#xff0c;这些变化背后隐藏着怎样的力量&#xff1f;让我们一起探讨当前IT行业的现状与未来趋势&#xff0c;…