react vue 全局组件封装 顶部进度条封装使用

1 篇文章 0 订阅

最近想在react的项目里面弄一个顶部请求数据的进度条,去搜了一下,发现都没有我想要的,于是就想着自己做一个,话不多说,直接上代码:

首先在项目src/conponent下新建一个文件夹Progress

在Progress文件夹下新建progress.tsx和index.tsx,这里的ts规范我就偷懒用any了

progress.tsx里面的内容:

export const Progress = () => {
  // 创建元素追加到body
  let div: any = document.createElement('div');
  const bar = document.createElement("div");
  div.appendChild(bar);
  document.body.appendChild(div);
  // 随便写点样式
  div.style.cssText = `
    position: fixed;
    top: 0;
    width: 100%;
    height: 2px;
    z-index: 999;
  `
  bar.style.cssText = `
    height: inherit;
    width: 0px;
    background-color: #1890ff;
  `
  // 写个计时器,每隔10毫秒加1
  let speed = 1;
  let timer = setInterval(() => {
    // 只加到90,剩下的等请求结束后再加
    if (speed <= 90) {
      speed += 1
      bar.style.width = speed + "%";
    }
  }, 10)

  return {
    destroy() {
      // 清除计时器
      clearInterval(timer)
      // 请求结束后加到100
      bar.style.width = 100 + "%";
      if (div) {
        // 等500毫秒后清除,不然同时进行,效果不好
        setTimeout(() => {
          document.body.removeChild(div);
          // 元素清除之后必须赋值为空,不然会报错
          div = null
        }, 100)
      }
    }
  }
};

index.tsx里面的内容:

import { Progress } from './progress'

let progressInstance: any = 0;
const getProgress = () => {
  progressInstance = progressInstance || Progress()
}

export const progress = {
  start() {
    getProgress()
  },
  done() {
    if (progressInstance) {
      progressInstance.destroy()
      progressInstance = null
    }
  }
}

最后再到axios请求数据的文件下调用:

这个instance就是用axios.create重新创建的一个事列,不创建的话直接用axios.instance.interceptors.request.use就可以了

 代码:

// 发送多个请求时,发送第一个请求时执行start(),最后一个请求结束时执行done()
let reqNum = 0;
instance.interceptors.request.use((config: any) => {
    // 发送请求
    reqNum ++;if(reqNum === 1) progress.start();
    return config;
});
instance.interceptors.response.use((config: any) => {
    // 请求接收
    reqNum --;if(reqNum <=0) progress.done();
    return config;
});

最后看看效果

这样就是能实现在数据请求的时候有进度条了,其实我这个相当于纯原生的方式写的,这样既可以使用在recat中,又可以在vue中使用,不过vue好像可以有另外自己的一种写法,大家自己选择 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值