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 相关文章推荐
让任务管理器中的CPU跳舞的js代码
Nov 01 Javascript
jquery 注意事项与常用语法小结
Jun 07 Javascript
Document对象内容集合(比较全)
Sep 06 Javascript
扩展JS Date对象时间格式化功能的小例子
Dec 02 Javascript
js实现不提交表单获取单选按钮值的方法
Aug 21 Javascript
js数组常见操作及数组与字符串相互转化实例详解
Nov 10 Javascript
jQuery实现div拖拽效果实例分析
Feb 20 Javascript
原生javascript实现的ajax异步封装功能示例
Nov 03 Javascript
AngularJS中directive指令使用之事件绑定与指令交互用法示例
Nov 22 Javascript
canvas绘制表盘时钟
Jan 23 Javascript
原生JS实现小小的音乐播放器
Oct 16 Javascript
vue+egg+jwt实现登录验证的示例代码
May 18 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.ini中date.timezone设置分析
2011/07/29 PHP
php 多文件上传的实现实例
2016/10/23 PHP
thinkphp框架表单数组实现图片批量上传功能示例
2020/04/04 PHP
JS应用之禁止抓屏、复制、打印
2008/02/21 Javascript
javascript 动态修改样式和层叠样式表代码
2010/04/27 Javascript
引用外部js乱码问题分析及解决方案
2013/04/12 Javascript
js生成缩略图后上传并利用canvas重绘
2014/05/15 Javascript
Angularjs注入拦截器实现Loading效果
2015/12/28 Javascript
js方法数据验证的简单实例
2016/09/17 Javascript
使用node.js中的Buffer类处理二进制数据的方法
2016/11/26 Javascript
Bootstrap CSS组件之下拉菜单(dropdown)
2016/12/17 Javascript
js实现文字向上轮播功能
2017/01/13 Javascript
js实现百度登录框鼠标拖拽效果
2017/03/07 Javascript
JavaScript无操作后屏保功能的实现方法
2017/07/04 Javascript
angular4中关于表单的校验示例
2017/10/16 Javascript
浅谈Node.js 中间件模式
2018/06/12 Javascript
Vue组件通信中非父子组件传值知识点总结
2019/12/05 Javascript
Phantomjs抓取渲染JS后的网页(Python代码)
2016/05/13 Python
Python用模块pytz来转换时区
2016/08/19 Python
Flask框架各种常见装饰器示例
2018/07/17 Python
解决pycharm无法识别本地site-packages的问题
2018/10/13 Python
python 生成器和迭代器的原理解析
2019/10/12 Python
python模块常用用法实例详解
2019/10/17 Python
Python 静态方法和类方法实例分析
2019/11/21 Python
Python+Redis实现布隆过滤器
2019/12/08 Python
简单了解Python3 bytes和str类型的区别和联系
2019/12/19 Python
最新PyCharm 2020.2.3永久激活码(亲测有效)
2020/11/26 Python
4s店总经理岗位职责
2013/12/31 职场文书
行政专员岗位职责
2014/01/02 职场文书
函授本科自我鉴定
2014/02/04 职场文书
感恩小明星事迹材料
2014/05/23 职场文书
师范生求职信
2014/06/14 职场文书
慰问信格式规范
2015/03/23 职场文书
离婚协议书范文2016
2016/03/18 职场文书
windows server 2016 域环境搭建的方法步骤(图文)
2022/06/25 Servers
MySQL的表级锁,行级锁,排它锁和共享锁
2022/07/15 MySQL