vue自定义指令,包装函数节流。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了vue自定义指令,包装函数节流。相关的知识,希望对你有一定的参考价值。

参考技术A

Vue 提供了自定义指令的5个钩子函数:

钩子函数的 参数 (即 el、binding、vnode oldVnode )。

项目中 el + binding.value 就够用了,比如网上搜的一个例子,函数节流指令:

本来那个input 是原生元素,想试试组件el-input支持不 结果还真支持,所以看了下组件源码,结果这里的el只是input的父元素div!!!el-input没有做任何操作,而且支监听div的keyup起到节流效果,没有任何问题??? 一脸黑人问号。。。求大神解释

为了安全起见 还是绑定给input了。

手把手教你在vue中使用自定义指令全局封装防抖节流函数

第一步在src下创建utils文件夹并创建common.js文件

//'@/utils/common.js' 文件
 
 
function throttle(bindObj, fn, delay) 
	bindObj.$$prevTime = Date.now()
	return function(...args) 
		const nowTime = Date.now()
		if(nowTime - bindObj.$$prevTime > delay) 
			fn.apply(this, args)
			bindObj.$$prevTime = nowTime
		
	

 
function debounce(bindObj, fn, delay) 
	return function(...args) 
		bindObj.$$timer && clearTimeout(bindObj.$$timer)
		bindObj.$$timer = setTimeout(() => 
			fn.apply(this, args)
		, delay)
	

 
export 
	debounce,
	throttle

第二步在src下创建plugin文件夹并创建index.js文件

// '@/plugin/index.js'文件
 
import Vue from 'vue'
import  debounce, throttle  from '../units/common'
 
Vue.directive('debounce', 
	bind(el, binding, vnode) 
		const [emit, fn, delay=1000] = binding.value
		el.addEventListener(emit, debounce(vnode, fn, delay))
	
)
 
Vue.directive('throttle', 
	bind(el, binding, vnode) 
		const [emit, fn, delay=1000] = binding.value
		el.addEventListener(emit, throttle(vnode, fn, delay))
	
)

第三步在全局main.js中进行引入

import Vue from "vue";
import App from "./App.vue";
import router from "./router";
import  "./plugin/index"
Vue.config.productionTip = false;
new Vue(
  router,
  render: (h) => h(App),
).$mount("#app");

最后就可以在想要使用的组件内进行使用了

传参是一个数组,参数分别是事件类型,事件执行函数以及时间(默认为1秒,也可以不传)

///防抖   (只执行最后一次)
<template>
  <div>
    <input type="button" v-debounce="['click', jiantin]" value="点击" />
    <h1> num </h1>
  </div>
</template>
 
<script>
export default 
  data() 
    return 
      num: 0,
    ;
  ,
  methods: 
    jiantin() 
      this.num++;
    ,
  ,
;
</script>
 
<style>
</style>
//节流  (在一段时间内只执行一次)
<template>
  <div>
    <input type="button" v-throttle="['click', jiantin, 3000]" value="点击" />
    <h1> num </h1>
  </div>
</template>
 
<script>
export default 
  data() 
    return 
      num: 0,
    ;
  ,
  methods: 
    jiantin() 
      this.num++;
    ,
  ,
;
</script>
 
<style>
</style>

以上是关于vue自定义指令,包装函数节流。的主要内容,如果未能解决你的问题,请参考以下文章

vue自定义防抖&节流指令的实现&全局指令定义和使用-案例

vue中自定义指令组件化生命周期节流和防抖获取DOMmint-ui简介过渡和动画

vue节流全局指令超级简单

vue自定义指令(过滤器/函数)保留小数点后两位

Vue_(组件)自定义指令

Vue基础进阶 之 自定义指令