您好,登錄后才能下訂單哦!
最近在做項目時,需要進行兩個組件聯動,一個輪詢獲取到消息,然后將其傳遞給另外一個組件進行橫向滾動展示,結果滾動的速度越來越快。這里記錄一下來提醒自己。消息滾動的代碼在最下面,方便下次使用。
問題背景: 最近在做一個需求,組件A獲取消息采用的是輪詢,組件A獲取到新的消息后,將組件A中的消息傳遞給另外一個組件B,當組件B接收到消息時就讓消息在頁面上滾動播放。
實現思路: 這個項目應用的框架為VUE,當組件A獲取到新的消息之后,就觸發中央事件總線,在組件B中進行事件監聽,將其添加進入一個數組,當判斷定時器沒有運動時,就觸發滾動的函數。消息滾動的函數是從消息數組中提取出第一條,然后利用定時器進行消息滾動,當消息滾動到邊緣時清除定時器。
問題:消息在滾動的過程中,該開始還能夠按照給定的速度進行滾動,可是當時間變長后就會出現消息滾動的速度越來越快的問題。
原因:當出現這個問題時,我第一個念頭就是setInterval沒有被清掉,因為當定時器沒有清掉之后又再次調用定時器就會導致多個定時器同時執行,比如第一次是一個計時器,再點一下是就是兩個定時器,這時候每次就是+2,所以速度不斷提升。我看了一下我設置的滾動函數,里面當消息滾動到邊緣時,就清除這個定時器,所以在滾動函數中沒有問題。我又看了下中央事件總線的事件監聽器,發現問題在這里。因為我在判斷一個定時器是否被銷毀時,直接判斷其類型是 數字 還是 null,由于當定時器開始運行時,每一次返回的都是一個ID(數字),而不是一開始的對象,導致當一條消息開始滾動時,又接收到一條新的消息,然后就使得兩個定時器同時運行,從而出現這個問題。
解決方式:當消息滾動到盒子邊緣銷毀定時器時,將其賦值為null,然后修改中央事件的事件監聽,將其判斷沒有定時器的條件修改為null,然后滿足條件的調用消息滾動函數。
橫向滾動的代碼:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> <style> * { margin: 0; padding: 0; } #title { position: relative; width: 10%; margin: 30px auto; line-height: 30px; height: 30px; border: 1px solid red; overflow: hidden; } #content { position: absolute; left: 0; line-height: 30px; display: inline-block; } </style> </head> <body> <div id="title"> <span id="content">123</span> </div> <script> var wrapEle = document.getElementById('title'); let contentEle = document.getElementById('content'); let arr = [ {news: '這是一條新聞'} ]; let timer = null; move(wrapEle, contentEle); function move(wrap, item) { clearInterval(timer); if (!arr.length) { return false;} item.innerHTML = arr[0].news; arr.splice( 0, 1 ); let allWidth = getCurrentStyle(wrap, 'width'); let itemWidth = getCurrentStyle(item, 'width'); item.style.left = allWidth + 'px'; let speed = 2; let time = 50; timer = setInterval( () => { let itemPlace = getCurrentStyle(item, 'left'); if (itemPlace < -itemWidth) { clearInterval(timer); } item.style.left = itemPlace - speed + 'px'; }, time) } function getCurrentStyle (ele, attr) { return window.getComputedStyle ? parseInt(window.getComputedStyle(ele, null)[attr]) : parseInt(ele.currentStyle[attr] ); } </script> </body> </html>
總結
以上所述是小編給大家介紹的Vue中消息橫向滾動時setInterval清不掉的問題及解決方法,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對億速云網站的支持!
如果你覺得本文對你有幫助,歡迎轉載,煩請注明出處,謝謝!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。