vue自定义tap指令及tap事件的实现

作者:Mr_code 时间:2024-05-09 09:25:15 

1.Vue指令

Vue提供自定义实现指令的功能, 和组件类似,可以是全局指令和局部指令,详细可以参见vue官网自定义指令一节(https://cn.vuejs.org/v2/guide/custom-directive.html).

2.v-tap指令实现

我个人的理解,编写指令即是在vue指令对象提供的钩子函数中做相应的逻辑处理,tap指令是在bind钩子函数中做相应的处理, 首先,要明白的是tap是为了处理click事件在iphone上的存在300ms的延时,这样使得连续点击很不流畅,tap通过移动端的touchstart事件和touchend事件判断移动距离为零的话,则触发绑定的函数,话不多说,上代码:


Vue.directive('tap',{
bind(el, binding, vNode){
let expression = binding.value;
let handler = expression.name;
let args = expression.args

on(el, 'touchstart', (e)=>{

let startX = e.changedTouches[0].clientX;
 let startY = e.changedTouches[0].clientY;

once(el, 'touchend',(ev)=>{

let disX = Math.abs(ev.changedTouches[0].clientX-startX);
 let disY = Math.abs(ev.changedTouches[0].clientY-startY);

if(disX == 0 && disY ==0){
  handler(args);
 }
 })
})
}
})

使用示例: <div v-tap="{ name : mymethod, args:{arg1:11, args2:22} }"></div>

3.总结

当我们需要复用一些dom底层操作的时候,可以考虑使用vue directive的方式复用代码.

下面看下vue tap事件的实现代码

前两天做了个tap.js插件,实现了移动端touch事件模拟click事件,解决点击延迟的问题,但是在vue中并不能用v-tap来调用,所以今天做了vue版的vue-tap.js。此前也曾用过其他的插件来实现v-tap,但方式仍有些累赘,于是便用了更简洁的方式来实现,下面附上代码(只支持vue2.0+)。

vue-tap.js


/*!
* vue-tap.js
* by weijianhua https://github.com/weijhfly/vue-tap
*/
;(function (factory) {
if (typeof define === 'function' && define.amd) {
define(function(){return factory;});
}else if (typeof exports == "object") {
module.exports = factory;
}else{
Vue.use(factory);
}
}({
master:{
bind: function (el, binding) {
var isTouch = "ontouchend" in document;
el.exec = function (e) {
var data = binding.value;
data[0].apply(this, data.slice(1));
};
if (isTouch) {
//touchstart
el.addEventListener('touchstart', function (e) {
binding.modifiers.stop && (e.stopPropagation());
var t = e.touches[0];
el.startX = t.clientX;
el.startY = t.clientY;
el.sTime = + new Date;
});
//touchend
el.addEventListener('touchend', function (e) {
binding.modifiers.stop && (e.stopPropagation());
var t = e.changedTouches[0];
el.endX = t.clientX;
el.endY = t.clientY;
if((+ new Date)-el.sTime<300){
if(Math.abs(el.endX-el.startX)+Math.abs(el.endY-el.startY)<20){
e.preventDefault();
el.exec();
}
}
});
}else {
//click
el.addEventListener('click', function (e) {
binding.modifiers.stop && (e.stopPropagation());
el.exec();
});
}
},
componentUpdated : function(el,binding) {
el.exec = function () {
var data = binding.value;
data[0].apply(this, data.slice(1));
};
},
unbind: function (el) {
el.exec = null;
}
},
install:function(){
Vue.directive('tap', this.master);
}
}))

demo.html


<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1,maximum-scale=1.0, user-scalable=0" />
<title>vue plugin test</title>
<style type="text/css">
strong{
font-size: 15px;
}
pre{
padding: 16px 0;
overflow: auto;
line-height: 1.45;
background-color: #f6f8fa;
border-radius: 3px;
}
</style>
</head>
<body style="padding:30px;">
<div id="app">
<pre>
<strong>vue-tap.js</strong>

<b>简洁的调用方式:</b>
v-tap="[方法,参数一,参数二...]"

<b>获取参数:</b>
methods:{
tap:function(参数一,参数二...){
console.log(参数一,参数二...);
}
}

<b>阻止冒泡:</b>
v-tap.stop
</pre>
<hr>
<div v-for="(l,i) in list">
<div v-tap="[tap,l,i]">li-{{l}}-{{i}}</div>
</div>
<br>
<hr>
<div v-tap="[test,'parent']">
parent<br><br>
<button v-tap.stop="[test,'son']">stop propagation</button>
</div>
</div>
<script src="https://cdn.bootcss.com/vue/2.5.13/vue.js"></script>
<script src="vue-tap.js"></script>
<script>
new Vue({
el:'#app',
data:{
list:['a','b','c','e','f']
},
methods:{
tap:function(i,k){
console.log(i,k);
},
test:function(i){
console.log(i);
}
}
})
if(window.innerWidth < 768){
document.getElementsByTagName('body')[0].style.padding = 0;
}
</script>
</body>
</html>

github:https://github.com/weijhfly/vue-tap

参考了其他vue-tap插件,但仍有需要完善的地方,后续更新。此外,在移动端解决点击延迟问题,还是比较推荐fastclick,兼容性较好且方便使用,不过相对而言模拟tap事件体积较小,也可以拿来练手了。

总结

以上所述是小编给大家介绍的vue自定义tap指令及tap事件的实现网站的支持!

来源:https://www.cnblogs.com/024-faith/p/tap.html

标签:vue,tap,指令
0
投稿

猜你喜欢

  • B/S模式项目中常用的javascript汇总

    2024-04-29 13:15:08
  • python wsgiref源码解析

    2023-10-20 10:56:27
  • 用户分类浅谈

    2009-09-27 12:14:00
  • MySQL如何导入SQL数据库的实战举例

    2024-01-21 23:44:53
  • MYSQL初学者命令行使用指南

    2024-01-15 08:46:33
  • Oracle捕获问题SQL解决CPU过渡消耗

    2010-07-21 13:14:00
  • golang中defer的关键特性示例详解

    2023-08-06 06:12:45
  • sqlserver 存储过程带事务 拼接id 返回值

    2012-11-30 20:06:39
  • 对Python的Django框架中的项目进行单元测试的方法

    2021-02-23 03:17:04
  • Mysql InnoDB删除数据后释放磁盘空间的方法

    2024-01-21 00:36:49
  • MySQL 学习总结 之 初步了解 InnoDB 存储引擎的架构设计

    2024-01-26 10:15:38
  • python处理PHP数组文本文件实例

    2023-11-09 23:56:03
  • python实现发送邮件功能代码

    2023-08-25 16:05:10
  • 解说mysql之binlog日志以及利用binlog日志恢复数据的方法

    2024-01-28 08:39:57
  • MySQL多表查询机制

    2024-01-25 22:38:33
  • MYSQL主从库不同步故障一例解决方法

    2010-06-09 19:12:00
  • python 图像处理画一个正弦函数代码实例

    2021-08-10 22:17:51
  • 解决Python3.7.0 SSL低版本导致Pip无法使用问题

    2023-08-22 01:46:55
  • 深入php var_dump()函数的详解

    2023-11-08 16:09:01
  • javascript怎么禁用浏览器后退按钮

    2024-02-25 08:49:45
  • asp之家 网络编程 m.aspxhome.com