Vue中函数防抖节流的理解及应用实现

Vue中函数防抖节流的理解及应用实现

在Vue中,函数防抖(debounce)和函数节流(throttle)是常用的一些技巧。

函数防抖(Debounce)

基本概念

在前端开发中,有些事件会频繁地触发,如窗口大小的改变、搜索框的输入等等。如果我们在这类事件的回调函数中添加一些比较耗时的操作,就会影响页面的性能和用户体验。

函数防抖的原理是,在事件被触发n秒后再执行回调函数,如果在这n秒内又被触发了这个事件,则重新计时。

实现方法

  • 手动实现
function debounce(func, wait) {
  let timeout
  return function() {
    const args = arguments
    const context = this
    clearTimeout(timeout)
    timeout = setTimeout(() => {
      func.apply(context, args)
    }, wait)
  }
}

上述实现方法,每当函数被调用时都会清除前一个setTimeout并重新计时。

  • 使用Lodash库中的debounce方法

在Vue中使用Lodash库是很常见的做法,Lodash的debounce方法可以让我们更快速地实现函数防抖的效果。

import debounce from 'lodash/debounce'

export default {
  methods: {
    search: debounce(function() {
      // 搜索操作
    }, 500)
  }
}

函数节流(Throttle)

基本概念

函数节流的原理是,在一定时间内,只触发一次函数,即无论事件触发多少次,回调函数在固定时间内只会执行一次。

与函数防抖相比,函数节流在固定的时间间隔时间内必然触发一次回调函数。

实现方法

  • 手动实现
function throttle(func, wait) {
  let timeout
  return function() {
    const context = this
    const args = arguments
    if (!timeout) {
      timeout = setTimeout(() => {
        timeout = null
        func.apply(context, args)
      }, wait)
    }
  }
}
  • 使用Lodash库中的throttle方法
import throttle from 'lodash/throttle'

export default {
  methods: {
    handleScroll: throttle(function() {
      // 滚动操作
    }, 500)
  }
}

常见应用实例

搜索框实时查询

我们在使用搜索框进行关键字搜索时,如果在每一次输入时都向后端服务器发起请求,会造成很大的压力,而使用函数防抖可以将频繁发起请求的问题得到很好地解决。

<template>
  <div>
    <input type="text" v-model="keyword" @input="search" />
    <ul>
      <li v-for="item in searchResult">{{item}}</li>
    </ul>
  </div>
</template>

<script>
import { debounce } from 'lodash'
export default {
  data() {
    return {
      keyword: '',
      searchResult: []
    }
  },
  methods: {
    search: debounce(function() {
      const _this = this
      // 发起后端请求
      axios.get('/search', {
        params: { keyword: _this.keyword }
      })
      .then(response => {
        _this.searchResult = response.data
      })
      .catch(error => {
        console.log(error)
      })
    }, 500)
  }
}
</script>

滚动条懒加载

如果页面中有大量图片需要展示时,在页面加载时一次性请求所有图片的资源会导致图片过多,页面加载速度变慢。而滚动条懒加载则可以让页面在首屏加载时只请求部分资源,当用户滚动到该部分时,再请求下个部分的图片资源,以优化页面的性能。

<template>
  <div>
    <div class="images" ref="images">
      <img v-for="item in showImages" :src="item.url" />
    </div>
  </div>
</template>

<script>
import { throttle } from 'lodash'
export default {
  data() {
    return {
      images: [],
      showImages: []
    }
  },
  mounted() {
    this.images = [
      {url: 'img1.jpg'}, {url: 'img2.jpg'}, {url: 'img3.jpg'}, 
      {url: 'img4.jpg'}, {url: 'img5.jpg'}, {url: 'img6.jpg'}, 
      {url: 'img7.jpg'}, {url: 'img8.jpg'}, {url: 'img9.jpg'}, 
      {url: 'img10.jpg'}, {url: 'img11.jpg'}, {url: 'img12.jpg'}
    ]
    window.addEventListener('scroll', this.handleScroll, { passive: true })
  },
  destroyed() {
    window.removeEventListener('scroll', this.handleScroll)
  },
  methods: {
    handleScroll: throttle(function() {
      const scrollTop = this.$refs.images.scrollTop
      const offset = this.$refs.images.clientHeight
      const height = this.$refs.images.scrollHeight
      if (scrollTop + offset >= height) {
        // 滑动到底部开始加载下一个图片列表
        const startIndex = this.showImages.length
        const endIndex = startIndex + 3
        this.showImages = this.showImages.concat(this.images.slice(startIndex, endIndex))
      }
    }, 300)
  }
}
</script>

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Vue中函数防抖节流的理解及应用实现 - Python技术站

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

