从eleUI的Loading知道了单例模式的用法

 更新时间:2024年01月24日 15:04:59   作者:土豆Coder  
这篇文章主要介绍了从eleUI的Loading知道了单例模式的用法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

从eleUI的Loading知道了单例模式

现象

在使用elementUI开始一个vue项目,

为了更好的用户体验,需要在接口请求的时候添加全局的Loading

所以在接口处理文件中,

在请求拦截的时候添加Loading,在响应拦截的时候取消Loading

import axios from 'axios'
import { Message, Loading } from 'element-ui'

let instance = axios.create({
  baseURL: '',
  timeout: 60000
})

let loadingInstance = null

// 请求拦截
instance.interceptors.request.use((config) => {
  loadingInstance = Loading.service({
    fullscreen: true,
    text: '拼命加载中...',
    background: 'rgba(0, 0, 0, 0.8)'
  })
  return config
}, (error) => {
  loadingInstance.close()
  Message.error({message: '请求超时!'})
  return Promise.reject(error)
})

// 响应拦截
instance.interceptors.response.use((response) => {
  loadingInstance.close()
  if (response.data && response.data.code && response.data.code === 200) {
    return response.data
  } else {
    Message({
      message: response.data.msg || '接口错误',
      type: 'error'
    })
  }
}, (error) => {
  loadingInstance.close()
  return Promise.reject(error)
})

export default instance

优化

逻辑似乎很合理,但是实际项目中发现,如果某个页面请求多个接口,且每个接口都返回很慢的话,实际看到的效果是虽然Loading会出现,但是当第一个接口返回值以后后面的Loading都不会出现了,就会出现页面数据从无到有的过滤,用户体验较差。

原来,是因为elementUI的全屏Loading是单例的:如果前一个Loading关闭之前再次调用了下一个Loading并不会创建一个新的实例,返回的仍然是当前这个Loading实例;同理,当调用任意一个close()方法都会关闭这个Loading实例。

因为这几个接口都是同一时间请求的,也就是说当前页面几个Loading实例其实都是同一个,所以关闭后也就都关闭了。

改进后:

import axios from 'axios'
import { Message, Loading } from 'element-ui'

let instance = axios.create({
  baseURL: '',
  timeout: 60000
})

/* 当页面有两个接口时,第一个接口loading的close事件会直接将第二个接口的loading实例也close */
let loadingInstance = null

function startLoading () {
  loadingInstance = Loading.service({
    fullscreen: true,
    text: '拼命加载中...',
    background: 'rgba(0, 0, 0, 0.8)'
  })
}

function endLoading () {
  loadingInstance.close()
}

let needLoadingRequestCount = 0

function showFullScreenLoading () {
  if (needLoadingRequestCount === 0) {
    startLoading()
  }
  needLoadingRequestCount++
}

function tryHideFullScreenLoading () {
  if (needLoadingRequestCount <= 0) return
  needLoadingRequestCount--
  if (needLoadingRequestCount === 0) {
    endLoading()
  }
}

// 请求拦截
instance.interceptors.request.use((config) => {
  showFullScreenLoading()
  return config
}, (error) => {
  tryHideFullScreenLoading()
  Message.error({message: '请求超时!'})
  return Promise.reject(error)
})

// 响应拦截
instance.interceptors.response.use((response) => {
  tryHideFullScreenLoading()
  if (response.data && response.data.code && response.data.code === 200) {
    return response.data
  } else {
    Message({
      message: response.data.msg || '接口错误',
      type: 'error'
    })
  }
}, (error) => {
  tryHideFullScreenLoading()
  return Promise.reject(error)
})

export default instance

每次创建Loading实例的时候判断当前是否存在,如果当前还没有Loading实例就创建一个,如果有就不会再创建而是计数;

每次关闭的时候判断当前的计数,如果是0了就关闭,否则也计数减一,直到为0的时候表示当前所有页面所有接口都返回结束了,此时执行关闭Loading.close()操作关闭菊花。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • vue2.0和mintui-infiniteScroll结合如何实现无线滚动加载

    vue2.0和mintui-infiniteScroll结合如何实现无线滚动加载

    这篇文章主要介绍了vue2.0和mintui-infiniteScroll结合如何实现无线滚动加载,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-10-10
  • 使用vue-office预览word文档的功能详解

    使用vue-office预览word文档的功能详解

    这篇文章主要为大家详细介绍了如何使用vue-office预览word文档的功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2025-09-09
  • 详解Vite+JavaScript+Vue+Yarn实现登录页面实战

    详解Vite+JavaScript+Vue+Yarn实现登录页面实战

    本文主要介绍了Vite+JavaScript+Vue+Yarn实现登录页面实战,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-07-07
  • Vue如何使用js-audio-recorder插件实现录音功能并将文件转成wav上传

    Vue如何使用js-audio-recorder插件实现录音功能并将文件转成wav上传

    这篇文章主要给大家介绍了关于Vue如何使用js-audio-recorder插件实现录音功能并将文件转成wav上传的相关资料,文中通过示例代码讲解了弹窗界面、变量控制、录音启动与停止、波形可视化、文件上传及WAV格式获取的完整流程,需要的朋友可以参考下
    2025-06-06
  • vue 使用post/get 下载导出文件操作

    vue 使用post/get 下载导出文件操作

    这篇文章主要介绍了vue 使用post/get 下载导出文件操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-08-08
  • webpack+vue.js实现组件化详解

    webpack+vue.js实现组件化详解

    vue的开发体验还是比较愉悦的。首先文档非常友好,所以上手会比较快。其次,配合webpack和vue-loader,每个页面都是一个.vue文件,写起来很方便。所以很适合做组件化开发,这篇文章我们就来一起看看webpack+vue.js如何实现组件化。
    2016-10-10
  • Vue中实现可切换显示/隐藏侧边栏的按钮的示例代码

    Vue中实现可切换显示/隐藏侧边栏的按钮的示例代码

    这篇文章主要介绍了如何在Vue应用中实现一个可切换显示/隐藏侧边栏的按钮,通过设计基本结构、管理数据状态、实现CSS样式切换、核心实现原理、交互体验优化和动画效果,最终实现了侧边栏的平滑显示/隐藏功能,并提升了用户体验,感兴趣的小伙伴可以参考下
    2025-11-11
  • el-form组件使用resetFields重置失效的问题解决

    el-form组件使用resetFields重置失效的问题解决

    用el-form写了包含三个字段的表单,使用resetFields方法进行重置,发现点击重置或要清空校验时是失效的,所以本文给大家介绍了el-form组件使用resetFields重置失效的问题解决,需要的朋友可以参考下
    2023-12-12
  • 浅谈vue中get请求解决传输数据是数组格式的问题

    浅谈vue中get请求解决传输数据是数组格式的问题

    这篇文章主要介绍了浅谈vue中get请求解决传输数据是数组格式的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-08-08
  • vuex的辅助函数该如何使用

    vuex的辅助函数该如何使用

    vue通过辅助函数mapState、mapActions、mapMutations,把vuex.store中的属性映射到vue实例身上,这样在vue实例中就能访问vuex.store中的属性了,对于操作vuex.store就很方便了,本文具体的介绍下这些辅助函数的使用方法
    2021-06-06

最新评论