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 相关文章推荐
用ASP将SQL搜索出来的内容导出为TXT的代码
Jul 27 Javascript
奉献给JavaScript初学者的编写开发的七个细节
Jan 11 Javascript
JavaScript中获取未知对象属性的代码
Apr 27 Javascript
Jquery遍历checkbox获取选中项value值的方法
Feb 13 Javascript
javascript模拟实现ajax加载框实例
Oct 15 Javascript
5种处理js跨域问题方法汇总
Dec 04 Javascript
JavaScript事件学习小结(三)js事件对象
Jun 09 Javascript
mescroll.js上拉加载下拉刷新组件使用详解
Nov 13 Javascript
微信小程序通过保存图片分享到朋友圈功能
May 24 Javascript
详解vue-cli中模拟数据的两种方法
Jul 03 Javascript
jQuery实现仿京东防抖动菜单效果示例
Jul 06 jQuery
Vue 与 Vuex 的第一次接触遇到的坑
Aug 16 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
Yii核心组件AssetManager原理分析
2014/12/02 PHP
php接口数据加密、解密、验证签名
2015/03/12 PHP
js类的静态属性和实例属性的理解
2009/10/01 Javascript
jquery导航制件jquery鼠标经过变色效果示例
2013/12/05 Javascript
IE6/IE7中JavaScript json提示缺少标识符、字符串或数字问题处理
2014/12/16 Javascript
BootStrap glyphicons 字体图标实现方法
2016/05/01 Javascript
TinyMCE汉化及本地上传图片功能实例详解
2016/05/31 Javascript
javascript正则表达式中分组详解
2016/07/17 Javascript
jQuery实现邮箱下拉列表自动补全功能
2016/09/08 Javascript
JavaScript正则表达式实例详解
2016/10/16 Javascript
用jQuery的AJax实现异步访问、异步加载
2016/11/02 Javascript
AngularJS指令与控制器之间的交互功能示例
2016/12/14 Javascript
jQuery图片瀑布流的简单实现代码
2017/03/15 Javascript
如何用webpack4带你实现一个vue的打包的项目
2018/06/20 Javascript
vue将单页面改造成多页面应用的方法
2018/11/25 Javascript
JS简单判断是否在微信浏览器打开的方法示例
2019/01/08 Javascript
基于Taro的微信小程序模板消息-获取formId功能模块封装实践
2019/07/15 Javascript
Python的Django框架中的select_related函数对QuerySet 查询的优化
2015/04/01 Python
使用Python对IP进行转换的一些操作技巧小结
2015/11/09 Python
如何使用python爬取csdn博客访问量
2016/02/14 Python
python爬虫框架scrapy实战之爬取京东商城进阶篇
2017/04/24 Python
Python中存取文件的4种不同操作
2018/07/02 Python
python使用tcp实现局域网内文件传输
2020/03/20 Python
使用python批量读取word文档并整理关键信息到excel表格的实例
2018/11/07 Python
Python OOP类中的几种函数或方法总结
2019/02/22 Python
pyqt5利用pyqtDesigner实现登录界面
2019/03/28 Python
在Pycharm中使用GitHub的方法步骤
2019/06/13 Python
带你彻底搞懂python操作mysql数据库(cursor游标讲解)
2020/01/06 Python
Python3.7.0 Shell添加清屏快捷键的实现示例
2020/03/23 Python
总结python 三种常见的内存泄漏场景
2020/11/20 Python
英国最好的温室之家:Greenhouses Direct
2019/07/13 全球购物
元旦促销方案
2014/03/15 职场文书
2014年两会学习心得范例
2014/03/17 职场文书
2016年五一国际劳动节活动总结
2016/04/06 职场文书
深入理解MySQL中MVCC与BufferPool缓存机制
2022/05/25 MySQL
Win10系统搭建ftp文件服务器详细教程
2022/08/05 Servers