浅谈VUE防抖与节流的最佳解决方案(函数式组件)

浅谈VUE防抖与节流的最佳解决方案

什么是防抖和节流

防抖和节流是前端开发中常用的性能优化技巧,其中防抖是指防止在短时间内重复触发同一事件,而节流是指在一段时间内最多只能触发一次事件。这两种技术的应用场景主要是为了避免频繁操作引起的性能问题,比如浏览器滚动、输入框输入等。

什么是函数式组件

Vue中,有两种组件,一种是常规的组件,另一种则是函数式组件。函数式组件是一种无状态、无实例的组件,不支持响应式原理和ref属性等,但是由于其不可变的特性,使得其对于实现防抖与节流的最佳方案来说具有一定的优势。

函数式组件实现防抖与节流

防抖的实现

防抖可以通过在组件的props参数中传入一个prop:debounce,其值为防抖的时间间隔,然后在组件的data中保存一个私有变量timeId,用于记录setTimeout的id。具体实现代码如下所示:

<template>
  <button @click="handleClick">点击防抖</button>
</template>

<script>
  export default {
    props: {
      debounce: {
        type: Number,
        default: 300
      }
    },
    data() {
      return {
        timeId: null
      }
    },
    methods: {
      handleClick() {
        if (this.timeId) {
          clearTimeout(this.timeId)
        }
        this.timeId = setTimeout(() => {
          console.log('触发防抖')
        }, this.debounce)
      }
    }
  }
</script>

在上面的代码中,当点击按钮时,就会调用handleClick方法,如果timeId不为空,则说明之前已经设置了setTimeout,需要清除之前的定时器。接着,重新设置一个定时器,在指定的时间间隔内如果没有再次点击,则触发防抖。

节流的实现

节流可以通过在组件的props参数中传入一个prop:throttle,其值为节流的时间间隔,然后在组件的data中保存一个私有变量flag,用于判断是否可以触发节流。具体实现代码如下所示:

<template>
  <button @click="handleClick">点击节流</button>
</template>

<script>
  export default {
    props: {
      throttle: {
        type: Number,
        default: 300
      }
    },
    data() {
      return {
        flag: true
      }
    },
    methods: {
      handleClick() {
        if (!this.flag) {
          return
        }
        this.flag = false
        setTimeout(() => {
          console.log('触发节流')
          this.flag = true
        }, this.throttle)
      }
    }
  }
</script>

在上面的代码中,当点击按钮时,就会调用handleClick方法,如果flag为false,则说明在指定的时间间隔内已经触发过节流,不再执行。如果flag为true,则可以执行节流,同时设置定时器,在指定的时间间隔内将flag设置为true,代表可以再次触发节流。

示例说明

以下是两条示例说明:

示例一:防止搜索框短时间内重复请求

在搜索框中输入关键词时,通常需要使用防抖技术,避免短时间内发起多次请求。可以封装一个函数式组件,通过debounce prop来控制防抖的时间间隔,具体代码如下所示:

<template>
  <input @input="handleInput" placeholder="搜索">
</template>

<script>
  export default {
    props: {
      debounce: {
        type: Number,
        default: 300
      }
    },
    data() {
      return {
        timeId: null
      }
    },
    methods: {
      handleInput(event) {
        if (this.timeId) {
          clearTimeout(this.timeId)
        }
        this.timeId = setTimeout(() => {
          console.log(`发送请求:${event.target.value}`)
        }, this.debounce)
      }
    }
  }
</script>

在上面的代码中,当输入框输入内容时,就会触发handleInput方法。如果timeId不为空,则说明之前已经设置了setTimeout,需要清除之前的定时器。接着,重新设置一个定时器,在指定的时间间隔内如果没有再次输入,则发送请求。

示例二:防止按钮被多次点击

在某些业务场景中,需要处理连续点击按钮的问题,比如在网站的交易页面中提交订单时。可以封装一个函数式组件,通过throttle prop来控制节流的时间间隔,具体代码如下所示:

<template>
  <button @click="handleClick">{{ buttonText }}</button>
</template>

<script>
  export default {
    props: {
      throttle: {
        type: Number,
        default: 3000
      },
      buttonText: {
        type: String,
        default: '提交订单'
      }
    },
    data() {
      return {
        flag: true
      }
    },
    methods: {
      handleClick() {
        if (!this.flag) {
          return
        }
        this.flag = false
        setTimeout(() => {
          console.log('提交订单')
          this.flag = true
        }, this.throttle)
      }
    }
  }
