国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

vue自定義tap指令及tap事件的實現

2019-11-19 12:54:54
字體:
來源:轉載
供稿:網友

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事件的實現,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對武林網網站的支持!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 尼勒克县| 澎湖县| 安西县| 阿坝| 宣化县| 西贡区| 翁源县| 庆城县| 大港区| 永宁县| 罗山县| 贵德县| 新民市| 武夷山市| 米脂县| 务川| 武城县| 五大连池市| 肥城市| 远安县| 武穴市| 尼勒克县| 宜都市| 嘉义县| 商河县| 惠安县| 台湾省| 萝北县| 望城县| 荆门市| 息烽县| 石楼县| 罗源县| 郑州市| 常山县| 赤峰市| 苏尼特左旗| 灵丘县| 湖北省| 师宗县| 上犹县|