vue项目滚动监听跳坑记录

vue项目滚动监听跳坑记录

最近在使用vue写后台管理系统,需要做下拉加载数据的功能,所以使用了js的addEventListener监听页面滚动,代码如下:

  scrol() {
    const dom = document.documentElement || document.body
    this.absTop = dom.scrollTop
    console.log('scrol:' + this.absTop)
  },
  handleScroll() {
      this.scrol()
      const dom = document.documentElement || document.body
      // html 可视区域高度
      const domclientH = document.documentElement.clientHeight || document.body.clientHeight
      // 滚动过的距离
      const sTop = dom.scrollTop
      // html 总高度,包括滚动的部分  dom.scrollHeight
      const sH = dom.scrollHeight
      const chazhi = sH - domclientH - sTop
      // 判断是否触底,之所以小于2而不是0,是因为有些电脑分辨率,会偏小,出现小数点后N多位
      if (chazhi <= 2) {
        // 记录触发请求数据是,滚动过的距离
        this.absTop = sTop
        this.loadingTop = true
        this.page++
        // 请求数据
        this.onsubmit()
      }
    }
  },
  mounted() {
  // addEventListener回调函数没有使用匿名函数,是因为匿名函数的监听不能removeEventListener被移除
  // 移除监听  window.removeEventListener('scroll', this.handleScroll)
  // 开启监听页面滚动
    window.addEventListener('scroll', this.handleScroll)
  }

但是在数据渲染完成之后,发现页面会自动滚动到底部,自动重新向后台请求数据,一直陷入死循环,不断加载数据,而不是在数据渲染完成后滚动条不动,手动使滚动条触底,重新触发请求。

解决问题

经过不懈的了解和尝试,在页面数据加载完成之后,滚动条才自动滚动到底部的,所以这里使用的vue 的生命周期updated 来解决,updated 是数据加载完成之后执行,就是在触发滚动的时候记录当前滚动过的距离,然后在updated 中重新设置元素滚动过的距离就可以解决 ,代码如下:

    const dom = document.documentElement || document.body
    if (this.absTop > 0) {
      dom.scrollTop = this.absTop
    }

附 — vue页面的完整滚动监听,加载数据

export default {
  data() {
    return {
      // 记录当前滚动过的距离
      absTop: 0
    }
  },
  methods: {
    scrol() {
      // 开始滚动监听后,读取元素滚动过的距离
      const dom = document.documentElement || document.body
      this.absTop = dom.scrollTop
      console.log('scrol:' + this.absTop)
    },
    handleScroll() {
     // showNo 用来判断是否还有数据,true是没有数据,false是还有数据,需要继续监听滚动,根据项目需求设置
     // if (this.showNo === false) {
        this.scrol()
        const dom = document.documentElement || document.body
        // html 可视区域高度
        const domclientH = document.documentElement.clientHeight || document.body.clientHeight
        // 滚动过的距离
        const sTop = dom.scrollTop
        // html 总高度,包括滚动的部分  dom.scrollHeight
        const sH = dom.scrollHeight
        const chazhi = sH - domclientH - sTop
        console.log(sTop)
        // 判断是否触底
        if (chazhi <= 2) {
        //记录当前滚动过的距离
          this.absTop = sTop
          this.page++
          // 请求数据
          this.onsubmit()
        }
      //}
    }
  },
  updated() {
  	// 消除数据加载完成之后,滚动条自动滚动到页面底部的问题
  	// absTop 是上次滚动过的距离
    const dom = document.documentElement || document.body
    if (this.absTop > 0) {
      dom.scrollTop = this.absTop
    }
  },
  destroyed() {
    // 关闭当前页面时清除滚动监听
    window.removeEventListener('scroll', this.handleScroll)
  },
  mounted() {
    // 页面加载完成后添加滚动监听,并设置滚动条在顶部
    const dom = document.documentElement || document.body
    dom.scrollTop = 0
    window.addEventListener('scroll', this.handleScroll)
  },
  watch: {}
</script>
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值