Vue浅析axios二次封装与节流及防抖的实现

 更新时间:2022年08月11日 17:14:44   作者:_rosy  
axios是基于promise的HTTP库,可以使用在浏览器和node.js中,它不是vue的第三方插件,vue-axios是axios集成到Vue.js的小包装器,可以像插件一样安装使用:Vue.use(VueAxios, axios),本文给大家介绍axios的二次封装和节流与防抖

什么是axios

Axios,是一个基于 promise 的网络请求库,作用于node.js和浏览器中,它是 isomorphic 的(即同一套代码可以运行在浏览器和node.js中)。

使用方式如下:

<script>
        //调用axios方法得到的返回值是 promise 对象
        axios({
            //请求方式
            method: 'get',
            // 请求地址
            url: 'http://www.liulongbin.top:3006/api/getbooks'//黑马的老师提供的地址
        }).then(function(books) {
            console.log(books.data)
        })
        // 另一种写法
        const result = axios({
            method: 'get',
            url: 'http://www.liulongbin.top:3006/api/getbooks'
        })
        result.then(function(books){
            console.log(books.data)
        })
    </script>

axios请求图例

axios的二次封装

为什么要进行二次封装

请求拦截器和响应拦截器

  • 请求拦截器:可以在发请求之前可以处理一些业务
  • 响应拦截器:当服务器数据返回以后,可以处理一些事情

代码如下:

//对于axios进行二次封装
import axios from 'axios'
import nprogress from 'nprogress';
// start:进度条开始 done:进度条结束
//1:利用axios对象的方法create,去创建一个axios实例
//引入进度条样式
import 'nprogress/nprogress.css'
//2:request就是axios,只不过稍微配置一下子
const requests =axios.create({
    //配置对象
    //基础路径,发请求的时候,;路径中会出现/api,自己就不用手动添加了
    baseURL:'/api',//这里实现二次封装
    //设置请求超时时间5s
    timeout:5000,
});
//请求拦截器:在发送请求之前可以检测到,可以在请求发出去之前做一些事情
requests.interceptors.request.use((config)=>{
    //config:配置对象,对象里面有一个很重要的header请求头
    nprogress.start()//请求网络接口进度条开始
    return config;
});
//响应拦截器
requests.interceptors.response.use((res)=>{
    //成功的回调函数:服务器相应的数据回来之后,响应拦截器可以检测到,可以做一些事情
    nprogress.done()//请求网络接口进度条结束
    return res.data;
},(error)=>{
    console.log(error)
    return Promise.reject(new Error('faile'));
})
//对外暴露
export default requests;

防抖与节流

概念:

  • 节流:在规定的时间范围内不会重复触发回调,只有大于这个时间间隔才会触发回调,把频繁触发变为少量触发。
  • 防抖:前面的所有触发都被取消,最后一次执行在规定的时间之后才会触发,也就是说如果连续快速的触发,只会执行一次

节流可以理解为游戏里面的技能cd时间,你使用一次后只能等下一次时间好了,才可以释放技能,我们这里就是才可以调用这个函数。它的意义就是防止因为用户多次点击造成多次请求服务器,从而返回错误的信息。有时候也造成浏览器没有充足的时间去解析。我这里设置的时间是3s,在三秒内无论你怎么点击都不会产生效果。demo如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
   <h2>计数器count的值为<span>0</span></h2>
    <title>防抖节流小案例</title>
</head>
<body>
     <button onclick="add()">点我加一</button>
</body>
</html>
<script>
    /* 防止重复点击 */
    let count=0;
let clickTimer = 0
 function add() {
     let now = +new Date(); // 获取当前时间的时间戳
     let timer = clickTimer; // 记录触发事件的事件戳
     let span =document.querySelector('span');
     if (now - timer < 3000) {
     // 如果当前时间 - 触发事件时的事件 < 3s,那么不符合条件,直接return ,
     // 不让当前事件继续执行下去
         return ;
     } else { 
     // 反之,记录符合条件触发了事件的时间戳,使事件继续往下执行
         clickTimer = now;
         count++;
        span.innerHTML=count
         console.log(count)
     }
 }
</script>

用户操作很频繁但是只执行最后一次。防抖可以理解为回城,被打断了就要重新读秒。下面是一个封装好的防抖函数

 function debounce(fn, time) {//fn是一个函数,time是延迟时间
    let timeID = null //初始化定时器id
    return function () {
      if (timeID !== null) {
        clearTimeout(timeID) //如果id不为空则清空定时器,从新执行定时器
      }
      timeID = setTimeout(() => {//定时器返回一个id
        fn.call(this)//如果时间到了且id不为空则产生回调函数执行原本的fn函数
      }, time||2000);//如果time不传或为空则默认延迟时间为2s
    }
  }

这里要注意防抖和节流的区别,节流是由执行很多次变为执行少量次数,防抖是有多次变为执行最后一次

到此这篇关于Vue浅析axios二次封装与节流及防抖的实现的文章就介绍到这了,更多相关Vue axios内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • vue中filter的应用场景详解

    vue中filter的应用场景详解

    这篇文章主要为大家介绍了vue中filter的应用场景,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2021-11-11
  • vue项目中实现el-dialog组件可拖拽效果

    vue项目中实现el-dialog组件可拖拽效果

    本文主要介绍了vue项目中实现el-dialog组件可拖拽效果,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • Vue.js 2.0学习教程之从基础到组件详解

    Vue.js 2.0学习教程之从基础到组件详解

    这篇文章主要介绍了Vue.js 2.0从基础到组件的相关资料,文中介绍的非常详细,对大家学习或者使用vue.js具有一定的参考价值,需要的朋友可以参考学习,下面来一起看看吧。
    2017-04-04
  • vue基于viewer实现的图片查看器功能

    vue基于viewer实现的图片查看器功能

    这篇文章主要介绍了vue基于viewer实现的图片查看器的实例代码,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-04-04
  • Jenkins自动化部署Vue项目的方法实现

    Jenkins自动化部署Vue项目的方法实现

    本文主要介绍了Jenkins自动化部署Vue项目的方法实现,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-04-04
  • vue + element-ui的分页问题实现

    vue + element-ui的分页问题实现

    这篇文章主要介绍了vue + element-ui的分页问题实现,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-12-12
  • vue2实现封装动态表单组件

    vue2实现封装动态表单组件

    这篇文章主要介绍了vue2实现封装动态表单组件,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-08-08
  • vue draggable组件实现拖拽及点击无效问题的解决

    vue draggable组件实现拖拽及点击无效问题的解决

    这篇文章主要介绍了vue draggable组件实现拖拽及点击无效问题的解决,只需要在设置handle属性就可以了,.defaultTypeTag 是要拖拽的块的类名,要注意的是需要做点击事件的项不能包含在这个类名里面,不然会无法触发点击事件,详细解决办法跟随小编一起学习吧
    2022-05-05
  • vue.js 左侧二级菜单显示与隐藏切换的实例代码

    vue.js 左侧二级菜单显示与隐藏切换的实例代码

    这篇文章主要介绍了vue.js 左侧二级菜单显示与隐藏切换的实例代码,需要的朋友可以参考下
    2017-05-05
  • 如何在vue中使用pdfjs预览pdf文件

    如何在vue中使用pdfjs预览pdf文件

    本文主要讲解了如何在vue中使用pdfjs预览pdf文件,这样的优势是无须让用户安装专门的软件即可实现预览,下面就看看如何实现这个需求
    2021-06-06

最新评论