首页 > 其他分享 >Vue公共loading升级版(处理并发异步差时响应)

Vue公共loading升级版(处理并发异步差时响应)

时间:2023-11-20 18:55:32浏览次数:35  
标签:statusList loading 请求 loadStore 响应 Vue true 差时

公共loading是项目系统中很常见的场景,处理方式也不外乎三个步骤:
1.通过全局状态管理定义状态值(vuex、pinia等)。
2.在程序主入口监听状态值变化,从而展示/隐藏laoding动画。
3.在请求和相应拦截器中变更状态值。

第一二步骤处理大同小异,但在第三步中,网上很多博文分享的方法是:在请求拦截中展示loading,在响应拦截器中判断收到成功响应时直接隐藏loading,这种方法看似可行但实际过程中却有问题。
例如,假设在第0秒时同时向后台发送了两个异步请求A和B,由于网络或处理逻辑不同,A请求0.5秒秒收到成功响应,B请求2秒才收到。那在第0.5秒,响应拦截器就会把loading状态变更,结束loading动画,但此时B请求还没收到返回。如果用户接下来的操作同时需要A和B请求的数据,提前结束动画会让用户体检变差。

解决思路:
定义一个全局对象来存储每个接口的响应状态,直到每个请求接口都收到响应才变更状态,结束loading动画。因为键名的唯一性,可以使用接口路径(或唯一接口编号)作为键名。请求时添加一个键值对,响应时变更键值,同时遍历对象状态值进行判断

let apiStatusList ={
  '/api/a':true,//true请求中
  '/api/b':false //false请求完成
}

具体操作如下(以vue3的pinia为例):
定义一个loading.js

import { defineStore } from 'pinia';
export const useLoadStore = defineStore('storeLoading', {
  state: () => {
    return {
      apiStatusList:{},
      loading:false, //网络加载状态,true加载中
    };
  },
  actions: {
    updateLoadingState(value){
      this.loading = value
    },
    setApiStatusList(value){
      this.apiList = value;
    }
  }
});

拦截器处理:

import axios from 'axios';
import { useLoadStore } from '../stores/loading';

const request = axios.create();
//请求拦截
request.interceptors.request.use(
  (config) => {
    //公共loading
    const loadStore = useLoadStore();
    let statusList = { ...loadStore.apiStatusList };
    statusList[config.url] = true; //接口赋值为请求中
    loadStore.setApiStatusList(statusList);
    if (!loadStore.loading) {  //判断loading是否正在展示中
      loadStore.updateLoadingState(true);
    }

    return config;
  },
  (error) => {
    return Promise.reject(error);
  }
)

//响应拦截
request.interceptors.response.use(
  (response) => {
    const loadStore = useLoadStore();
    let statusList = { ...loadStore.apiStatusList };
    statusList[response.config.url] = false;  ////接口赋值为请求完成
    if (!Object.values(statusList).includes(true)) { //遍历对象,判断接口是否全部返回
      if (loadStore.loading) {
        loadStore.updateLoadingState(false);
        loadStore.setApiStatusList({});
      }
    } else {
      loadStore.setApiStatusList(statusList);
    }
  },
  (error) => {//有接口报错,重置loading
    const loadStore = useLoadStore();
    if (loadStore.loading) {
      loadStore.updateLoadingState(false);
      loadStore.setApiStatusList({});
    }
  }
)

App.vue监听状态变化

//监听store状态值时需要传入function
watch(()=>loadStore.loading,(newValue, oldValue)=>{
  if(newValue){
    showLoadingToast({
      duration: 0,
      forbidClick: true,
    });
  }else{
    closeToast();
  }
})

标签:statusList,loading,请求,loadStore,响应,Vue,true,差时
From: https://www.cnblogs.com/zyj-Blogs/p/17844283.html

相关文章

  • vue 创建项目流程
    1、首先在文件下打开cmd运行cd到你的目录下面2、npminitvue@latest命令创建项目默认都选否,具体需要,后面自行添加2、根据提示完成下三步操作这是运行npminstall由于卡住了,就需要进行下一步,手动打开刚刚的目录文件并且在该目录下,运行cmd,并输入,npmrundev来启动vu......
  • 基于springboot vue的宿舍管理系统
    项目源码免费获取方式放在文章末尾处项目技术数据库:Mysql5.7数据表:7张开发语言:Java(jdk1.8)开发工具:idea前端技术:Vue后端技术:SpringBoot 功能简介该项目是一个宿舍管理系统,分为管理员端,宿管员端。 管理员端:       登录        宿管模块            ......
  • Vue中的路由
    概念1)理解:一个路由(route)就是一组映射关系(key-value),多个路由需要路由器(router)进行管理2)前端路由:key是路径,value是组件3)作用:设定访问路径,并将路径和组件映射起来(就是用于局部刷新页面,不需要请求服务器来切换页面)Route(路由)Route(路由):route是指应用中的一个路由,它表示导航的目......
  • Vue动态改变css样式的3种方法
    在网页开发中,我们经常会遇到动态的改变某个元素样式的需求,在vue里如何实现呢?官网上其实写的很详细了,对象语法,数组语法等。我自己总结了在开发中,个人用的比较多的三种方式1.class,三元表达式:class="[occupation==='请选择'?'lh60':'lh61']"css.red{color:red;}.blue......
  • 【开源】基于Vue.js的天然气工程运维系统的设计和实现
    一、摘要1.1项目介绍基于Vue+SpringBoot+MySQL的天然气工程运维系统,包含工程项目模块、材料档案模块、材料领用单模块,还包含系统自带的用户管理、部门管理、角色管理、菜单管理、日志管理、数据字典管理、文件管理、图表展示等基础模块,天然气工程运维系统基于角色的访问控制,给工程......
  • #yyds干货盘点#VueRouter模拟实现
    hash模式URL中#号后面的内容作为路径地址监听hashchange事件根据当前路与地址找到对应的组件重新渲染history模式通过history.pushState()方法改变地址栏监听popstate事件根据当前路由地址找到对应组件重新渲染基本使用//1.注册路由插件Vue.use(VueRouter)//2.创建router对......
  • uniapp vue可以通过mixins混入代码,可以通过下面方法混入template
    vue全局混入template方法:在根目录vue.config.js(没有就新增)里添加一下代码//红色部分是混入的自定义vue组件module.exports={chainWebpack:config=>{config.module.rule('vue').use('vue-loader').loader('vue-loader').tap(options=>{......
  • vue2+element+vue-quill-editor实现富文本框组件(使用链接引入视频+上传本地视频+上传
    参考文档:https://www.duidaima.com/Group/Topic/Vue/12272前提不赘述,npm引入插件并全局导入 components文件夹下创建ArticleEditor.vue:<template><divclass=""><!--富文本框--><quill-editorref="myQuillEditor"v-bind:va......
  • vue3 ts 生命周期函数写法
    写法1import{defineAsyncComponent,ref,reactive,onMounted,nextTick,computed,watch}from'vue';//页面加载时onMounted(()=>{ initResize();});//监听双向绑定modelValue的变化watch( ()=>props.modelValue, ()=>{ initModeValueEcho();......
  • VS CODE,保存自动格式化vue代码配置 流程记录
    进入vscode,ctrl+shift+p,搜索Preferences:OpenUserSettings(json) ,然后把下面配置覆盖到原本的地方 { //vscode默认启用了根据文件类型自动设置tabsize的选项 "editor.detectIndentation":false, //重新设定tabsize "editor.tabSize":2, //#每次保......