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

yizhihongxing

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日

相关文章

  • vue项目配置eslint保存自动格式化问题

    下面是关于Vue项目配置ESLint保存自动格式化的完整攻略: 安装相关插件 首先,需要在Vue项目中安装eslint和eslint-plugin-prettier两个插件,可以使用npm安装,命令如下: npm install eslint eslint-plugin-prettier –save-dev 配置.eslintrc.js文件 在Vue项目的…

    Vue 2023年5月28日
    00
  • 使用Vue逐步实现Watch属性详解

    使用Vue逐步实现Watch属性详解,需要以下几个步骤: 创建一个Vue实例,定义data属性。例如,创建一个input框和一个div标签,将input的值绑定到data中的message属性,将div标签的内容绑定到data中的output属性。 <div id="app"> <input v-model="…

    Vue 2023年5月27日
    00
  • Vue.js如何获取data-*的值

    当我们需要在 Vue.js 中获取 HTML 标签上的 data-* 属性值时,我们可以通过以下两种方式实现: 方式一:在模板中使用 我们可以在 HTML 模板中使用 v-bind 指令或简写的 : 符号将 data-* 属性值绑定到 Vue.js 实例的数据对象中,然后通过数据对象的属性获取值。 HTML 模板代码: <div id="ap…

    Vue 2023年5月27日
    00
  • Vue前端框架搭建过程

    下面是关于”Vue前端框架搭建过程”的完整攻略: 1. 准备工作 1.1 下载安装Node.js 首先,我们需要确保电脑中已经安装了Node.js的环境,如果还没有,可以在官网上下载并安装。 Node.js官网:https://nodejs.org/en/ 安装完成后,可以在终端或命令行中输入以下命令,检查Node.js版本: node -v 1.2 安装V…

    Vue 2023年5月27日
    00
  • vue-cli 3.0 自定义vue.config.js文件,多页构建的方法

    我将会详细讲解“vue-cli 3.0自定义vue.config.js文件,多页构建的方法”的完整攻略。 什么是vue-cli 3.0? vue-cli是一个官方的Vue.js脚手架,它可以快速搭建一个完整的Vue.js开发环境,提供了现代化的构建工具和工作流程。 自定义vue.config.js文件 在使用vue-cli 3.0开发项目时,我们可以通过自定…

    Vue 2023年5月28日
    00
  • vue-router源码之history类的浅析

    下面我会为你详细讲解“vue-router源码之history类的浅析”的完整攻略。 一、什么是 vue-router 的 history 类? vue-router 提供了多种模式的路由实现,其中一种就是 history 模式。这种模式使用了 HTML5 提供的 History API,可以在不刷新页面的情况下改变浏览器的 URL。 vue-router …

    Vue 2023年5月28日
    00
  • Vue中状态管理器(vuex)详解以及实际应用场景

    Vue中状态管理器(Vuex)详解以及实际应用场景 一、什么是Vuex Vuex是一个用于Vue.js应用程序的状态管理模式。它采用集中式存储管理应用的所有组件状态,并以相应的规则保证状态以一种可预测的方式发生变化。Vuex 也集成到 Vue 的官方调试工具 devtools extension ,提供了诸如零配置的 time-travel 调试、状态快照导…

    Vue 2023年5月27日
    00
  • 基于CSS实现MaterialUI按钮点击动画并封装成 React 组件

    下面我会详细讲解如何基于CSS实现MaterialUI按钮点击动画并封装为React组件。 1.准备工作 安装MaterialUI 首先需要安装MaterialUI,可以使用npm或yarn进行安装。 npm install @material-ui/core //或使用yarn yarn add @material-ui/core 创建按钮组件 接着需要创…

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