• vue中使用setInterval,移入暂停,移出继续


    首先提出一点!

    在vue中使用 setInterval(),切记需要将其绑定到window上面,不然的话,你是没有办法进行控制其关闭与否的

    讲一个我自己在工作中遇到的需求吧先:右侧模块中。自动进行滚动,滚动到底之后,返回顶部继续滚动,并且鼠标移入暂停,移出继续滚动

    当看到这个需求的时候,我第一个想法是通过swiper来进行实现,因为swiper确实有比较全面的方法来实现,只是相对来说有些麻烦了(相对于JS的方法实现)

    先贴一张图片吧:

    对与上图的红色框框,我使用了overflow-y:scroll;    class::-webkit-scrollbar{display:none}  来实现的无滚动条可滚动区域

    因为是vue项目,所以我给红色框框加了一个ref,---->        <div ref="jiangxi"></div>

    在data中声明了一个变量 : ---->   dsJX:""    (命名用了简写   "定时江西" == dsJX )   声明另一个变量 : ---->  jxNum:0 ,(用于记录滚动位置,为暂停之后再继续的时候使用)

    然后写了一个方法,代码如下,将这个方法放到mounted中,即可进入页面便进行滚动

     // 江西定时器
        dsJiangXi() {
          let that = this;
          let num = 0;
          that.dsJX = window.setInterval(() => {
            if (num < that.$refs.jiangxi.scrollHeight) {
              num = Math.floor(parseInt(num) + 1);
              that.$refs.jiangxi.scrollTop = num;
              if (num > 400) {
                that.$refs.jiangxi.scrollTop = 0;
                num = 0;
              }
          that.jxNum = num }
    }, 50); },

    在上面的方法中,let that = this  是因为 setInterval 和 setTimeout中对没有声明的this指向是不明确的,会报错,找不到对应的属性或方法

    let num = 0 : ----------------->声明一个变量

    用在data中声明的变量dsJX来接收 定时器,方便之后的操作(暂停)

    that.$refs.jiangxi.scrollHeight  : ----------------------> 获取当前dom元素的高度      jiangxi : 在div中定义的ref

    Math.floor()返回小于或等于一个给定数字的最大整数。可以理解为:向下取整

    条件是如果num小于元素的高度,那么就给num+1,并且设置一个最高值,如果num大于400,那么就还原num的高度、dom元素的高度

    that.jxNum = num ,将当前的num的值存入到jxNum中

    下面就是一个暂停的方法了,这个方法非常简单:

    // 移入江西
        yiRuJX() {
          clearInterval(this.dsJX);
        },

    clearInterval(),关闭定时器的方法  this.dsJX 是我们在之前声明的,接收了一个定时器

    暂停之后再继续的话,简单理解就是移入的时候,记录下来一个位置,移出的时候,在继续从这个位置开始滚动,我们在之前的定时器方法中,已经接收了一个jxNum

    有了这个jxNum,剩下的就简单了,我们只需要再写一个定时器的方法即可,如下:

    // 移出江西
        yiChuJX() {
          let that = this;
          that.dsJX = window.setInterval(() => {
            if (that.jxNum < that.$refs.jiangxi.scrollHeight) {
              that.jxNum = Math.floor(parseInt(that.jxNum) + 1);
              that.$refs.jiangxi.scrollTop = that.jxNum;
              if (that.jxNum > 400) {
                that.$refs.jiangxi.scrollTop = 0;
                that.jxNum = 0;
              }
            }
          }, 50);
        },

    可以看出,跟第一个定时器的方法只有一点区别,那就是num不在声明,直接使用了data中的jxNum

    至此,一个可以循环滚动,移入暂停、移出继续滚动的功能就做完了

     

  • 相关阅读:
    解决 JDK1.7 不支持 VCenter 6.7 的问题(涉及到Https TLS1.2协议)
    无法删除另一个分区的windows文件夹
    首次将项目从eclipse提交到服务器的SVN
    无法截图右键菜单
    配置文件无法修改(以修改my-default.ini为例)
    运行JavaWeb项目报错Access denied for user 'root'@'localhost' (using password: YES)
    jquery.page.js插件在使用时重复触发“上一页”和“下一页”操作
    请求ajax失败的原因(进入到error)
    ajax请求执行完成后再执行其他操作(jQuery.page.js插件使用为例)
    img标签src资源无法加载,报net::ERR_RESPONSE_HEADERS_MULTIPLE_CONTENT_DISPOSITION错
  • 原文地址:https://www.cnblogs.com/a973692898/p/15353039.html
Copyright © 2020-2023  润新知