马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
x
Vue + Axios 封装全局接口防抖和节流设置
在 Vue 中,可以通过创建一个全局的 axios 实例来封装接口哀求。下面我们将根据需求,对 axios 实例进行编写,实现防抖和节流功能。
防抖
在实现防抖之前,我们先来先容一下什么是“防抖”。在前端开辟中,“防抖”指的是在肯定时间内只能触发一次变乱,通常是输入框或滚动变乱。假如没有防抖控制,页面会出现一些非常环境,比方:搜索框输入过快、滚动条跳动频繁等。
实现原理
防抖的实现原理非常简单,就是通过对要实行的函数进行耽误处理,以此来控制函数实行的次数。具体流程如下:
- 界说一个变量用于保存计时器。
- 在函数实行前判断计时器是否存在,假如存在则清除计时器。
- 为函数设置时间耽误,将返回结果保存到计时器变量中。
- 等候时间凌驾设定的阈值后,实行相应的回调函数。
下面是防抖代码的示例:
- 1.定义一个变量用于保存上一次执行函数的时间。
- 2.则清除计时器。
- 3.为函数设置时间延迟,将返回结果保存到计时器变量中。
- 4.等待时间超过设定的阈值后,执行相应的回调函数。
- 下面是防抖代码的示例:
- js复制代码// 防抖
- function debounce(fn, delay = 500) {
- let timer = null;
- return function(...args) {
- if (timer !== null) {
- clearTimeout(timer);
- }
- timer = setTimeout(() => {
- fn.apply(this, args);
- timer = null;
- }, delay);
- };
- }
复制代码 注意事项
在利用防抖技术的时候,必要注意以下几点:
- 时间耽误必要根据业务需求进行调解。
- 在防抖过程中,要确保函数参数传递正确。
节流
相比于防抖技术,节流技术更加灵活。在前端开辟中,“节流”通常指的是在肯定时间内只能实行一次变乱,比方:下拉加载更多、页面滚动等。
实现原理
节流技术的实现原理也非常简单,就是通过设置一个固定时间隔断,在这个时间隔断内只能实行一次相应的回调函数。具体流程如下:
- 界说一个变量用于保存上一次实行函数的时间。
- 在实行函数前获取当前的时间戳。
- 判断当前时间与上一次实行时间是否大于设定的隔断时间,假如大于,则实行相应的回调函数,并更新上一次实行时间。
- 假如小于设定的隔断时间,则等候下一次实行。
下面是节流代码的示例:
- js复制代码// 节流
- function throttle(fn, delay = 500) {
- let last = 0;
- return function(...args) {
- let now = new Date().getTime();
- if (now - last > delay) {
- last = now;
- fn.apply(this, args);
- }
- };
- }
复制代码 注意事项
在利用节流技术的时候,必要注意以下几点:
- 时间隔断必要根据业务需求进行调解。
- 在节流过程中,要确保函数参数传递正确。
- 节流过程中可能会出现滞后或者丢失部门变乱的标题,必要进行相应的处理。
封装axios实例
在 Vue 中,可以通过创建一个全局的 axios 实例来封装接口哀求。下面我们将根据需求,对 axios 实例进行编写,实现防抖和节流功能。
首先,我们必要安装 axios 插件:
- bash复制代码npm install axios --save
复制代码 然后,在 main.js 中添加以下代码:
- js复制代码import Vue from 'vue'
- import axios from 'axios'
- Vue.prototype.$http = axios
复制代码 接下来,我们将编写一个封装函数,用于通过 axios 实例对接口进行防抖和节流处理。
防抖处理
在防抖处理中,我们必要考虑以下几个方面:
- 将 axios 实例封装为一个函数。
- 在函数调用时进行防抖处理。
下面是封装 axios 实例的示例代码:
- js复制代码import axios from 'axios'
- function request(config) {
- const instance = axios.create({
- baseURL: 'http://localhost:3000/api',
- timeout: 10000
- })
- // 防抖
- const debounceTokenCancel = new Map()
- instance.interceptors.request.use(config => {
- const tokenKey = `${config.method}-${config.url}`
- const cancel = debounceTokenCancel.get(tokenKey)
- if (cancel) {
- cancel()
- }
- return config
- }, error => {
- console.log(error)
- return Promise.reject(error)
- })
- instance.interceptors.response.use(response => {
- return response
- }, error => {
- console.log(error)
- return Promise.reject(error)
- })
- return instance(config)
- }
- export default request
复制代码 在上述代码中,我们创建了一个 axios 实例,并对该实例进行了防抖处理。此中,debounceTokenCancel 变量用于保存每个哀求的计时器对象。在拦截器中,我们通过判断 debounceTokenCancel 中是否存在相应的 key,来决定是否清除计时器和重新设置计时器。
节流处理
在节流处理中,我们必要考虑以下几个方面:
- 将 axios 实例封装为一个函数。
- 在函数调用时进行节流处理。
下面是封装 axios 实例的示例代码:
- js复制代码import axios from 'axios'
- function request(config) {
- const instance = axios.create({
- baseURL: 'http://localhost:3000/api',
- timeout: 10000
- })
- // 节流
- let lastTime = new Date().getTime()
- instance.interceptors.request.use(config => {
- const nowTime = new Date().getTime()
- if (nowTime - lastTime < 1000) {
- return Promise.reject(new Error('节流处理中,稍后再试'))
- }
- lastTime = nowTime
- return config
- }, error => {
- console.log(error)
- return Promise.reject(error)
- })
- instance.interceptors.response.use(response => {
- return response
- }, error => {
- console.log(error)
- return Promise.reject(error)
- })
- return instance(config)
- }
- export default request
复制代码 在上述代码中,我们创建了一个 axios 实例,并对该实例进行了节流处理。此中,lastTime 变量用于保存上一次哀求的时间。在拦截器中,我们通过比较当前时间和上一次哀求的时间,来决定是否进行节流处理。
一个完整示例
下面是一个完整的示例代码,包罗了防抖和节流:
- js复制代码import axios from 'axios'
- function request(config) {
- const instance = axios.create({
- baseURL: 'http://localhost:3000/api',
- timeout: 10000
- })
- // 防抖
- const debounceTokenCancel = new Map()
- instance.interceptors.request.use(config => {
- const tokenKey = `${config.method}-${config.url}`
- const cancel = debounceTokenCancel.get(tokenKey)
- if (cancel) {
- cancel()
- }
- return new Promise(resolve => {
- const timer = setTimeout(() => {
- clearTimeout(timer)
- resolve(config)
- }, 800)
- debounceTokenCancel.set(tokenKey, () => {
- clearTimeout(timer)
- resolve(new Error('取消请求'))
- })
- })
- }, error => {
- console.log(error)
- return Promise.reject(error)
- })
- instance.interceptors.response.use(response => {
- return response
- }, error => {
- console.log(error)
- return Promise.reject(error)
- })
- // 节流
- let lastTime = new Date().getTime()
- instance.interceptors.request.use(config => {
- const nowTime = new Date().getTime()
- if (nowTime - lastTime < 1000) {
- return Promise.reject(new Error('节流处理中,稍后再试'))
- }
- lastTime = nowTime
- return config
- }, error => {
- console.log(error)
- return Promise.reject(error)
- })
- return instance(config)
- }
- export default request
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |