vue-touch不支持vue2.0的替换方法
当你想用vue-touch时,却发现官网这句话
Touch events plugin for Vue.js. This plugin does not support Vue 2.0 yet.
但是却找不到好的替换方案,只能自己硬着头皮上了。
我这边有一个不成熟的解决方案:
自己写v-touch指令
长按 press,向上 swipeup,向下 swipedown,向左swipeleft,向右 swiperight
使用 v-touch:swiperight="methodFunc"。
vue指令 touch 使用bind,
- binding.arg 获得传入模式
- el 监听绑定的事件
- binding.value 获得传入的事件
通过对touchstart touchmove touchend 的判断,执行对应的事件。
main.js 引用
import Vue from 'vue' import directives from './directives'
...
directives(Vue)
directives.js
export default(Vue) => {
    Vue.directive('touch', {
        bind: function (el, binding, vnode) {
            var touchType = binding.arg; //传入的模式 press swipeRight swipeLeft swipeTop swipeDowm Tap
            var timeOutEvent = 0;
            var direction = '';
            //滑动处理
            var startX, startY;
            //返回角度
            function GetSlideAngle(dx, dy) {
                return Math.atan2(dy, dx) * 180 / Math.PI;
            }
            //根据起点和终点返回方向 1:向上,2:向下,3:向左,4:向右,0:未滑动
            function GetSlideDirection(startX, startY, endX, endY) {
                var dy = startY - endY;
                var dx = endX - startX;
                var result = 0;
                //如果滑动距离太短
                if (Math.abs(dx) < 2 && Math.abs(dy) < 2) {
                    return result;
                }
                var angle = GetSlideAngle(dx, dy);
                if (angle >= -45 && angle < 45) {
                    result = 'swiperight';
                } else if (angle >= 45 && angle < 135) {
                    result = 'swipeup';
                } else if (angle >= -135 && angle < -45) {
                    result = 'swipedown';
                }
                else if ((angle >= 135 && angle <= 180) || (angle >= -180 && angle < -135)) {
                    result = 'swipeleft';
                }
                return result;
            }
            el.addEventListener('touchstart', function (ev) {
                startX = ev.touches[0].pageX;
                startY = ev.touches[0].pageY;
                //判断长按
                timeOutEvent = setTimeout(() =>{
                    timeOutEvent = 0 ;
                    if(touchType === 'press'){
                        binding.value()
                    }
                } , 500);
            }, false);
            el.addEventListener('touchmove' , function (ev) {
                clearTimeout(timeOutEvent)
                timeOutEvent = 0;
            });
            el.addEventListener('touchend', function (ev) {
                var endX, endY;
                endX = ev.changedTouches[0].pageX;
                endY = ev.changedTouches[0].pageY;
                direction = GetSlideDirection(startX, startY, endX, endY);
                clearTimeout(timeOutEvent)
                switch (direction) {
                    case 0:
                        break;
                    case 'swipeup':
                        if(touchType === 'swipeup'){
                            binding.value()
                        }
                        break;
                    case 'swipedown':
                        if(touchType === 'swipedown'){
                            binding.value()
                        }
                        break;
                    case 'swipeleft':
                        if(touchType === 'swipeleft'){
                            binding.value()
                        }
                        break;
                    case 'swiperight':
                        if(touchType === 'swiperight'){
                            binding.value()
                        }
                        break;
                    default:
                }
            }, false);
        }
    })
}
以上方案还有待完善,但是对于遇到vue2.0想使用移动端事件,这个方案还是可以顶替的。
vue-touch不支持vue2.0的替换方法的更多相关文章
- Vue: 一个简单的Vue2.0 v-model双向数据绑定的实现,含源代码,小白也能看懂
		首先说一下原理吧 View层(dom元素)的变动如何响应到Model层(Js变量)呢? 通过监听元素的input事件来动态的改变js变量的值,实际上不是改变的js变量的值,而是改变的js变量的gett ... 
- VUE2.0学习总结
		摘要: 年后公司项目开始上vue2.0,自己对学习进行了总结,希望对大家有帮助! VUE2.0学习 vue介绍 vue是什么? https://vuefe.cn/guide vue也是一个数据驱动框架 ... 
