最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Vue中消息橫向滾動時setInterval清不掉的問題及解決方法

 更新時間:2019年08月23日 14:29:19   作者:雨夜望月  
最近在做項目時,需要進(jìn)行兩個組件聯(lián)動,一個輪詢獲取到消息,然后將其傳遞給另外一個組件進(jìn)行橫向滾動展示,結(jié)果滾動的速度越來越快。接下來通過本文給大家分享Vue中消息橫向滾動時setInterval清不掉的問題及解決方法,感興趣的朋友一起看看吧

最近在做項目時,需要進(jìn)行兩個組件聯(lián)動,一個輪詢獲取到消息,然后將其傳遞給另外一個組件進(jìn)行橫向滾動展示,結(jié)果滾動的速度越來越快。這里記錄一下來提醒自己。消息滾動的代碼在最下面,方便下次使用。

問題背景: 最近在做一個需求,組件A獲取消息采用的是輪詢,組件A獲取到新的消息后,將組件A中的消息傳遞給另外一個組件B,當(dāng)組件B接收到消息時就讓消息在頁面上滾動播放。

實現(xiàn)思路: 這個項目應(yīng)用的框架為VUE,當(dāng)組件A獲取到新的消息之后,就觸發(fā)中央事件總線,在組件B中進(jìn)行事件監(jiān)聽,將其添加進(jìn)入一個數(shù)組,當(dāng)判斷定時器沒有運動時,就觸發(fā)滾動的函數(shù)。消息滾動的函數(shù)是從消息數(shù)組中提取出第一條,然后利用定時器進(jìn)行消息滾動,當(dāng)消息滾動到邊緣時清除定時器。

問題:消息在滾動的過程中,該開始還能夠按照給定的速度進(jìn)行滾動,可是當(dāng)時間變長后就會出現(xiàn)消息滾動的速度越來越快的問題。

原因:當(dāng)出現(xiàn)這個問題時,我第一個念頭就是setInterval沒有被清掉,因為當(dāng)定時器沒有清掉之后又再次調(diào)用定時器就會導(dǎo)致多個定時器同時執(zhí)行,比如第一次是一個計時器,再點一下是就是兩個定時器,這時候每次就是+2,所以速度不斷提升。我看了一下我設(shè)置的滾動函數(shù),里面當(dāng)消息滾動到邊緣時,就清除這個定時器,所以在滾動函數(shù)中沒有問題。我又看了下中央事件總線的事件監(jiān)聽器,發(fā)現(xiàn)問題在這里。因為我在判斷一個定時器是否被銷毀時,直接判斷其類型是 數(shù)字 還是 null,由于當(dāng)定時器開始運行時,每一次返回的都是一個ID(數(shù)字),而不是一開始的對象,導(dǎo)致當(dāng)一條消息開始滾動時,又接收到一條新的消息,然后就使得兩個定時器同時運行,從而出現(xiàn)這個問題。

解決方式:當(dāng)消息滾動到盒子邊緣銷毀定時器時,將其賦值為null,然后修改中央事件的事件監(jiān)聽,將其判斷沒有定時器的條件修改為null,然后滿足條件的調(diào)用消息滾動函數(shù)。

橫向滾動的代碼:

<!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>

總結(jié)

以上所述是小編給大家介紹的Vue中消息橫向滾動時setInterval清不掉的問題及解決方法,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
如果你覺得本文對你有幫助,歡迎轉(zhuǎn)載,煩請注明出處,謝謝!

相關(guān)文章

  • Vue常用傳值方式、父傳子、子傳父及非父子實例分析

    Vue常用傳值方式、父傳子、子傳父及非父子實例分析

    這篇文章主要介紹了Vue常用傳值方式、父傳子、子傳父及非父子,結(jié)合實例形式分析了vue.js常見的傳值方式及相關(guān)操作注意事項,需要的朋友可以參考下
    2020-02-02
  • vue封裝自定義指令之動態(tài)顯示title操作(溢出顯示,不溢出不顯示)

    vue封裝自定義指令之動態(tài)顯示title操作(溢出顯示,不溢出不顯示)

    這篇文章主要介紹了vue封裝自定義指令之動態(tài)顯示title操作(溢出顯示,不溢出不顯示),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-11-11
  • vue實現(xiàn)換膚功能

    vue實現(xiàn)換膚功能

    這篇文章主要為大家詳細(xì)介紹了vue實現(xiàn)換膚功能,一套深色,一套淺色,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-07-07
  • Vue.use()和Vue.prototype使用詳解

    Vue.use()和Vue.prototype使用詳解

    Vue.use()主要用于注冊全局插件,當(dāng)插件具有install方法時,調(diào)用Vue.use()可以全局使用該插件,Vue.prototype用于注冊全局變量,這些變量在項目任何位置都可以通過this.$變量名訪問,兩者的主要區(qū)別在于Vue.use()用于插件,Vue.prototype用于變量
    2024-10-10
  • 聊聊Vue中provide/inject的應(yīng)用詳解

    聊聊Vue中provide/inject的應(yīng)用詳解

    這篇文章主要介紹了聊聊Vue中provide/inject的應(yīng)用詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-11-11
  • 一文帶你了解什么是Vue?Vapor

    一文帶你了解什么是Vue?Vapor

    隨著Svelte和SolidJS的流行,無虛擬DOM模式逐漸開始火了起來,Vue?Vapor就是一個無虛擬DOM模式版本的vue,下面就跟隨小編一起來深入了解一下Vue?Vapor吧
    2024-11-11
  • vue中的ElementUI的使用詳解

    vue中的ElementUI的使用詳解

    本文通過實例代碼給大家介紹了vue中的ElementUI的使用,代碼簡單易懂,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-10-10
  • 淺析從面向?qū)ο笏季S理解Vue組件

    淺析從面向?qū)ο笏季S理解Vue組件

    用面向?qū)ο蟮乃季S去理解Vue組件,可以將所有的事物都抽象為對象,而類或者說是組件,都具有屬性和操作。這篇文章主要介紹了嘗試用面向?qū)ο笏季S理解Vue組件,需要的朋友可以參考下
    2021-07-07
  • Vue3源碼解讀computed和watch

    Vue3源碼解讀computed和watch

    這篇文章主要為大家介紹了Vue3中的computed和watch源碼解讀分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-03-03
  • Vue獲取微博授權(quán)URL代碼實例

    Vue獲取微博授權(quán)URL代碼實例

    這篇文章主要介紹了Vue獲取微博授權(quán)URL代碼實例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-11-11

最新評論

自治县| 巴里| 民和| 临泽县| 礼泉县| 黄骅市| 孟津县| 远安县| 孟津县| 慈利县| 阿巴嘎旗| 白玉县| 两当县| 双桥区| 吕梁市| 体育| 临朐县| 澜沧| 安阳市| 灵川县| 五原县| 汝城县| 罗平县| 专栏| 无锡市| 南昌市| 阳新县| 静海县| 永清县| 鄢陵县| 建德市| 青浦区| 瑞昌市| 池州市| 迁安市| 水富县| 措勤县| 三河市| 寻乌县| 巴林左旗| 社会|