vue自定义指令touch事件之滑动、长按事件


// 注册 移动端touch 滑动处理
const touch = Vue.directive('touch', {
    bind(el, binding, vnode) {        
        var touchType = binding.arg; //传入的模式 press swipeRight swipeLeft swipeTop swipeDown 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);
    }
})

组件中应用:

<div v-touch:swipeup="upSlide" v-touch:swipedown="downSlide">

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue中,你可以使用自定义指令来抛出事件。下面是一个简单的例子: 首先,在Vue组件中定义一个自定义指令: ```javascriptVue.directive('custom-directive', { bind: function (el, binding, vnode) { // 绑定事件处理逻辑 el.addEventListener('click', function () { // 触发自定义事件 vnode.context.$emit('custom-event', binding.value); }); } }); ``` 然后,在模板中使用自定义指令,并监听自定义事件: ```html<template> <div v-custom-directive="dataValue"></div> </template> <script> export default { data() { return { dataValue: 'Hello, World!' }; }, mounted() { this.$on('custom-event', this.handleCustomEvent); }, methods: { handleCustomEvent(value) { console.log('Received custom event:', value); // 处理自定义事件逻辑 } } }; </script> ``` 在上述代码中,当 `<div>` 元素被点击时,会触发自定义指令的 `bind` 方法中的事件处理逻辑。然后,通过 `vnode.context.$emit` 方法触发了一个名为 `'custom-event'` 的自定义事件,并传递了 `binding.value`(即 `dataValue`)作为参数。接着,在组件的 `mounted` 钩子函数中,通过 `this.$on` 方法监听了 `'custom-event'`事件,并绑定了处理函数 `handleCustomEvent`。最后,可以在 `handleCustomEvent` 方法中处理自定义事件的逻辑。 这样,当 `<div>` 元素被点击时,就会触发自定义事件,并将传递的参数打印到控制台。你可以根据实际需求修改自定义指令事件处理逻辑。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值