1. 什么是防抖节流

防抖:防止重复点击触发事件

首先啥是抖? 抖就是一哆嗦!原本点一下,现在点了3下!不知道老铁脑子是不是很有画面感!哈哈哈哈哈哈

典型应用就是防止用户多次重复点击请求数据。

代码实现要点:设置一个定时器,通过闭包,抓住定时器变量,控制定时器的添加和清除

直接上代码

  function debounce(fn, time) {
let _arguments = arguments
let timeout = null
return function () {
if (timeout) {
clearTimeout(timeout)
}
timeout = setTimeout(() => {
fn.call(this, _arguments)
}, time);
}
}

节流:指定时间间隔内只会执行一次任务

大家都玩过FPS游戏吧(没玩过???打枪知道了吧!)道具的射速是一定的,不会因为你点击鼠标的速度加快而增加。

代码实现要点:通过一个布尔变量作为状态,判断代码是否需要执行

直接上代码

  function throttle(fn, time) {
let _arguments = arguments
let canRun = true
return function () {
if (!canRun) return
canRun = false
setTimeout(() => {
fn.call(this, _arguments)
canRun = true
}, time);
}
}

2. 在Vue中优雅的使用

我的应用场景:头像裁剪组件,对滚轮缩放后生成预览图片进行防抖处理

因为Vue组件中的 this 原因

methods:{
previewImageDebounce: Debounce(this.previewImage, 1000),
}
//报错 Uncaught TypeError: Cannot read property 'previewImage' of undefined

我们要针对上面的防抖函数进行改造(函数内容this指向没问题,我们通过函数名调用函数)

/*
* description: 在vue中使用的防抖函数
* param fnName {String} 函数名
* param time {Number} 延迟时间
* return: 处理后的执行函数
*/
function VueDebounce(fnName, time) {
let timeout = null;
return function() {
if (timeout) {
clearTimeout(timeout);
}
timeout = setTimeout(() => {
this[fnName]();
}, time);
};
}

在Vue组件中使用

methods:{
/* 监听滚轮滑动 */
Wheel(ev) {
if (!this.newImage) return;
// 判断放大和缩小
ev.deltaY > 0 ? this.makeScaleChange(1) : this.makeScaleChange(0);
// 预览图片
this.previewImageDebounce();
},
/* 预览图片(防抖处理后) */
previewImageDebounce: VueDebounce("previewImage", 1000),
/* 预览图片 */
previewImage() {......}
}

这样的写法,算是很优雅了。节流就不在这里展开了,开动你的小脑袋不成问题。

如何在Vue中优雅的使用防抖节流的更多相关文章

  1. 如何在MyBatis中优雅的使用枚举

    问题 在编码过程中,经常会遇到用某个数值来表示某种状态.类型或者阶段的情况,比如有这样一个枚举:   public enum ComputerState { OPEN(10), //开启 CLOSE( ...

  2. 如何在 Swoole 中优雅的实现 MySQL 连接池

    如何在 Swoole 中优雅的实现 MySQL 连接池 一.为什么需要连接池 ? 数据库连接池指的是程序和数据库之间保持一定数量的连接不断开, 并且各个请求的连接可以相互复用, 减少重复连接数据库带来 ...

  3. 如何在vue中使用ts

    注意:此文并不是把vue改为全部替换为ts,而是可以在原来的项目中植入ts文件,目前只是实践阶段,向ts转化过程中的过渡. ts有什么用? 类型检查.直接编译到原生js.引入新的语法糖 为什么用ts? ...

  4. 如何在Vue中建立全局引用或者全局命令

    1 一般在vue中,有很多vue组件,这些组件每个都是一个文件.都可能需要引用到相同模块(或者插件).我们不想每个文件都import 一次模块. 如果是基于vue.js编写的插件我们可以用 Vue.u ...

  5. 如何在vue中使用svg

    1.安装依赖 npm install svg-sprite-loader --save-dev 2.在config文件中配置    const path = require('path'); func ...

  6. 如何在vue中修改动态标签中的样式和修改组件库样式

    vue中修改动态标签中的样式和修改组件库样式 因为vue中的标签在渲染的时候,都会给标签加上id 所以你想在<style lang="scss" scoped>直接修改 ...

  7. 如何在 vue 中添加权限控制管理?---vue中文社区

    前言 在一个项目中,一些功能会涉及到重要的数据管理,为了确保数据的安全,我们会在项目中加入权限来限制每个用户的操作.作为前端,我们要做的是配合后端给到的权限数据,做页面上的各种各样的限制. 需求 因为 ...

  8. 如何在vue中使用sass

    使用sass,我们需要安装sass的依赖包 npm install --save-dev sass-loader //sass-loader依赖于node-sass npm install --sav ...

  9. 在vue中优雅地实现简单页面逆传值

    [需求] 要实现的需求很简单,页面从A -> B,用户在B触发操作,将一些数据带回到A页面,在网上找了好久也只看到有人问,但总找不到很好答案.要实现的效果图如下: [联想] 在 ios 开发中, ...

随机推荐

  1. R语言实战(二) 创建数据集

    2.1 数据集的概念 不同的行业对于数据集的行和列叫法不同.统计学家称它们为观测(observation)和变量(variable),数据库分析师则称其为记录(record)和字段(field),数据 ...

  2. des 加密解密工具类

    最近在做des的双对称加密解密,特此记录一下. des对称加密,是一种比较传统的加密方式,其加密运算.解密运算使用的是同样的密钥,信息的发送者和信息的接收者在进行信息的传输与处理时,必须共同持有该密码 ...

  3. vue基础----组件通信($parent,$children)

    1.按照dom的父子级关系,在子组件中可以通过$parent 直接调用父组件的方法,也可得到父组件的属性. 2.在父组件中通过$childrens可以得到一个子组件数组,能够在父组件中调用子组件的方法 ...

  4. linux工具集

    1.ag:比grep.ack更快的递归搜索文件内容 安装: 1:首先在linux创建个sh文件->ag.sh 2:在ag.sh里面输入如下内容并保存 set -x TEMP_DIR=$(mkte ...

  5. java批量处理

    最近用到Java批量处理,一次性处理多个文件夹下的多个文件,在此记录一下. 我的思路:首先要保证文件夹和文件夹下的文件的命名是有规律的,利用for循环,每次自增变量,再拼接字符串,从而得到各个文件的路 ...

  6. Java的反射基础技术

    今天本人给大家讲解一下Java的反射基础技术,如有不对的或者讲的不好的可以多多提出,我会进行相应的更改,先提前感谢提出意见的各位了!!! 什么是反射? 反射它是根据字节码文件可以反射出类的信息.字段. ...

  7. gradle管理的Springboot使用JSP详解

    大家知道现在的springboot默认经不支持jsp了,但是还是可以用的,需要加一些配置. 我使用的springboot是用gradle构造的,现在跟着我一步步来吧! 一,新建一个springBoot ...

  8. Scala尾递归

    递归函数应用 首先,我们来对比两个递归方法的求值步骤. 假设有方法gcd,用来计算两个数的最大公约数.下面是欧几里得算法的实现: def gcp(a: Int, b: Int): Int = if ( ...

  9. vue前端登录

    登陆流程 1.用户登录从后台获取 token,菜单数据 2.将token和菜单数据存入sessionStorage,token用来校验用户是否已经登录 2.将返回的菜单数据前端生成对应菜单列表 3.处 ...

  10. mysql & Tomcat使用问题记录

    mysql使用问题记录 1.mysql如何修改root密码 a.进入mysql安装目录b.登录 mysql -u root -pc.修改密码 mysql> SET PASSWORD FOR ro ...