Vue节流的原理及应用

一、Vue节流方法

Vue的节流方法是指在某个时间间隔内只执行一次函数。这个方法适用于那些需要频繁触发的 DOM 事件函数,如scroll,mousemove等。节流的原理是设置一个定时器,在定时器内执行函数,每次函数执行完毕后清除定时器,再次触发时重新设置定时器。

二、Vue节流封装

Vue的节流可用以下封装代码,这样就可以直接在 Vue 实例中调用:

Vue.prototype.$throttle = function(fn, delay) {
  let lastTime = 0;
  return function() {
    let nowTime = new Date().getTime();
    if (nowTime - lastTime > delay) {
      fn.apply(this, arguments);
      lastTime = nowTime;
    }
  };
};

使用时可以这样:

// 定义事件函数
function handleScroll() {
  console.log("scrolling");
}
// 传入事件函数和时间间隔
window.addEventListener("scroll", this.$throttle(handleScroll, 1000));

三、Vue节流防抖

Vue的节流防抖是指在函数触发后,在规定时间之内再次触发将被忽略。这个方法适用于那些频繁触发的函数事件,如输入框的输入事件,对于一些用户需要输入,但是输入过快会导致频繁的数据更新请求,可以使用节流防抖以减少请求次数。

防抖的原理是使用 setTimeout 函数,每次触发时清除一个定时器,如果在指定时间间隔内再次触发则重新设置定时器。

Vue.prototype.$debounce = function(fn, delay) {
  let timer = null;
  return function() {
    clearTimeout(timer);
    timer = setTimeout(() => {
      fn.apply(this, arguments);
    }, delay);
  };
};

使用时可以这样:

// 定义事件函数
function handleInput() {
  console.log("inputting");
}
// 传入事件函数和时间间隔
this.$refs.input.addEventListener("input", this.$debounce(handleInput, 500));

四、Vue节流阀

Vue的节流阀是一个很实用的功能,主要用于控制短时间内多次请求。它可以控制一段时间内最多可以请求几次,达到限制后会自动暂停。这个功能适用于那些用户触发频率高,但是并不需要每个都更新后端数据的情况,适用于推荐列表,热门搜索等。

