Usage:
**HTML**
<div id="app" class="box"
v-tap="vuetouch" //The vuetouch is the function name. If there is no parameter, you can write the function name directly
v-longtap="{fn:vuetouch,name:'Long press'}" //If any parameter is passed as an object, fn is the function name
v-swipeleft="{fn:vuetouch,name:'Left slide'}"
v-swiperight="{fn:vuetouch,name:'Right slip'}"
v-swipeup="{fn:vuetouch,name:'Up slide'}"
v-swipedown="{fn:vuetouch,name:'Slide downward'}"
>{{ name }}</div>
**js**
kim=new Vue({
el:"#app",
data:{
name:"start"
},
methods:{
vuetouch:function(s,e){
this.name=s.name;
}
}
});
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
js core content
function vueTouch(el,binding,type){
var _this=this;
this.obj=el;
this.binding=binding;
this.touchType=type;
this.vueTouches={x:0,y:0};
this.vueMoves=true;
this.vueLeave=true;
this.longTouch=true;
this.vueCallBack=typeof(binding.value)=="object"?binding.value.fn:binding.value;
this.obj.addEventListener("touchstart",function(e){
_this.start(e);
},false);
this.obj.addEventListener("touchend",function(e){
_this.end(e);
},false);
this.obj.addEventListener("touchmove",function(e){
_this.move(e);
},false);
};
vueTouch.prototype={
start:function(e){
this.vueMoves=true;
this.vueLeave=true;
this.longTouch=true;
this.vueTouches={x:e.changedTouches[0].pageX,y:e.changedTouches[0].pageY};
this.time=setTimeout(function(){
if(this.vueLeave&&this.vueMoves){
this.touchType=="longtap"&&this.vueCallBack(this.binding.value,e);
this.longTouch=false;
};
}.bind(this),1000);
},
end:function(e){
var disX=e.changedTouches[0].pageX-this.vueTouches.x;
var disY=e.changedTouches[0].pageY-this.vueTouches.y;
clearTimeout(this.time);
if(Math.abs(disX)>10||Math.abs(disY)>100){
this.touchType=="swipe"&&this.vueCallBack(this.binding.value,e);
if(Math.abs(disX)>Math.abs(disY)){
if(disX>10){
this.touchType=="swiperight"&&this.vueCallBack(this.binding.value,e);
};
if(disX<-10){
this.touchType=="swipeleft"&&this.vueCallBack(this.binding.value,e);
};
}else{
if(disY>10){
this.touchType=="swipedown"&&this.vueCallBack(this.binding.value,e);
};
if(disY<-10){
this.touchType=="swipeup"&&this.vueCallBack(this.binding.value,e);
};
};
}else{
if(this.longTouch&&this.vueMoves){
this.touchType=="tap"&&this.vueCallBack(this.binding.value,e);
this.vueLeave=false
};
};
},
move:function(e){
this.vueMoves=false;
}
};
Vue.directive("tap",{
bind:function(el,binding){
new vueTouch(el,binding,"tap");
}
});
Vue.directive("swipe",{
bind:function(el,binding){
new vueTouch(el,binding,"swipe");
}
});
Vue.directive("swipeleft",{
bind:function(el,binding){
new vueTouch(el,binding,"swipeleft");
}
});
Vue.directive("swiperight",{
bind:function(el,binding){
new vueTouch(el,binding,"swiperight");
}
});
Vue.directive("swipedown",{
bind:function(el,binding){
new vueTouch(el,binding,"swipedown");
}
});
Vue.directive("swipeup",{
bind:function(el,binding){
new vueTouch(el,binding,"swipeup");
}
});
Vue.directive("longtap",{
bind:function(el,binding){
new vueTouch(el,binding,"longtap");
}
});
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
- 100
2018-03-08
A friend put forward a bug
"No new value can be obtained after the v-for cycle life cycle, such as updated data"
This problem is caused by the local reuse mechanism of v-for, that is, the reusable dom does not render repeatedly. The official method is to provide a unique key attribute for each item. The ideal key value is a unique id for each item.
<div v-for="item in items" :key="item.id">
<!-- content -->
</div>
- 1
- 2
- 3
My solution is that the hook function parameter of directive has a vnode, which is a virtual dom node. Give vnode.key a random id to force dom refresh.
Vue.directive("tap",{
bind:function(el,binding,vnode){
vnode.key = randomString()//Random string returns a random string
new vueTouch(el,binding,"tap");
}
});
- 1
- 2
- 3
- 4
- 5
- 6
The latest version has been updated in GitHub
https://github.com/904790204/vue-touch
There may be some problems in actual use. Please point out