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

yizhihongxing

浅谈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日

相关文章

  • next.js初始化参数设置getServerSideProps应用学习

    下面我将为您详细讲解Next.js的初始化参数设置和getServerSideProps的应用学习的完整攻略。 Next.js 初始化参数设置 Next.js 是一个 React 框架,可以用于实现服务器渲染的 React 应用。初始化 Next.js 项目时,可以进行一些参数设置,以满足我们的应用程序需求。 一、创建项目 首先,您需要先在您的电脑中安装 N…

    Vue 2023年5月28日
    00
  • Vue.js实现的购物车功能详解

    下面是“Vue.js实现的购物车功能详解”的完整攻略。 确定需求 在开始Vue.js实现购物车功能之前,我们需要先明确我们的需求,包括: 需要展示商品列表; 需要将商品添加到购物车中; 需要展示购物车中的商品列表; 需要对购物车中的商品进行增删操作; 需要实时展示购物车总价。 准备工作 实现此功能需要准备以下工作: 安装Vue.js的开发环境; 准备好商品数…

    Vue 2023年5月27日
    00
  • 在 Vue.js中优雅地使用全局事件的方法

    在 Vue.js 中,全局事件可以在不同组件之间传递信息。但是如果使用不合适,会导致代码变得混乱和难以维护。下面让我们看一下如何优雅地使用 Vue.js 中的全局事件。 什么是全局事件 在 Vue.js 中,我们可以使用自定义事件系统来在不同组件之间传递信息。在根组件中使用 $emit 方法触发自定义事件,在其他组件中使用 $on 监听自定义事件。 全局事件…

    Vue 2023年5月28日
    00
  • VUE v-for循环中每个item节点动态绑定不同函数的实例

    要实现在VUE v-for循环中每个item节点动态绑定不同函数的实例,可以使用以下步骤: 在每个item节点上绑定一个唯一的key值,以便Vue能够追踪节点的增、删、移动操作。 <ul> <li v-for="(item, index) in items" :key="item.id"> {{…

    Vue 2023年5月28日
    00
  • Vue中通过minio上传文件的详细步骤

    下面是Vue中通过Minio上传文件的详细步骤: 1. 安装minio-js 首先,需要安装minio-js,可以使用npm进行安装: npm install minio-js 2. 创建minio实例 在Vue组件中引入minio-js,并创建minio实例,示例代码如下: import Minio from ‘minio-js’ const minioC…

    Vue 2023年5月28日
    00
  • Vue.js项目前端多语言方案的思路与实践

    Vue.js是一款非常受欢迎的JavaScript框架,当我们在开发多语言网站时,很容易出现诸如语言统一、变量替换、复数、日期、货币、读取语言包等问题。本文旨在介绍一些有效的解决方案来简化多语言网站的管理和维护。 思路与实践 国际化插件 vue-i18n vue-i18n是一个用于Vue.js的国际化解决方案,它易于使用和维护,并且能够自动地将各种语言翻译成…

    Vue 2023年5月28日
    00
  • vue项目环境搭建 启动 移植操作示例及目录结构分析

    下面就来详细讲解一下“vue项目环境搭建 启动 移植操作示例及目录结构分析”的攻略。 1. 环境搭建 在开始开发 Vue 项目之前,需要先搭建好相应的环境,具体步骤如下: 1.1 安装 Node.js 在 Node.js 官网下载最新版的 Node.js 后进行安装,这里不做过多介绍。 1.2 安装 Vue CLI Vue CLI 是 Vue 的脚手架工具,…

    Vue 2023年5月28日
    00
  • Vue通过Blob对象实现导出Excel功能示例代码

    Vue通过Blob对象实现导出Excel功能示例代码 在前端开发中常常需要将数据导出为Excel表格,那么在Vue中如何通过Blob对象实现导出Excel功能呢?本文将提供一份完整的攻略供大家参考。 步骤一:安装依赖 我们需要安装两个依赖,分别是xlsx和file-saver,前者用于生成Excel文件,后者用于保存Excel文件。我们可以使用npm来进行安…

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