引入:模仿idea中文网站时,里面出现的一个轮播图,既可以通过按钮点击来实现图片的切换,也可以通过双指滑动来实现切换

我首先实现的是按钮点击来实现图片切换,@click来监听两个按钮
具体代码如下,不过多赘述

接下来写的即是触摸板滑动功能
一开始我写的只有@touchsart和@touchend,以此监听触摸板的滑动,代码如下,这个兼容性比较强,在手机上也可以实现滑动,但是在PC端,只能通过检查,再点击触摸板后滑动才能实现图片切换,具体原因暂时还不清楚。
所以在后面我添加了@mousewheel监听事件,这个方法是监听鼠标滚轮事件,而两个手指滑动触摸板就相当于鼠标滚动事件;
而当鼠标滚轮滚动的时候,e.wheelDeltaX的值会变化,就意味着有了滚动,滚动值最后为负值是向右滚动了,滚动值最后为负值是向左滚动了,以此来写函数changeTouch;
通过使用changeTouch方法调用左右切换,但同时也会出现一个问题,changeTouch被调用了多次,这是由于e.wheelDeltaX的值会多次变化,滚动一小点就会调用changeTouch一次,这个时候想到的就是节流函数throttle了;

提出疑问:为什么节流函数一开始要在组件创建时调用,而不是在toMousewheel里面直接使用节流,换句话说,为什么要在created里面调用changeTouch去节流,而不是去toMousewheel里面节流?
回答:一开始写的时候是在调用节流函数时,直接让节流函数调用changeTouch,从而执行了一次,如下【错误写法】
在toMousewheel方法里,直接调用了this.changeTouch(e),这就使得changeTouch方法会被立即执行,而不是被节流,为什么?
因为changeTouch有参数,加了括号传参,当我们去调用有括号传参的函数时就是被执行了,但changeTouch不能被执行,只能被调用;正确的做法应该是把changeTouch函数本身传递给throttle函数,而非调用它的返回值,所以在created的时候赋值一个新变量,这个变量不是函数,所以不会被调用执行,即只会被调用而不会执行;
综上,节流函数第一参数的函数只能被调用,不能被执行,你可以填写函数名,但是不可以填函数名+括号(实际上是在立即执行这个函数),更不能填函数名+括号里面传参(这个时候这个函数会被立即执行,并且它的返回值【而不是函数本身】会被传递给throttle,这显然不是我们想要得,因为我们希望throttle在合适的时机调用函数,而不是立即执行它);
而对于这个toMousewheel方法里,我们直接去写就可以实现触摸板的双指滑动了,没有用到@touchsart和@touchend,把这两个代码保留的好处:这两个是触摸事件,手机端有触摸滑动事件,【有些电脑的触摸板支持"双击滚动"功能,即先用手指再触摸板上快速点击两次,双击后,触摸板会进入滚动模式,然后用户可以移动手指来模拟鼠标滚轮的滚动操作】,我这个要在检查的时候才可以实现电脑的触摸板"双击滚动功能",具体原因暂时不知;所以保留可以让手机端也能够实现滑动功能。
拓展:(touchstart和mousewheel的区别)
touchstart是触摸事件,属于移动端或触摸设备的输入事件,用于处理触摸操作的初始阶段,例如要做PC端长按类型(长按复制、长按语音)【上面不用到touchstart是因为上面本质是滚轮事件,而不是长按事件,而移动端的长按滑动和滚轮有点类似,这种时候就不用多写一个滚轮事件了】;
mousewheel是鼠标事件,属于桌面端鼠标设备的输入事件。用于处理鼠标滚轮滚动事件,例如控制页面滚动、缩放内容或如上功能。