扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
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); } }) }) } })
使用示例:
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
vue plugin test vue-tap.js 简洁的调用方式: v-tap="[方法,参数一,参数二...]" 获取参数: methods:{ tap:function(参数一,参数二...){ console.log(参数一,参数二...); } } 阻止冒泡: v-tap.stop
li-{{l}}-{{i}}
parent
github:https://github.com/weijhfly/vue-tap
参考了其他vue-tap插件,但仍有需要完善的地方,后续更新。此外,在移动端解决点击延迟问题,还是比较推荐fastclick,兼容性较好且方便使用,不过相对而言模拟tap事件体积较小,也可以拿来练手了。
总结
以上所述是小编给大家介绍的vue自定义tap指令及tap事件的实现,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对创新互联网站的支持!
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流