iis服务器助手广告
返回顶部
首页 > 资讯 > 精选 >JS怎么实现loading加载
  • 435
分享到

JS怎么实现loading加载

2023-07-05 16:07:43 435人浏览 薄情痞子
摘要

这篇文章主要讲解了“js怎么实现loading加载”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“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" 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加载这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

--结束END--

本文标题: JS怎么实现loading加载

本文链接: https://www.lsjlt.com/news/353423.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

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

下载Word文档
猜你喜欢
  • JS怎么实现loading加载
    这篇文章主要讲解了“JS怎么实现loading加载”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“JS怎么实现loading加载”吧!防抖节流自定义指令一、问题现象操作系统流程时,网速过慢,点...
    99+
    2023-07-05
  • 怎么用css3实现loading加载动画效果
    这篇文章主要介绍“怎么用css3实现loading加载动画效果”,在日常操作中,相信很多人在怎么用css3实现loading加载动画效果问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大...
    99+
    2024-04-02
  • 怎么用CSS3实现炫酷loading加载动画特效
    本篇内容主要讲解“怎么用CSS3实现炫酷loading加载动画特效”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么用CSS3实现炫酷loading加载动画特效...
    99+
    2024-04-02
  • 怎么用纯CSS3实现页面loading加载动画效果
    小编给大家分享一下怎么用纯CSS3实现页面loading加载动画效果,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!  ...
    99+
    2024-04-02
  • js怎么实现图片的懒加载
    这篇文章给大家分享的是有关js怎么实现图片的懒加载的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。图片的懒加载是前端优化必须要掌握的东西,图片实现懒加载可以节省带宽又可以减轻我们网页的负荷。接下来我来记录一下我所掌...
    99+
    2023-06-14
  • 利用svg实现带加载进度的loading
    目录什么是svg用到svg元素、属性介绍circle标签text标签tspan标签stroke-dasharray属性stroke-linecap属性其他属性circle标签添加st...
    99+
    2022-11-13
    svg带加载进度loading svg loading svg 进度条
  • CSS3如何实现loading预加载动画特效
    小编给大家分享一下CSS3如何实现loading预加载动画特效,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!该loading特效...
    99+
    2024-04-02
  • 使用css实现android系统的loading加载动画
    小编给大家分享一下使用css实现android系统的loading加载动画,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!web常用的loading图标有2种, 一...
    99+
    2023-06-08
  • vue-router懒加载下载js的过程中添加loading提示避免无响应怎么解决
    今天小编给大家分享一下vue-router懒加载下载js的过程中添加loading提示避免无响应怎么解决的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,...
    99+
    2023-07-04
  • vue前端页面数据加载添加loading效果的实现
    目录前端页面数据加载添加loading效果具体实现全局loading配置1 再src/componennts/Spinner下面建立一个index.vue2 再utils下面tool...
    99+
    2024-04-02
  • CSS实现loading加载特效的小技巧有哪些
    这篇文章主要介绍了CSS实现loading加载特效的小技巧有哪些,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。loader-1这应该是最简单...
    99+
    2024-04-02
  • 为vue-router懒加载时下载js的过程中添加loading提示避免无响应怎么办
    这篇文章给大家分享的是有关为vue-router懒加载时下载js的过程中添加loading提示避免无响应怎么办的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。用过vue-route...
    99+
    2024-04-02
  • p5.js如何实现图片加载
    这篇文章主要为大家展示了“p5.js如何实现图片加载”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“p5.js如何实现图片加载”这篇文章吧。一、preload()...
    99+
    2024-04-02
  • 原生JS实现加载进度条
    本文分享一个原生JS实现的动态加载进度条特效,效果如下: 实现的代码如下: <!DOCTYPE html> <html> <head> ...
    99+
    2024-04-02
  • 怎么用js和ajax实现加载时的进度条
    这篇文章主要介绍“怎么用js和ajax实现加载时的进度条”,在日常操作中,相信很多人在怎么用js和ajax实现加载时的进度条问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么...
    99+
    2024-04-02
  • 怎么重写document.write实现无阻塞加载JS广告
    本篇内容主要讲解“怎么重写document.write实现无阻塞加载JS广告”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么重写document.write实...
    99+
    2024-04-02
  • vue前端页面数据加载怎么添加loading效果
    这篇文章主要介绍了vue前端页面数据加载怎么添加loading效果的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇vue前端页面数据加载怎么添加loading效果文章都会有所收获,下面我们一起来看看吧。前端页面数...
    99+
    2023-07-02
  • 原生JS Intersection Observer API实现懒加载
    目录引言Intersection Observer API使用方法Lazy Loading引言 前一阵子在做一个项目的时候,因为每组数据都要先通过很庞大的计算,才把计算后的结果 Re...
    99+
    2024-04-02
  • Vue实现网页首屏加载动画及页面内请求数据加载loading效果
    目录简介:使用范例:1、四圆点加载动画2、旋涡加载动画3、电池状态加载动画4、请求数据缓慢实现loading提示【推荐】Ⅰ、封装loading组件【推荐】Ⅱ、通过elementUI实...
    99+
    2023-02-10
    vue 加载动画 vue 页面加载动画 vue 页面加载
  • JS如何实现图片预加载之无序预加载功能
    这篇文章主要介绍JS如何实现图片预加载之无序预加载功能,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!图片预加载之无序预加载的效果图如下所示,如果大家感觉不错,请参考实现代码。具体代码...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作