- Vue2.0环境搭建和测试demo
		Vue2.0 推荐开发环境 Homebrew 1.0.6(Mac).Node.js 6.7.0.npm 3.10.3.webpack 1.13.2.vue-cli 2.4.0.Atom 1.10.2 ... 
- vue2.0路由变化1
		路由的步骤 1.定义组件 var Home={ template:'<h3>我是主页</h3>' }; var News={ template:'<h3>我是新闻& ... 
- Vue2.0 新手完全填坑攻略——从环境搭建到发布
		Jinkey原创感谢 showonne.yubang 技术指导Demo 地址:http://demo.jinkey.io/vue2源码:https://github.com/Jinkeycode/vu ... 
- Vue2.0项目
		什么是 Vue Vue 是一个前端框架,特点是 数据绑定 比如你改变一个输入框 Input 标签的值,会 自动同步 更新到页面上其他绑定该输入框的组件的值  组件化 页面上小到一个按钮都可以是一个单 ... 
- vue2.0项目实战(1)基础入门
		最近公司的H5项目准备重构,部门老大说前端使用vue2.0来开发,所以就准备把整个项目的开发过程记录下来,一方面是为了记录开发过程中遇到的坑,另一方面也加强自己写作的能力. 什么是 Vue? 简要介绍 ... 
- vue2.0父子组件通信的方法
		vue2.0组件通信方法:props传值和emit监听.(.sync方法已经移除.详情请点击)(dispatch-和-broadcast方法也已经废弃) props方法传值:Props 现在只能单项传 ... 
- Vue2.0学习--Vue数据通信详解
		一.前言 组件是 vue.js最强大的功能之一,而组件实例的作用域是相互独立的,这就意味着不同组件之间的数据无法相互引用.组件间如何传递数据就显得至关重要.本文尽可能罗列出一些常见的数据传递方式,如p ... 
随机推荐
- 使用snmp4j实现Snmp功能(一)
			相关链接:Snmp学习笔记使用snmp4j实现Snmp功能(一)使用snmp4j实现Snmp功能(二)使用snmp4j实现Snmp功能(三) 上一篇文章讲了Snmp的一些基本概念(Snmp学习笔记), ... 
- matlab特殊符号表
			Character Sequence Symbol Character Sequence Symbol Character Sequence Symbol \alpha α \upsilon υ \s ... 
- 在IAR使用FreeRTOS出现Error[Pa045]: function "XXX" has no prototype
			FreeRTOS官方例程中设置了需要“Require prototype”,所以每个函数(除了main函数)都需要函数声明,其中对于无形参的函数声明要加void,比如void led_init(voi ... 
- xml  通过正则抓取字段
			$str = '<xml> <appid><![CDATA[wxd49ea66070209a6e]]></appid> <bank_type> ... 
- tp查找某字段,排除某字段,不用一次写那么多
			更多的情况下我们都是查询某些字段,但有些情况下面我们需要通过字段排除来更方便的查询字段,例如文章详细页,我们可能只需要排除status和update_time字段,这样就不需要写一堆的字段名称了(有些 ... 
- javascript实现正整数分数约分
			//m,n为正整数的分子和分母 function reductionTo(m, n) { var arr = []; if (!isInteger(m) || !isInteger(n)) { con ... 
- Linux和windows下检查jsp后门文件的方法
			Linux下: find . -name "*.jsp" | xargs egrep -liw "createNewFile| File\(| File |applica ... 
- js高阶函数--判断数据类型、函数胡柯里化;
			一.判断数据类型: 常见的判断有typeof.instanceof. constructor. prototype,先来看typeof: var a = "hello world" ... 
- 两台linux服务器之间免密scp,在A机器上向B远程拷贝文件
			两台linux服务器之间免密scp,在A机器上向B远程拷贝文件 操作步骤:1.在A机器上,执行ssh-keygen -t rsa,一路按Enter,不需要输入任何内容.(如有提示是否覆盖,可输入y后按 ... 
- Jmeter-12-如何使用Plugin Manager
			1. 搜索 Jmeter plugin 并找到plugin manager 下载jar文件 2. 放到jmeter/lib/ext下面, 重启jmeter 3. 找到选项-> Plugin ma ... 
