Vue中消息横向滚动时setInterval清不掉的问题及解决方法


Posted in Javascript onAugust 23, 2019

最近在做项目时,需要进行两个组件联动,一个轮询获取到消息,然后将其传递给另外一个组件进行横向滚动展示,结果滚动的速度越来越快。这里记录一下来提醒自己。消息滚动的代码在最下面,方便下次使用。

问题背景: 最近在做一个需求,组件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清不掉的问题及解决方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Javascript 相关文章推荐
javascript 命名空间以提高代码重用性
Nov 13 Javascript
js下获取div中的数据的原理分析
Apr 07 Javascript
js正文内容高亮效果的实现方法
Jun 30 Javascript
javascript 循环调用示例介绍
Nov 20 Javascript
几种设置表单元素中文本输入框不可编辑的方法总结
Nov 25 Javascript
JavaScript中创建类/对象的几种方法总结
Nov 29 Javascript
JS中三目运算符和if else的区别分析与示例
Nov 21 Javascript
JavaScript检测实例属性, 原型属性
Feb 04 Javascript
jQuery实现带分组数据的Table表头排序实例分析
Nov 24 Javascript
如何提高数据访问速度
Dec 26 Javascript
bootstrap treeview 扩展addNode方法动态添加子节点的方法
Nov 21 Javascript
JavaScript中set与get方法用法示例
Aug 15 Javascript
微信小程序 授权登录详解(附完整源码)
Aug 23 #Javascript
vue使用微信JS-SDK实现分享功能
Aug 23 #Javascript
VUE实现移动端列表筛选功能
Aug 23 #Javascript
简述ES6新增关键字let与var的区别
Aug 23 #Javascript
微信小程序后台持续定位功能使用详解
Aug 23 #Javascript
详解基于Vue/React项目的移动端适配方案
Aug 23 #Javascript
详解vue-video-player使用心得(兼容m3u8)
Aug 23 #Javascript
You might like
php &amp;&amp; 逻辑与运算符使用说明
2010/03/04 PHP
PHP通过iconv将字符串从GBK转换为UTF8字符集
2011/07/18 PHP
php 地区分类排序算法
2013/07/01 PHP
Yii2实现多域名跨域同步登录退出
2017/02/04 PHP
php上传excel表格并获取数据
2017/04/27 PHP
nicejforms——美化表单不用愁
2007/02/20 Javascript
新手常遇到的一些jquery问题整理
2010/08/16 Javascript
parentElement,srcElement的使用小结
2014/01/13 Javascript
使用base64对图片的二进制进行编码并用ajax进行显示
2017/01/03 Javascript
JavaScript无缝滚动效果的实例代码
2017/03/27 Javascript
ES6使用let命令更简单的实现块级作用域实例分析
2017/03/31 Javascript
前端构建工具之gulp的配置与搭建详解
2017/06/12 Javascript
详解在WebStorm中添加Vue.js单文件组件的高亮及语法支持
2017/10/21 Javascript
karma+webpack搭建vue单元测试环境的方法示例
2018/05/24 Javascript
微信小程序实现折叠展开效果
2018/07/19 Javascript
在Vue-cli里应用Vuex的state和mutations方法
2018/09/16 Javascript
详解如何探测小程序返回到webview页面
2019/05/14 Javascript
layui 动态设置checbox 选中状态的例子
2019/09/02 Javascript
Element Alert警告的具体使用方法
2020/07/27 Javascript
Vue实现返回顶部按钮实例代码
2020/10/21 Javascript
vue打开新窗口并实现传参的图文实例
2021/03/04 Vue.js
详细讲解Python中的文件I/O操作
2015/05/24 Python
Python中threading模块join函数用法实例分析
2015/06/04 Python
python3下实现搜狗AI API的代码示例
2018/04/10 Python
python sklearn库实现简单逻辑回归的实例代码
2019/07/01 Python
python try except返回异常的信息字符串代码实例
2019/08/15 Python
Python中的单下划线和双下划线使用场景详解
2019/09/09 Python
flask框架自定义过滤器示例【markdown文件读取和展示功能】
2019/11/08 Python
Css3圆角边框制作代码
2015/11/18 HTML / CSS
个人能力自我鉴赏
2014/01/25 职场文书
诉讼财产保全担保书
2014/05/20 职场文书
医学求职信
2014/05/28 职场文书
2014离婚协议书范文两篇
2014/09/15 职场文书
交通事故委托书范本(2篇)
2014/09/21 职场文书
安全教育主题班会教案
2015/08/12 职场文书
竞聘开场白方式有哪些?
2019/08/28 职场文书