loading封装

1.支持设置loading延时出现的时间,比如接口响应很快,就没必要显示loading了,否则loading闪一下就消失了很多余
2.支持设置loading是否出现,虽然loading是封装在axios拦截器里的,但是某些接口可能不需要有loading显示
3.以服务的方式调用,引入 element ui Loading 服务
基于nuxt $axios模块,代码如下:

import { Message, Loading } from "element-ui"
export default ({ $axios, store, app, redirect, route, req, res }) => {
  let [loadingCount, currencyCode, currentLanguage, isRefreshing, token] = [
    0,
    "",
    "",
    true,
    ""
  ]
  $axios.onRequest(config => {
    // 如果请求头里设置了可显示loading,才调用showLoading
    if (!config.headers.hideLoading) {
      showLoading(config.headers.loadingTarget, config.headers.delayTime)
    }
    return config
  })
  $axios.onResponse(response => {
  if (!response.config.headers.hideLoading) {
      hideLoading()
    }
    return response
  })

  $axios.onError(error => {
    hideLoading()
    return Promise.reject(error)
  })

  let [loading, timer] = [null, null]

  // 显示loading
  function showLoading(target, delayTime) {
    if (loadingCount === 0 && !loading) {
      // loading 延迟显示的时间默认1s,可配置是否延迟显示
      if (delayTime !== false) {
        timer = setTimeout(() => {
          loading = Loading.service({
            text: "Loading...",
            background: "rgba(0, 0, 0, 0)",
            target: target || "body"
          })
        }, 1000)
      } else {
        loading = Loading.service({
          text: "Loading...",
          background: "rgba(0, 0, 0, 0)",
          target: target || "body"
        })
      }
    }
    loadingCount++
    store.commit("setShowEmpty", false)
  }

  // 隐藏loading
  function hideLoading() {
    loadingCount--
    loadingCount = Math.max(loadingCount, 0) // 做个保护
    if (loadingCount === 0) {
      if (timer) {
        clearTimeout(timer)
        timer = null
      }
      // 关闭loading
      toHideLoading()
      setTimeout(() => {
        store.commit("setShowEmpty", true)
      }, 500)
    }
  }

  // 防抖:将 300ms 间隔内的关闭 loading 便合并为一次。防止连续请求时, loading闪烁的问题。
  const toHideLoading = _.debounce(() => {
    if (loading) {
      loading.close()
    }
    loading = null
  }, 300)
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值