vue滚动加载列表数据展示封装懒加载

在首页的某个组件里数据列表展示要求:

数据列表展示前两条数据,其他数据通过滚动条查看(出于性能要求:滚动查看数据的时候请求数据进行展示)

方法1.根据视图高度滚动加载

1.组件内定义唯一标识id   html:

<template>
  <div id="scrollFlag"
   >组件的数据内容</span>
</template>

2.监听滚动事件 js:

methods: {
    // 监听滚动事件
    listenerFunction(){
      const dom = document.querySelector('#scrollFlag')
      dom.addEventListener('scroll',this.handleScroll,true)
    },
    handleScroll(e){
      let el = e.target
      if(el.scrollTop +el.clientHeight >= el.scrollHeight){
        // 性能问题 第一次请求返回10条数据 可以有滚动的可能,不至于连续触发滚动事件 后续每次滚动 返回数据+5
        this.formlist.pageSize = this.formlist.pageSize + 5
        this.getListDetail()
}
    },
    getListDetail(){
      let params = {
        pageSize: this.formlist.pageSize
        // 其他参数
      }
      getListInfoDetail(params).then(res=>{
        if(res.status === '200'){
          if(res.data && res.data.list&&res.data.list.length >0){
            res.data.list.forEach(item=> {
              // 可以对item 的值进行处理
            });
            this.assetsList = res.data.list
          }
        }else {
          this.formlist.pageNum = 1
          this.formlist.pageSize = 10
        }
      }).catch((err)=>{this.$MesssgeError(err)})
      },
  },
  mounted() {
    // 滚动事件 滚动事件操作了dom 只能放在,mounted 里面
    this.listenerFunction()
  },

这样处理的话就会有一个问题,就是无法识别最后一次加载的数据就是最后一条数据,这样就会多加载一次,

方法2: 懒加载

1.封装懒加载


// 封装自定义指令
import Vue from 'vue'
//v-1azy 用于监听绑定元素可见性
//示例v-1azy="{lazy:lazyLoad,1azyParam:index}",元素可见时,执行1azyLoad方法,并传入1azyparam参数
Vue.directive('lazy', {
  bind(el, binding) {
    try {
      let lazyObserver = new IntersectionObserver((entries, observe) => {
        try {
          entries.forEach(entry => {
            if (entry.intersectionRatio > 0) {
              binding.value.lazy(binding.value.lazyParam)
            }
          })
        } catch (error) {
          binding.value.lazy(binding.value.lazyParam)
        }
      })
      lazyObserver.observe(el)
    } catch (error) {
      binding.value.lazy(binding.value.lazyParam)
    }
  }
})

2.使用懒加载

methosd:{
lazyLoad(index){
  let bottom = index + 1 // 滑动到底部的数量
  if(bottom === this.assetsList.length &&bottom < this.assetsListTotal) {
    // 性能问题 第一次请求返回10条数据 可以有滚动的可能,不至于连续触发滚动事件 后续每次滚动 返回数据+5
    this.formlist.pageSize = this.formlist.pageSize + 5
        this.getListDetail()
  }
},
    getListDetail(){
      let params = {
        pageSize: this.formlist.pageSize
        // 其他参数
      }
      getListInfoDetail(params).then(res=>{
        if(res.status === '200'){
          if(res.data && res.data.list&&res.data.list.length >0){
            // 定义下数量的总数
            this.assetsListTotal  = res.data.total
            res.data.list.forEach(item=> {
              // 可以对item 的值进行处理
            });
            this.assetsList = res.data.list
          }
        }else {
          this.formlist.pageNum = 1
          this.formlist.pageSize = 10
        }
      }).catch((err)=>{this.$MesssgeError(err)})
      },lazyLoad(index){
  let bottom = index + 1 // 滑动到底部的数量
  if(bottom === this.assetsList.length &&bottom < this.assetsListTotal) {
    // 性能问题 第一次请求返回10条数据 可以有滚动的可能,不至于连续触发滚动事件 后续每次滚动 返回数据+5
    this.formlist.pageSize = this.formlist.pageSize + 5
        this.getListDetail()
  }
},
getListDetail(){
  let params = {
    pageSize: this.formlist.pageSize
     // 其他参数
    }
  getListInfoDetail(params).then(res=>{
    if(res.status === '200'){
      if(res.data && res.data.list&&res.data.list.length >0){
        // 定义下数量的总数
        this.assetsListTotal  = res.data.total
        res.data.list.forEach(item=> {
          // 可以对item 的值进行处理
        });
        this.assetsList = res.data.list
       }
    } else {
      this.formlist.pageNum = 1
      this.formlist.pageSize = 10
    }
  }).catch((err)=>{this.$MesssgeError(err)})
},
}

这样就可以实现了,根据接口返回的数据的数量来判断加载的次数

  • 27
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值