</script>

在上面的代码中,当点击按钮时,就会触发handleClick方法。如果flag为false,则说明在指定的时间间隔内已经提交过订单,不再执行。如果flag为true,则可以执行提交订单,同时设置定时器,在指定的时间间隔内将flag设置为true,代表可以再次提交订单。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:浅谈VUE防抖与节流的最佳解决方案(函数式组件) - Python技术站

(0)
上一篇 2023年5月28日
下一篇 2023年5月28日

相关文章

  • Vue生命周期中的八个钩子函数相机

    Vue生命周期中的八个钩子函数是Vue组件在创建、挂载、更新、销毁过程中执行的钩子函数。这些钩子函数在Vue组件中起到了重要的作用,以便开发者在这些组件生命周期的不同时期进行不同的操作。这八个钩子函数分别是: beforeCreate:在Vue实例被创建后,数据观测 (data observer) 和 event/watcher 事件配置之前被调用。 cre…

    Vue 2023年5月28日
    00
  • 你要的Vue面试题都在这里

    针对“你要的Vue面试题都在这里”的完整攻略,我将从以下几个方面进行说明: 项目介绍 如何使用 示例说明 1. 项目介绍 该项目是一份Vue面试题的集锦。主要是收集了一些常见的Vue面试题,涵盖了Vue基础、Vue组件、Vue实践等各个方面。通过该项目,可以帮助大家更好的了解Vue,提升自己的Vue技能。 2. 如何使用 该项目是一个Github仓库,可以通…

    Vue 2023年5月28日
    00
  • Vue结合后台导入导出Excel问题详解

    以下是“Vue结合后台导入导出Excel问题详解”的完整攻略,分为以下几个部分: 理解前端导入导出Excel的实现原理 理解后台导入导出Excel的实现原理 实现前端导入导出Excel的示例 实现后台导入导出Excel的示例 1. 理解前端导入导出Excel的实现原理 前端导入导出Excel的实现原理是通过xlsx.js或者file-saver.js实现。x…

    Vue 2023年5月27日
    00
  • 解决ElementUI中tooltip出现无法显示的问题

    解决ElementUI中tooltip出现无法显示的问题 问题现象 在使用ElementUI的tooltip时,经常会出现tooltip无法显示的情况。鼠标悬停在元素上,但是tooltip并没有弹出来。这种问题通常是由于tooltip所依附的元素没有绑定事件导致的。 解决方法 方法一:使用v-tooltip指令 在使用ElementUI的tooltip时,我…

    Vue 2023年5月28日
    00
  • vue+el-upload实现多文件动态上传

    要实现多文件动态上传,我们可以使用Vue.js提供的el-upload组件来实现。下面是实现此功能的具体步骤: 步骤1:安装el-upload npm install element-ui -S 步骤2:导入el-upload组件 在Vue组件中导入el-upload组件。在main.js文件中引入element-ui: import Vue from ‘v…

    Vue 2023年5月28日
    00
  • undefined是否会变为null原理解析

    undefined与null都是JavaScript中的特殊值,但它们的含义有所不同。undefined表示一个未定义的变量,而null表示一个空对象指针。这两个值是不同的,但有时它们会被混淆,在JavaScript中,undefined是否会变为null是一个常见的疑问。接下来,我们将进行详细解释。 undefined和null的定义 先来看一下undef…

    Vue 2023年5月27日
    00
  • Vue组件开发之异步组件详解

    Vue组件开发之异步组件详解 什么是异步组件 异步组件,即按需加载组件,是指将组件拆分成各个小模块,并根据需要动态加载组件。这样可以在首次加载应用时,只加载必要的资源,以提升应用的性能。 异步组件使用方法 在 Vue.js 中,如何使用异步组件呢?在 Vue.js 中,我们可以通过 import() 语法或使用特殊的 async component 语法定义…

    Vue 2023年5月28日
    00
  • axios的简单封装以及使用实例代码

    下面是对于“axios的简单封装以及使用实例代码”的完整攻略: 1. axios基础概念 axios是一个基于Promise的HTTP客户端,用于浏览器和Node.js。 它支持同步请求和异步请求,并提供了优秀的HTTP拦截器。 axios提供了丰富的配置项,例如设置请求头、设置请求方式、设置超时时间等。 2. 封装axios 对axios进行简单的封装可以…

    Vue 2023年5月28日
    00
合作推广
合作推广
分享本页
返回顶部