亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

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

發布時間:2020-08-25 15:58:17 來源:腳本之家 閱讀:375 作者:Mr_code 欄目:web開發

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

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

灵山县| 西林县| 哈密市| 崇阳县| 荃湾区| 西和县| 扎囊县| 云南省| 阳西县| 云和县| 天峻县| 昭平县| 顺平县| 沾化县| 乌拉特后旗| 永福县| 濉溪县| 饶平县| 福海县| 黑山县| 广州市| 六枝特区| 汪清县| 万宁市| 特克斯县| 玉屏| 班戈县| 吉木萨尔县| 孝义市| 南昌县| 永春县| 洛宁县| 北宁市| 鄂托克旗| 历史| 仁布县| 安图县| 白沙| 固镇县| 旬阳县| 大田县|