相关文章

  • Delegate IDE build/run actions to maven 配置会影响程序运行吗?

    “Delegate IDE build/run actions to maven”这个选项是IntelliJ IDEA中的一个功能,意味着让IDEA通过Maven来进行项目构建、测试以及运行。在Maven的配置文件中,可以进行配置来指定构建、测试和运行项目时所需的依赖和其他配置。 配置会影响程序的构建过程 选择”Delegate IDE build/run …

    Vue 2023年5月28日
    00
  • 使用vue实现计时器功能

    下面是使用Vue实现计时器功能的完整攻略: 1. 准备工作 首先需要在你的项目中引入Vue.js。这里提供两种引入Vue.js的方式: 在HTML页面中通过CDN引入Vue.js。在标签中添加以下代码: <script src="https://unpkg.com/vue"></script> 通过npm安装Vue…

    Vue 2023年5月28日
    00
  • vue开发chrome插件,实现获取界面数据和保存到数据库功能

    准备工作 在开发vue开发chrome插件前,我们需要先安装vue-cli脚手架和Chrome浏览器。 安装命令: npm install -g vue-cli 创建新项目 通过vue-cli脚手架创建新项目,并选择webpack模板。 vue init webpack my-project 安装依赖: cd my-project && np…

    Vue 2023年5月28日
    00
  • vue源码nextTick使用及原理解析

    Vue源码nextTick使用及原理解析 1. nextTick的使用 nextTick是Vue实例上的一个方法,该方法用于将回调函数延迟到下次 DOM 更新循环之后执行。Vue在更新 DOM 时是异步执行的,这意味着Vue并不能保证 immediate callback 将在 DOM 更新之后被调用,因为它们可能在同一个更新周期中触发。 而使用 nextT…

    Vue 2023年5月29日
    00
  • vue上传文件formData入参为空,接口请求500的解决

    针对”vue上传文件formData入参为空,接口请求500″这一问题,可以按照以下步骤来进行排查和解决: 1.确保上传接口正确 首先需要确认上传接口是否能够正常处理上传请求,可以使用其他工具或方式来简单测试上传接口是否正常。如果上传接口正确无误,那么可以继续下一步排查。 2.确认请求头信息 当使用formData方式上传文件时,需要设置请求头信息,其中包括…

    Vue 2023年5月28日
    00
  • vue3.0 vue.config.js 配置基础的路径问题

    配置Vue.js项目的构建后的静态文件的发布路径是非常必要的。在Vue.js 3.0中,配置静态资源的发布路径的方式有所改变。本文将提供Vue.js 3.0中的vue.config.js配置多个基础路径的示例说明。 创建Vue.js 3.0项目 使用Vue CLI 3创建Vue.js 3.0项目: $ vue create my-project vue.co…

    Vue 2023年5月28日
    00
  • JavaScript进阶(四)原型与原型链用法实例分析

    关于“JavaScript进阶(四)原型与原型链用法实例分析”的完整攻略,以下是详细讲解: 什么是原型 JavaScript 中的每个对象都有一个指向它的原型。原型是一个包含属性和方法的对象,它可以被用来共享那些在多个实例之间共享内容的属性和方法。当我们在一个实例中访问一个属性或者一个方法时,它会先在实例本身中查找该属性或方法,如果没有找到,就会去实例的原型…

    Vue 2023年5月28日
    00
  • vue中如何实现变量和字符串拼接

    在Vue中实现变量和字符串拼接,最常用的方式就是使用插值表达式和模板字符串。 插值表达式 使用双大括号{{}}将变量与字符串拼接起来,如下示例: <template> <div> <p>{{ message }} World!</p> </div> </template> <scr…

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