我的编程空间,编程开发者的网络收藏夹
学习永远不晚

JS怎么实现loading加载

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

JS怎么实现loading加载

这篇文章主要讲解了“JS怎么实现loading加载”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“JS怎么实现loading加载”吧!

防抖节流自定义指令

一、问题现象

操作系统流程时,网速过慢,点击【按钮】,页面没有及时反应;用户感知不到,再次点击按钮,系统流程报错。

二、想法

控制按钮操作时的频繁接口调用,通过防抖操作进行处理

三、实现

封装自定义指令v-debounce

import Vue from 'vue';//按钮防抖动指令Vue.directive('debounce', {    inserted(el, binding) {        el.addEventListener('click', () => {            if (!el.disabled) {                el.disabled = true;                setTimeout(() => {                    el.disabled = false;                }, binding.value || 3 * 1000); // 三秒之内点击不会触发接口调用            }        });    },});

在main.js文件中引入文件

import '@/utils/directives.js';

项目的template中使用

<el-button type="primary" class="change-btns" @click="sendCode()" v-debounce>发送验证码</el-button>

loading加载

考虑到项目本身可能已经进入尾声,再应用自定义指令的话,需要耗费时间,逐一排查按钮操作,费时费力。

一、想法

想要减少时间,肯定需要统一配置处理,考虑到控制接口的频繁调用和操作频繁等问题,或许通过页面整体不可点击的方式进行处理,那就是接口调用时控制页面加载。

二、实现

  • 首先写一个loading.vue组件