Vue.prototype.$createThrottleValve = function(limitCount, limitTime) {
  const records = [];
  let timer = null;
  return function(fn) {
    const now = Date.now();
    records.push(now);
    if (records.length > limitCount) {
      const removeCount = records.findIndex(
        (time) => now - time = limitCount) {
      clearTimeout(timer);
      const firstTime = records[0];
      const diffTime = limitTime - (now - firstTime);
      timer = setTimeout(() => {
        fn();
      }, diffTime);
      return;
    }
    fn();
  };
}

使用时可以这样:

// 定义事件函数
function handleHotSearch() {
  console.log("request hot search");
}
// 传入事件函数和请求限制
const throttleValve = this.$createThrottleValve(5, 1000);
this.$refs.hotSearch.addEventListener("click", function() {
  throttleValve(handleHotSearch);
});

五、Vue节流只执行最后一次接口

Vue的节流还可以只执行最后一次接口。这个方法适用于在一些需要连续触发请求的场景下,只需要保留最后一次的数据更新即可。还是使用 setTimeout 函数来实现的,但是需要注意到如果设置间隔时间太短则不会执行两次,需要根据实际场景调整时间。

Vue.prototype.$onlyLastReq = function(fn, delay) {
  let timer = null;
  return function() {
    clearTimeout(timer);
    timer = setTimeout(() => {
      fn.apply(this, arguments);
    }, delay);
  };
};

使用时可以这样:

// 定义事件函数
function handleUpdate() {
  console.log("request update");
}
// 传入事件函数和时间间隔
window.addEventListener("scroll", this.$onlyLastReq(handleUpdate, 500));

六、Vue节流指令

对于一些频繁触发的 DOM 事件,还可以使用 Vue 的自定义指令来实现节流。在注册指令时可以通过参数传入时间间隔,对于同一 DOM 元素,限制时间间隔内只能被触发一次。

Vue.directive('throttle-click',{
  inserted:function(el,binding){
    let delay = binding.arg || 600
    let timer
    el.addEventListener('click', () => {
      if(!timer){
        timer = setTimeout(() => {
          timer = null
          binding.value()
        }, delay)
      }
    })
  }
})

使用时可以这样:


七、Vue节流防抖插件

Vue还有很多优秀的开源插件可供使用,其中就有很多封装了 Vue 的节流或防抖功能。

如 lodash 的 debounce 函数:

import _ from 'lodash'

export default {
  methods:{
    handleClick: _.debounce(function(){
      console.log('click')
    }, 1000)
  }
}

使用时可以这样:


八、Vue节流按钮

Vue 的节流按钮是一个非常实用的功能,可以在限制时间内防止按钮重复点击。可以使用组件封装的方式来实现节流按钮。


  



export default {
  props: {
    handler: { type: Function, required: true },
    delay: { type: Number, default: 300 },
    text: { type: String, default: "Click" },
  },
  data() {
    return {
      isThrottling: false,
    };
  },
  computed: {
    buttonText() {
      return this.isThrottling ? `${this.text}ing...` : this.text;
    },
  },
  methods: {
    runHandler() {
      if (!this.isThrottling) {
        this.isThrottling = true;
        this.handler();
        setTimeout(() => {
          this.isThrottling = false;
        }, this.delay);
      }
    },
  },
};

使用时可以这样:


九、Vue节流函数失效选取

在使用 Vue 的节流或防抖方法时,需要根据不同实际情况和业务需求选择不同的节流方法,避免出现无效操作和效果不佳的情况。

节流方法的间隔时间不能过长或过短,过长会影响用户的体验,过短会导致触发事件太频繁,失去节流效果。

防抖方法的间隔时间也不能过长或过短,过长会导致用户输入有延迟的感觉,过短则会导致多次请求,降低性能。

同时,需要根据实际业务需求选择节流阀或只保留最后一次接口等方法,避免频繁请求和更新。

总结

Vue提供了多种节流防抖方法和插件,可以用来优化用户体验和提高性能。需要根据实际业务需求选择不同的节流方法,避免出现无效操作和效果不佳的情况。

原创文章,作者:RDVYX,如若转载,请注明出处:https://www.506064.com/n/325204.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
RDVYX的头像RDVYX
上一篇 2025-01-13 13:23
下一篇 2025-01-13 13:23

相关推荐

  • 使用Vue实现前端AES加密并输出为十六进制的方法

    在前端开发中,数据传输的安全性问题十分重要,其中一种保护数据安全的方式是加密。本文将会介绍如何使用Vue框架实现前端AES加密并将加密结果输出为十六进制。 一、AES加密介绍 AE…

    编程 2025-04-29
  • Harris角点检测算法原理与实现

    本文将从多个方面对Harris角点检测算法进行详细的阐述,包括算法原理、实现步骤、代码实现等。 一、Harris角点检测算法原理 Harris角点检测算法是一种经典的计算机视觉算法…

    编程 2025-04-29
  • 瘦脸算法 Python 原理与实现

    本文将从多个方面详细阐述瘦脸算法 Python 实现的原理和方法,包括该算法的意义、流程、代码实现、优化等内容。 一、算法意义 随着科技的发展,瘦脸算法已经成为了人们修图中不可缺少…

    编程 2025-04-29
  • Vue TS工程结构用法介绍

    在本篇文章中,我们将从多个方面对Vue TS工程结构进行详细的阐述,涵盖文件结构、路由配置、组件间通讯、状态管理等内容,并给出对应的代码示例。 一、文件结构 一个好的文件结构可以极…

    编程 2025-04-29
  • 神经网络BP算法原理

    本文将从多个方面对神经网络BP算法原理进行详细阐述,并给出完整的代码示例。 一、BP算法简介 BP算法是一种常用的神经网络训练算法,其全称为反向传播算法。BP算法的基本思想是通过正…

    编程 2025-04-29
  • Vue3的vue-resource使用教程

    本文将从以下几个方面详细阐述Vue3如何使用vue-resource。 一、安装Vue3和vue-resource 在使用vue-resource前,我们需要先安装Vue3和vue…

    编程 2025-04-27
  • GloVe词向量:从原理到应用

    本文将从多个方面对GloVe词向量进行详细的阐述,包括其原理、优缺点、应用以及代码实现。如果你对词向量感兴趣,那么这篇文章将会是一次很好的学习体验。 一、原理 GloVe(Glob…

    编程 2025-04-27
  • ThinkPHP6 + Vue.js: 不使用Fetch的数据请求方法

    本文将介绍如何在ThinkPHP6和Vue.js中进行数据请求,同时避免使用Fetch函数。 一、AJAX:XMLHttpRequest的基础使用 在进行数据请求时,最基础的方式就…

    编程 2025-04-27
  • Vue模拟按键按下

    本文将从以下几个方面对Vue模拟按键按下进行详细阐述: 一、Vue 模拟按键按下的场景 在前端开发中,我们常常需要模拟按键按下的场景,比如在表单中填写内容后,按下“回车键”提交表单…

    编程 2025-04-27
  • 编译原理语法分析思维导图

    本文将从以下几个方面详细阐述编译原理语法分析思维导图: 一、语法分析介绍 1.1 语法分析的定义 语法分析是编译器中将输入的字符流转换成抽象语法树的一个过程。该过程的目的是确保输入…

    编程 2025-04-27

发表回复

登录后才能评论