Vue自定义指令封装节流函数的方法示例


Posted in Javascript onJuly 09, 2018

节流函数是web前端开发中经常用到的一个开发技巧,在input实时搜索,滚动事件等,为了避免过多消耗性能,我们都会使用节流函数.在《JavaScript高级程序设计》一书中有这样的一个例子:

function throttle (method, context) {
  clearTimeout((method.tId))
  method.tId = setTimeout(function () {
   method.call(context)
  }, 100)
 }

 function resizeDiv () {
  var div = document.getElementById('myDiv')
  div.style.height = div.offsetWidth + 'px'
 }

 window.onresize = function () {
  throttle(resizeDiv)
 }

这个就是很典型的函数节流的应用,不多解释,本文通过vue的自定义指令封装类似的方法.

<template>
 <div>
  <input
   type="text"
   v-model="text"
   v-debounce="search"
  >
 </div>
</template>
<script>
 export default {
  name: 'debounce',
  data () {
   return {
    msg: 'Welcome to Your Vue.js App',
    text: '',
    count: 1
   }
  },
  directives: {
   debounce: {
    inserted: function (el, binding) {
     let timer
     el.addEventListener('keyup', () => {
      if (timer) {
       clearTimeout(timer)
      }
      timer = setTimeout(() => {
       binding.value()
      }, 300)
     })
    }
   }
  },
  methods: {
   search () {
   // 实际要进行的操作 axios.get('')之类的
    this.count++
    console.log('count is:' + this.count)
   }
  }
 }
</script>

以上代码实现了一个实时搜索类的函数节流,通过vue自定义指令v-debounce实现.原本,如果我们想做一个实施搜索,那么会直接用@keyup=search,这样就会非常耗性能,键盘敲一下,就会调用一次search事件,如果是ajax请求,那么会非常不友好,所以通过v-debounce,则可以在键盘连续敲击的时候组织运行,停留300毫秒才执行.

通过vue的自定义指令,还可以将其挂载在全局,那样就能全局通过v-debounce调用了.这个比传统方法简单很多,不需要call,apply之类的.

关键点:vue 的自定义指令传递的参数binding 如果是一个函数,则通过binding.value()来执行,通过上述示例,还可以传递比如事件, 绑定对象之类的,上例绑定的是el, keyup事件,这些也可以通过binding传递,通过vue的自定义指令,可以简化很多重复代码,并且逻辑更加清晰

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
jquery 表单进行客户端验证demo
Aug 24 Javascript
精心挑选的15款优秀jQuery 本特效插件和教程
Aug 06 Javascript
js实现浏览器的各种菜单命令比如打印、查看源文件等等
Oct 24 Javascript
js调试工具Console命令详解
Oct 21 Javascript
ECMAScript6新增值比较函数Object.is
Jun 12 Javascript
javascript封装简单实现方法
Aug 11 Javascript
javascript设计模式之module(模块)模式
Aug 19 Javascript
js排序与重组的实例讲解
Aug 28 Javascript
AngularJS日期格式化常见操作实例分析
May 17 Javascript
iconfont的三种使用方式详解
Aug 05 Javascript
微信小程序实现弹出层效果
May 26 Javascript
JS pushlet XMLAdapter适配器用法案例解析
Oct 16 Javascript
JavaScript实现创建自定义对象的常用方式总结
Jul 09 #Javascript
vue-cli配置环境变量的方法
Jul 09 #Javascript
JS逻辑运算符短路操作实例分析
Jul 09 #Javascript
微信小程序中时间戳和日期的相互转换问题
Jul 09 #Javascript
使用async await 封装 axios的方法
Jul 09 #Javascript
bootstrap 弹出框modal添加垂直方向滚轴效果
Jul 09 #Javascript
jQuery实现简单复制json对象和json对象集合操作示例
Jul 09 #jQuery
You might like
php include,include_once,require,require_once
2008/09/05 PHP
php获取textarea的值并处理回车换行的方法
2014/10/20 PHP
php使用curl打开https网站的方法
2015/06/17 PHP
PHP获取一年有几周以及每周开始日期和结束日期
2015/08/06 PHP
PHP如何通过传引用的思想实现无限分类(代码简单)
2015/10/13 PHP
PHP高精确度运算BC函数库实例详解
2017/08/15 PHP
laravel中Redis队列监听中断的分析
2020/09/14 PHP
JavaScript isPrototypeOf和hasOwnProperty使用区别
2010/03/04 Javascript
JavaScript中的类继承
2010/11/25 Javascript
关于js遍历表格的实例
2013/07/10 Javascript
Js日期选择自动填充到输入框(界面漂亮兼容火狐)
2013/08/02 Javascript
JavaScript实现表格点击排序的方法
2015/05/11 Javascript
jQuery EasyUI 为Combo,Combobox添加清除值功能的实例
2017/04/13 jQuery
微信小程序获取用户openId的实现方法
2017/05/23 Javascript
浅谈nodejs中的类定义和继承的套路
2017/07/26 NodeJs
jQuery实现带3D切割效果的轮播图功能示例【附源码下载】
2019/04/04 jQuery
vue 中 beforeRouteEnter 死循环的问题
2019/04/23 Javascript
解决vue watch数据的方法被调用了两次的问题
2020/11/07 Javascript
Python def函数的定义、使用及参数传递实现代码
2014/08/10 Python
Python中使用第三方库xlrd来写入Excel文件示例
2015/04/05 Python
Python内置函数reversed()用法分析
2018/03/20 Python
利用Python yagmail三行代码实现发送邮件
2018/05/11 Python
python 匹配url中是否存在IP地址的方法
2018/06/04 Python
Django REST框架创建一个简单的Api实例讲解
2019/11/05 Python
Python利用多线程同步锁实现多窗口订票系统(推荐)
2019/12/22 Python
Python实现在Windows平台修改文件属性
2020/03/05 Python
使用CSS3的appearance属性改变元素的外观的方法
2015/12/12 HTML / CSS
为什么说Ruby是一种真正的面向对象程序设计语言
2012/10/30 面试题
冰淇淋开店创业计划书
2014/02/01 职场文书
旅游管理毕业生自荐书
2014/02/02 职场文书
资金主管岗位职责范本
2014/03/04 职场文书
留守儿童工作方案
2014/06/02 职场文书
第二批党的群众路线教育实践活动总结报告
2014/10/30 职场文书
硕士学位论文评语
2014/12/31 职场文书
2016年第29个世界无烟日宣传活动总结
2016/04/06 职场文书
3招让你摆脱即兴讲话冷场尴尬
2019/08/08 职场文书