<!-- * @Author: Winter_Bear * @Date: 2023-03-25 16:18:16 * @LastEditors: zh * @LastEditTime: 2023-03-25 16:55:18 * @Description: loading组件--><template>  <div v-if="visable" class="loaidng">    <transition name="animation">      <div class="load">        <img alt="" class="img" class="lazy" data-src="@/assets/image/loading.png" />      </div>    </transition>  </div></template><script>export default {  data() {    return {      visable: false,    };  },};</script><style scoped>.loaidng {  width: 100% !important;  height: 100% !important;  display: -webkit-flex !important;   display: -webkit-box !important;   display: -moz-box !important;   display: -ms-flexbox !important;   display: flex !important;  justify-content: center !important;  align-items: center !important;  position: fixed !important;  top: 0 !important;  right: 0 !important;  bottom: 0 !important;  left: 0 !important;  background: rgba(0, 0, 0, 0);  color: #282828;  font-size: 20px;  z-index: 999999;}.load {  background-clip: text;  -webkit-position: relative !important;  position: relative !important;}.img {  width: 75px;  animation: rotation 5s linear infinite;  animation: rotation 2s linear infinite;  -moz-user-select: -moz-none;  -khtml-user-select: none;  -webkit-user-select: none;  -o-user-select: none;  user-select: none;}.no-scroll {  height: 100vh;}.no-scroll > * {  position: sticky;  top: 0;}@keyframes rotation {  0% {    -webkit-transform: rotate(0deg);  }  100% {    -webkit-transform: rotate(360deg);  }}</style>
  • 封装loading.js文件

import Loading from './index.vue';//先创建一个空实例let instance = null;let winX = null;let winY = null;window.addEventListener('scroll', function () {  if (winX !== null && winY !== null) {    window.scrollTo(winX, winY);  }});function disableWindowScroll() {  winX = window.scrollX;  winY = window.scrollY;}function enableWindowScroll() {  winX = null;  winY = null;}export default {  install(Vue) {    if (!instance) {      //构造器 /子类      let MyLoading = Vue.extend(Loading);      instance = new MyLoading({        //创建一个div,并挂载上去        el: document.createElement('div'),      });      document.body.appendChild(instance.$el);    }    //自定义一些方法,操作loading的显示与隐藏关    let customMethods = {      async start() {        console.log(instance);        instance.visable = true;        disableWindowScroll();        var mo = function (e) {          passive: false;        };      },      finish() {        instance.visable = false;        enableWindowScroll();        var mo = function (e) {          passive: false;        };      },    };    //挂载到自定义方法vue示例上    if (!Vue.$loading) {      Vue.$loading = customMethods;      //挂载到原型上      Vue.prototype.$loading = Vue.$loading;    } else {      console.log('$loading方法已被占用');    }  },};

在main.js中挂载到全局Vue的原型上

import $loading from '@/components/loading/loading.js';Vue.use($loading);
  • 在request.js接口请求和响应拦截时做处理

import Vue from 'vue';import axios from 'axios';import store from '@/store';import router from '@/router';import messageup from './resetMessage.js';import commonService from '@/api/common.js';import storage from '@/utils/storage';import { setToken, setRefreshToken } from '@/utils/auth.js';const service = axios.create({  baseURL: process.env.VUE_APP_appBaseUrl,  // 跨域请求时是否需要使用凭证  withCredentials: false,  // 请求 1000s 超时  timeout: 1000 * 60 * 60,});let loadingSum = 0;let isRefreshing = false; // 标记是否正在刷新 token, 防止多次刷新tokenlet requests = []; // 存储待重发请求的数组(同时发起多个请求的处理)// 请求拦截器service.interceptors.request.use(  (config) => {    loadingSum++;    if (loadingSum == 1) {      Vue.$loading.start();    }    let EnterpriseToken = '';    storage.get('CLIENTID', (data) => {      EnterpriseToken = data;    });    if (EnterpriseToken) {      config.headers.EnterpriseToken = EnterpriseToken;    }    return config;  },  (error) => {    messageup({      message: '服务异常!',      type: 'error',      showClose: true,      duration: 0,    });    return Promise.resolve(error);  },);// 响应拦截器service.interceptors.response.use(  (response) => {    let config = response.config;    let url = response.config.url;    const code = response.data.code;    loadingSum--;    if (loadingSum == 0) {      Vue.$loading.finish();    }    if (['701', '702'].includes(code)) {      storage.removeAll();      router.replace('/sign').catch((err) => err);      messageup({        message: response.data.message,        type: 'error',      });      return;    } else if (code == '801') {      //这部分属于强制登录的逻辑状态处理      if (!isRefreshing) {        loadingSum++;        if (loadingSum == 1) {          Vue.$loading.start();        }        isRefreshing = true;        let getRefreshToken = '';        storage.get('REFCLIENTID', (data) => {          getRefreshToken = data;        });        if (getRefreshToken) {          return new Promise((resolve, reject) => {            let data = {              refreshToken: getRefreshToken,            };            commonService              .refreshToken(data)              .then((res) => {                if (res && res.data && res.data.code == '200') {                  const { clientid, refreshid } = res.data.data;                  setToken(clientid);                  setRefreshToken(refreshid);                  config.headers.EnterpriseToken = clientid;                  // token 刷新后将数组的方法重新执行                  requests.forEach((cb) => cb(clientid));                  requests = []; // 重新请求完清空                  resolve(service(config));                } else {                  requests = [];                  storage.removeAll();                  router.replace('/sign').catch((err) => err);                }              })              .catch((err) => {                return Promise.reject(err);              })              .finally(() => {                isRefreshing = false;                loadingSum--;                if (loadingSum == 0) {                  Vue.$loading.finish();                }              });          });        } else {          loadingSum--;          if (loadingSum == 0) {            Vue.$loading.finish();          }        }      } else {        // 返回未执行 resolve 的 Promise        return new Promise((resolve) => {          // 用函数形式将 resolve 存入,等待刷新后再执行          requests.push((token) => {            config.headers.EnterpriseToken = token;            resolve(service(config));          });        });      }    } else {      return response;    }  },  (error) => {    loadingSum--;    if (loadingSum == 0) {      Vue.$loading.finish();    }    messageup({      message: error.message,      type: 'error',      showClose: true,      duration: 0,    });    return Promise.reject(error);  },);export default {  post(url, data = {}, headers = {}) {    return new Promise((resolve, reject) => {      service.post(url, data, headers).then(        (response) => {          resolve(response);        },        (err) => {          reject(err);        },      );    });  },  get(url, params = {}, headers = {}) {    return new Promise((resolve, reject) => {      service        .get(url, {          params: params,          headers: headers,        })        .then((response) => {          resolve(response);        })        .catch((err) => {          reject(err);        });    });  },  when(arry = []) {    if (arry.length <= 1) {      return arry[0];    } else {      let arr = [];      let length = arry.length;      for (let i = 0; i < length; i++) {        arr.push('res' + i);      }      return new Promise((resolve, reject) => {        axios.all(arry).then(          axios.spread((...arr) => {            resolve(arr);          }),        );      });    }  },};

感谢各位的阅读,以上就是“JS怎么实现loading加载”的内容了,经过本文的学习后,相信大家对JS怎么实现loading加载这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

JS怎么实现loading加载

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

JS怎么实现loading加载

这篇文章主要讲解了“JS怎么实现loading加载”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“JS怎么实现loading加载”吧!防抖节流自定义指令一、问题现象操作系统流程时,网速过慢,点
2023-07-05

js怎么实现图片的懒加载

这篇文章给大家分享的是有关js怎么实现图片的懒加载的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。图片的懒加载是前端优化必须要掌握的东西,图片实现懒加载可以节省带宽又可以减轻我们网页的负荷。接下来我来记录一下我所掌
2023-06-14

利用svg实现带加载进度的loading

svg是基于XML,由World Wide Web Consortium (W3C)联盟开发的一种开放标准的矢量图形语言,可让你设计激动人心的、高分辨率的Web图形页面。本文将使用svg实现一个带加载进度的loading,需要的可以参考一下
2022-11-13

vue-router懒加载下载js的过程中添加loading提示避免无响应怎么解决

今天小编给大家分享一下vue-router懒加载下载js的过程中添加loading提示避免无响应怎么解决的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,
2023-07-04

Android自定义View实现loading动画加载效果

项目开发中对Loading的处理是比较常见的,安卓系统提供的不太美观,引入第三发又太麻烦,这时候自己定义View来实现这个效果,并且进行封装抽取给项目提供统一的loading样式是最好的解决方式了。 先自定义一个View,继承自Linea
2022-06-06

使用css实现android系统的loading加载动画

小编给大家分享一下使用css实现android系统的loading加载动画,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!web常用的loading图标有2种, 一
2023-06-08

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录