最近在做项目时,需要进行两个组件联动,一个轮询获取到消息,然后将其传递给另外一个组件进行横向滚动展示,结果滚动的速度越来越快。这里记录一下来提醒自己。消息滚动的代码在最下面,方便下次使用。
问题背景:最近在做一个需求,组件一个获取消息采用的是轮询,组件一个获取到新的消息后,将组件一个中的消息传递给另外一个组件B,当组件B接收到消息时就让消息在页面上滚动播放。
实现思路:这个项目应用的框架为VUE,当组件一个获取到新的消息之后,就触发中央事件总线,在组件B中进行事件监听,将其添加进入一个数组,当判断定时器没有运动时,就触发滚动的函数。消息滚动的函数是从消息数组中提取出第一条,然后利用定时器进行消息滚动,当消息滚动到边缘时清除定时器。
问题:消息在滚动的过程中,该开始还能够按照给定的速度进行滚动,可是当时间变长后就会出现消息滚动的速度越来越快的问题。
原因:当出现这个问题时,我第一个念头就是setInterval没有被清掉,因为当定时器没有清掉之后又再次调用定时器就会导致多个定时器同时执行,比如第一次是一个计时器,再点一下是就是两个定时器,这时候每次就是+ 2,所以速度不断提升。我看了一下我设置的滚动函数,里面当消息滚动到边缘时,就清除这个定时器,所以在滚动函数中没有问题。我又看了下中央事件总线的事件监听器,发现问题在这里。因为我在判断一个定时器是否被销毁时,直接判断其类型是数字还是null,由于当定时器开始运行时,每一次返回的都是一个ID(数字),而不是一开始的对象,导致当一条消息开始滚动时,又接收到一条新的消息,然后就使得两个定时器同时运行,从而出现这个问题。
解决方式:当消息滚动到盒子边缘销毁定时器时,将其赋值为null,然后修改中央事件的事件监听,将其判断没有定时器的条件修改为null,然后满足条件的调用消息滚动函数。
横向滚动的代码:
& lt; !DOCTYPE html> & lt; html lang=癳n”比; & lt; head> & lt;元charset=皍tf - 8”比; & lt;元name=笆哟啊蹦谌?翱矶?设备宽度,初始=1.0”比; & lt;元http-equiv=癤-UA-Compatible”内容=癷e=边缘”比; & lt; title> Document & lt; style> * { 保证金:0; 填充:0; } #标题{ 位置:相对; 宽度:10%; 保证金:30 px汽车; 行高:30 px; 高度:30 px; 边界:1 px固体红; 溢出:隐藏; } #内容{ 位置:绝对的; 左:0; 行高:30 px; 显示:inline-block; } & lt;/style> & lt;/head> & lt; body> & lt; div id=氨晏狻北? & lt;跨度id=澳谌荨痹?23 & lt;/span> & lt;/div> & lt; script> var wrapEle=. getelementbyid(“标题”); 让contentEle=. getelementbyid(“内容”); 让arr=( {新闻:“这是一条新闻'} ]; 让计时器=零; 移动(wrapEle contentEle); 函数移动(包装、项目){ clearInterval(计时器); 如果(! arr.length){返回false;} 项。innerHTML arr=[0]格式; 加勒比海盗。拼接(0,1); 让allWidth=getCurrentStyle(包装,“宽度”); 让itemWidth=getCurrentStyle(项目,“宽度”); item.style。左=allWidth +“px”; 让速度=2; 让时间=50; 计时器=setInterval(()=比;{ 让itemPlace=getCurrentStyle(项目,‘左’); 如果(itemPlace & lt;-itemWidth) { clearInterval(计时器); } item.style。左=itemPlace -速度+“px”; },时间) } 函数getCurrentStyle(避署,attr) { 返回窗口。getComputedStyle & # 63;方法(窗口。getComputedStyle(避署,null) [attr]):方法(避署。currentStyle [attr]); } & lt;/script> & lt;/body> & lt;/html>
以上所述是小编给大家介绍的Vue中消息横向滚动时setInterval清不掉的问题及解决方法,希望对大家有所帮助,如果大家有任何疑问请给我留的言,小编会及时回复大家的。在此也非常感谢大家对网站的支持。
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!