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 11 Javascript
招聘网站基于jQuery实现自动刷新简历
May 10 Javascript
详解javascript表单的Ajax提交插件的使用
Dec 29 Javascript
vue 自定义组件 v-model双向绑定、 父子组件同步通信的多种写法
Nov 27 Javascript
将jquery.qqFace.js表情转换成微信的字符码
Dec 01 jQuery
Node.js中的cluster模块深入解读
Jun 11 Javascript
Puppet的一些技巧
Sep 17 Javascript
vue 实现小程序或商品秒杀倒计时
Apr 14 Javascript
微信小程序保持session会话的方法
Mar 20 Javascript
微信小程序清空输入框信息与实现屏幕往上滚动的示例代码
Jun 23 Javascript
查找Vue中下标的操作(some和findindex)
Aug 12 Javascript
vue路由结构可设一层方便动态添加路由操作
Aug 31 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中include()与require()的区别说明
2010/03/10 PHP
DedeCMS dede_channeltype表字段注释
2010/04/07 PHP
php 判断网页是否是utf8编码的方法
2014/06/06 PHP
PHP中round()函数对浮点数进行四舍五入的方法
2014/11/19 PHP
php校验表单检测字段是否为空的方法
2015/03/20 PHP
PHP实现登录验证码校验功能
2018/05/17 PHP
PHP数组Key强制类型转换实现原理解析
2020/09/01 PHP
表头固定(利用jquery实现原理介绍)
2012/11/08 Javascript
javascript将url中的参数加密解密代码
2014/11/17 Javascript
javascript之with的使用(阿里云、淘宝使用代码分析)
2016/10/11 Javascript
详解react-webpack2-热模块替换[HMR]
2017/08/03 Javascript
vue-cli和v-charts实现可视化图表过程解析
2019/10/08 Javascript
js实现3D照片墙效果
2019/10/28 Javascript
微信小程序实现单个卡片左滑显示按钮并防止上下滑动干扰功能
2019/12/06 Javascript
es6 for循环中let和var区别详解
2020/01/12 Javascript
微信小程序之滑动页面隐藏和显示组件功能的实现代码
2020/06/19 Javascript
[07:43]《辉夜杯》公开赛晋级外卡赛战队—TRG训练生活探秘
2015/12/11 DOTA
[02:00]DAC2018主宣传片——龙征四海,剑问东方
2018/03/20 DOTA
Python素数检测实例分析
2015/06/15 Python
用Python写冒泡排序代码
2016/04/12 Python
利用标准库fractions模块让Python支持分数类型的方法详解
2017/08/11 Python
Python编程scoketServer实现多线程同步实例代码
2018/01/29 Python
使用pandas的DataFrame的plot方法绘制图像的实例
2018/05/24 Python
python 字典修改键(key)的几种方法
2018/08/10 Python
python实现自动登录后台管理系统
2018/10/18 Python
Python使用dict.fromkeys()快速生成一个字典示例
2019/04/24 Python
Python常驻任务实现接收外界参数代码解析
2020/07/21 Python
世界上最大的罕见唱片、CD和音乐纪念品网上商店:991.com
2018/05/03 全球购物
美国台面电器和厨具品牌:KitchenAid
2019/04/12 全球购物
大学生思想汇报范文
2013/12/31 职场文书
销售简历自我评价
2014/01/24 职场文书
职务任命书范本
2014/06/05 职场文书
井冈山红色之旅心得体会
2014/10/07 职场文书
2014年资料员工作总结
2014/11/18 职场文书
小学音乐教师个人工作总结
2015/02/05 职场文书
诚信考试主题班会
2015/08/17 职场文书