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

0
回复
8674
查看
[复制链接]

微信扫一扫 分享朋友圈

7848

主题

7931

帖子

7948

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
7948

最佳新人活跃会员热心会员推广达人宣传达人灌水之王突出贡献优秀版主荣誉管理论坛元老

发表于 2021-5-4 17:25:21 | 显示全部楼层 |阅读模式
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事件判断移动距离为零的话,则触发绑定的函数,话不多说,上代码:
  1. 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
  1. /*! * 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
  1. <!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.mubanren.com/thread-1367-1-1.html
温馨提示:充值398元VIP会员立享全站资源30天免费下载 如有问题可以直接联系客服
                  金币充值    VIP购买    投诉举报    失效链接反馈
1、本主题所有言论和图片纯属会员个人意见,与本论坛立场无关
2、本帖部分内容转载自其它媒体,但并不代表本站赞同其观点和对其真实性负责
3、免责声明:本附件资源转载自互联网,转存百度网盘,若有侵权请速联系客服,我们将会在24小时内删除,谢谢!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

400-0000-365

周一至周五 9:30-18:00

北京市大兴区景园北街2号02号

  • 关注微信账号

  • 关注微博账号