当前位置:   article > 正文

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

vue 滚动加载数据

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

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

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

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

  1. <template>
  2. <div id="scrollFlag"
  3. >组件的数据内容</span>
  4. </template>

2.监听滚动事件 js:

  1. methods: {
  2. // 监听滚动事件
  3. listenerFunction(){
  4. const dom = document.querySelector('#scrollFlag')
  5. dom.addEventListener('scroll',this.handleScroll,true)
  6. },
  7. handleScroll(e){
  8. let el = e.target
  9. if(el.scrollTop +el.clientHeight >= el.scrollHeight){
  10. // 性能问题 第一次请求返回10条数据 可以有滚动的可能,不至于连续触发滚动事件 后续每次滚动 返回数据+5
  11. this.formlist.pageSize = this.formlist.pageSize + 5
  12. this.getListDetail()
  13. }
  14. },
  15. getListDetail(){
  16. let params = {
  17. pageSize: this.formlist.pageSize
  18. // 其他参数
  19. }
  20. getListInfoDetail(params).then(res=>{
  21. if(res.status === '200'){
  22. if(res.data && res.data.list&&res.data.list.length >0){
  23. res.data.list.forEach(item=> {
  24. // 可以对item 的值进行处理
  25. });
  26. this.assetsList = res.data.list
  27. }
  28. }else {
  29. this.formlist.pageNum = 1
  30. this.formlist.pageSize = 10
  31. }
  32. }).catch((err)=>{this.$MesssgeError(err)})
  33. },
  34. },
  35. mounted() {
  36. // 滚动事件 滚动事件操作了dom 只能放在,mounted 里面
  37. this.listenerFunction()
  38. },

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

方法2: 懒加载

1.封装懒加载

  1. // 封装自定义指令
  2. import Vue from 'vue'
  3. //v-1azy 用于监听绑定元素可见性
  4. //示例v-1azy="{lazy:lazyLoad,1azyParam:index}",元素可见时,执行1azyLoad方法,并传入1azyparam参数
  5. Vue.directive('lazy', {
  6. bind(el, binding) {
  7. try {
  8. let lazyObserver = new IntersectionObserver((entries, observe) => {
  9. try {
  10. entries.forEach(entry => {
  11. if (entry.intersectionRatio > 0) {
  12. binding.value.lazy(binding.value.lazyParam)
  13. }
  14. })
  15. } catch (error) {
  16. binding.value.lazy(binding.value.lazyParam)
  17. }
  18. })
  19. lazyObserver.observe(el)
  20. } catch (error) {
  21. binding.value.lazy(binding.value.lazyParam)
  22. }
  23. }
  24. })

2.使用懒加载

  1. methosd:{
  2. lazyLoad(index){
  3. let bottom = index + 1 // 滑动到底部的数量
  4. if(bottom === this.assetsList.length &&bottom < this.assetsListTotal) {
  5. // 性能问题 第一次请求返回10条数据 可以有滚动的可能,不至于连续触发滚动事件 后续每次滚动 返回数据+5
  6. this.formlist.pageSize = this.formlist.pageSize + 5
  7. this.getListDetail()
  8. }
  9. },
  10. getListDetail(){
  11. let params = {
  12. pageSize: this.formlist.pageSize
  13. // 其他参数
  14. }
  15. getListInfoDetail(params).then(res=>{
  16. if(res.status === '200'){
  17. if(res.data && res.data.list&&res.data.list.length >0){
  18. // 定义下数量的总数
  19. this.assetsListTotal = res.data.total
  20. res.data.list.forEach(item=> {
  21. // 可以对item 的值进行处理
  22. });
  23. this.assetsList = res.data.list
  24. }
  25. }else {
  26. this.formlist.pageNum = 1
  27. this.formlist.pageSize = 10
  28. }
  29. }).catch((err)=>{this.$MesssgeError(err)})
  30. },lazyLoad(index){
  31. let bottom = index + 1 // 滑动到底部的数量
  32. if(bottom === this.assetsList.length &&bottom < this.assetsListTotal) {
  33. // 性能问题 第一次请求返回10条数据 可以有滚动的可能,不至于连续触发滚动事件 后续每次滚动 返回数据+5
  34. this.formlist.pageSize = this.formlist.pageSize + 5
  35. this.getListDetail()
  36. }
  37. },
  38. getListDetail(){
  39. let params = {
  40. pageSize: this.formlist.pageSize
  41. // 其他参数
  42. }
  43. getListInfoDetail(params).then(res=>{
  44. if(res.status === '200'){
  45. if(res.data && res.data.list&&res.data.list.length >0){
  46. // 定义下数量的总数
  47. this.assetsListTotal = res.data.total
  48. res.data.list.forEach(item=> {
  49. // 可以对item 的值进行处理
  50. });
  51. this.assetsList = res.data.list
  52. }
  53. } else {
  54. this.formlist.pageNum = 1
  55. this.formlist.pageSize = 10
  56. }
  57. }).catch((err)=>{this.$MesssgeError(err)})
  58. },
  59. }

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/700532
推荐阅读
相关标签
  

闽ICP备14008679号