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


Posted in Javascript onSeptember 18, 2018

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事件的实现,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
JavaScript 在各个浏览器中执行的耐性
Apr 06 Javascript
js模仿jquery的写法示例代码
Jun 16 Javascript
GridView中获取被点击行中的DropDownList和TextBox中的值
Jul 18 Javascript
jQuery怎么解析Json字符串(Json格式/Json对象)
Aug 09 Javascript
IE浏览器中图片onload事件无效的解决方法
Apr 29 Javascript
JS封装cookie操作函数实例(设置、读取、删除)
Nov 17 Javascript
快速学习jQuery插件 jquery.validate.js表单验证插件使用方法
Dec 01 Javascript
一种新的javascript对象创建方式Object.create()
Dec 28 Javascript
BootStrap轻松实现微信页面开发代码分享
Oct 21 Javascript
微信小程序中使元素占满整个屏幕高度实现方法
Dec 14 Javascript
Vue2.0用户权限控制解决方案
Nov 29 Javascript
浅谈使用React.setState需要注意的三点
Dec 18 Javascript
Vue条件循环判断+计算属性+绑定样式v-bind的实例
Sep 18 #Javascript
浅谈vue同一页面中拥有两个表单时,的验证问题
Sep 18 #Javascript
记React connect的几种写法(小结)
Sep 18 #Javascript
Vue循环组件加validate多表单验证的实例
Sep 18 #Javascript
vue2.0 + ele的循环表单及验证字段方法
Sep 18 #Javascript
JavaScript指定断点操作实例教程
Sep 18 #Javascript
对VUE中的对象添加属性
Sep 18 #Javascript
You might like
PHP写杨辉三角实例代码
2011/07/17 PHP
php下载文件超时时间的设置方法
2016/10/06 PHP
PHP中单例模式的使用场景与使用方法讲解
2019/03/18 PHP
PHP Pipeline 实现中间件的示例代码
2020/04/26 PHP
JQuery 图片延迟加载并等比缩放插件
2009/11/09 Javascript
extjs3 combobox取value和text案例详解
2013/02/06 Javascript
JavaScript阻止浏览器返回按钮的方法
2015/03/18 Javascript
JavaScript的Date()方法使用详解
2015/06/09 Javascript
异步安全加载javascript文件的方法
2015/07/21 Javascript
JavaScript原型及原型链终极详解
2016/01/04 Javascript
jQuery获取与设置iframe高度的方法
2016/08/01 Javascript
jQuery实现倒计时(倒计时年月日可自己输入)
2016/12/02 Javascript
详解Vue中使用v-for语句抛出错误的解决方案
2017/05/04 Javascript
vue路由嵌套的SPA实现步骤
2017/11/06 Javascript
利用JS测试目标网站的打开响应速度
2017/12/01 Javascript
vue-cli项目代理proxyTable配置exclude的方法
2018/09/20 Javascript
NodeJS使用Range请求实现下载功能的方法示例
2018/10/12 NodeJs
webpack4 SplitChunks实现代码分隔详解
2019/05/23 Javascript
layui 数据表格 点击分页按钮 监听事件的实例
2019/09/02 Javascript
小程序实现列表展开收起效果
2020/07/29 Javascript
在vue中嵌入外部网站的实现
2020/11/13 Javascript
[00:14]PWL:老朋友Mushi拍VLOG与中国玩家问好
2020/11/04 DOTA
python操作oracle的完整教程分享
2018/01/30 Python
python实现下载pop3邮件保存到本地
2018/06/19 Python
Python时间和字符串转换操作实例分析
2019/03/16 Python
python使用matplotlib的savefig保存时图片保存不完整的问题
2021/01/08 Python
css3实现小箭头各种图形效果
2020/07/08 HTML / CSS
HTML5单页面手势滑屏切换原理
2016/03/21 HTML / CSS
Canvas在超级玛丽游戏中的应用详解
2021/02/06 HTML / CSS
Farfetch美国:奢侈品牌时尚购物平台
2019/05/02 全球购物
Solaris操作系统的线程机制
2015/07/28 面试题
协议书模板
2014/04/23 职场文书
结婚保证书
2015/01/16 职场文书
无房证明样本
2015/06/17 职场文书
2016年党员公开承诺书格式范文
2016/03/24 职场文书
Python游戏开发实例之graphics实现AI五子棋
2021/11/01 Python