当前位置: 首页 > article >正文

在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


http://www.kler.cn/a/400571.html

相关文章:

  • 找不到vcruntime140.dll怎么办,彻底解决vcruntime140.dll丢失的5种方法
  • Quartus+Nios II for eclipse问题合集
  • 深度学习:卷积神经网络的计算复杂度,顺序操作,最大路径长度
  • 图像基础算法学习笔记
  • 面试经典 150 题:20、2、228、122
  • 如何在 SQL Server 中新增账户并指定数据库权限
  • 深入内核讲明白Android Binder【一】
  • C++ STL知识点100问
  • 基于YOLOv8深度学习的智慧农业柑橘病害识别检测系统(PyQt5界面+数据集+训练代码)
  • ISCTF 2024 web
  • aws云服务器:高可靠性和数据安全
  • 使用 Easegress 实现 Telegram 翻译机器人
  • 鸿蒙北向开发环境安装指南
  • 使用ivew-ui-plus 的Submit组件踩坑 injection “LoginInstance“ not found 记录 问题原因分析与解决方案
  • HarmonyOS 如何获取设备信息(系统、版本、网络连接状态)
  • HMSC联合物种分布模型在群落生态学中的贝叶斯统计分析应用
  • SpringBoot使用@Validated注解实现参数的验证
  • Docker中的一些常用命令
  • git根据远程分支创建本地新分支
  • 文章解读与仿真程序复现思路——电力系统自动化EI\CSCD\北大核心《基于改进容积卡尔曼滤波的含光伏配电网动态状态估计》
  • 【大语言模型】ACL2024论文-15 大型语言模型中的最佳解释推断
  • 麒麟DHCP服务的部署
  • 大数据学习16之Spark-Core
  • 商业物联网详细指南:优势与挑战
  • emerge 命令学习笔记
  • Flume1.9.0自定义拦截器