【Vue】实现无限滚动加载

2023-11-17

先提前预告一下:

  • 如果需要的是单个确定高度的容器组里进行无限滚动刷新,则使用InfiniteScroll最方便

  • 而如果无限滚动依赖的是整个窗口的滚轮到底部,则使用法二才行。ElemntUI的InfiniteScroll无法实现

法一:ElemntUI的InfiniteScroll

组件 | Element

纯模仿官网即可,一定要注意v-infinite-scroll只能是设置在某个独立容器中,而不能是整个页面窗口,如图:

无法对整个页面窗口实现。【所以这个容器必须设置高度,如果没有高度,则默认是一开始就直接疯狂加载响应】
在这里插入图片描述
尝试成功的代码展示:

<el-card 
        class="message-card"
        v-infinite-scroll="load"
        :infinite-scroll-disabled="this.loading || this.noMore"
        infinite-scroll-immediate='false'
        >
        <div v-for="(item, i) in this.messages">
//用到三个变量,offset是跳过第几个
//loading和noMore都是用于什么时候禁用无限滚动加载调用方法
offset: 0,
loading: false,
noMore: false,
messages: []
load(){
	//如果是第一次加载,交给mounted而不是交给scroll的加载
	//或者loading = true表示当前正在加载,不要再触发方法,滚动条此时还在底部
    if(this.loading || this.offset==0) {return}
    //如果还有数据就请求
    if(!this.noMore) {
    	//现在在请求
        this.loading = true
        this.$http.get("/message/"+this.offset)
        .then((res) => {
        	//把数据拼上去
           this.messages = this.messages.concat(res.data.messages)
           //如果这次请求的数据不够10条,说明后面没有数据了
           if(res.data.messages.length < 10) {
               this.noMore = true;
           }
           //下一次从offset+1开始
           this.offset += 10
           //表示加载结束,此时页面也渲染好了,滚动条也不在底部,可以放开等待下一次滚动条到底部
           this.loading = false
       })
   }
},

我遇到的几个问题的解决思路,可以试试

  • 一个是自动一次性全加载了,把load()改成load
v-infinite-scroll="loadLikeMessages()" ×
改成
v-infinite-scroll="loadLikeMessages" √
然后就成功了
  • 还有一个是异常You may have an infinite update loop in a component render function.
    解决是把this.loading = false放在请求结束后的then里,因为是异步请求,如果在外面会提前执行,那么就是不断触发this.loading = true后又 = false,死循环
load(){
    if(!this.noMore) {
    	//现在在请求
        this.loading = true  //《====
        this.$http.get("/message/"+this.offset)
        .then((res) => {
        	xxxxxx
           this.loading = false //《======
       })
   }
   
   //如果在这里this.loading = false,就会死循环
},

法二:直接操作window窗口的滚轮事件

理论基础(重要):

判断滚动条到底部,需要用到DOM的三个属性值,即scrollTop、clientHeight、scrollHeight。

  • scrollTop : 滚动条在Y轴上的滚动距离。

  • clientHeight : 内容可视区域的高度。

  • scrollHeight : 内容可视区域的高度加上溢出(滚动)的距离。

从这个三个属性的介绍就可以看出来,滚动条到底部的条件即为scrollTop + clientHeight == scrollHeight。

举例说明:

请添加图片描述
请添加图片描述

下面先提供三个方法,用来获取scrollTop、clientHeight、scrollHeight的信息。可直接复制使用的,写在methods里

基本原理都是比较document.body.clientHeight与document.documentElement.clientHeight

documentElement 对应的是 html 标签,因此最常用document.documentElement对象来获取这些信息

//获取当前可视范围的高度
getClientHeight() {
    var clientHeight = 0;
    if (document.body.clientHeight && document.documentElement.clientHeight) {
        clientHeight = Math.min(document.body.clientHeight, document.documentElement.clientHeight)
    } else {
        clientHeight = Math.max(document.body.clientHeight, document.documentElement.clientHeight)
    }
    return clientHeight
},
    
//获取文档完整的高度
getScrollHeight() {
    return Math.max(document.body.scrollHeight, document.documentElement.scrollHeight)
}//获取当前滚动条的位置
getScrollTop() {
    var scrollTop = 0;
    //window.pageYOffset = document.documentElement.scrollTop
    if (document.documentElement && document.documentElement.scrollTop) {
        scrollTop = document.documentElement.scrollTop
    } else if (document.body) {
        scrollTop = document.body.scrollTop
    }
    return scrollTop
}

然后我们需要一个监听器,监听滚动事件,在mounted钩子函数中就进行定义,因为我们是直接给window加装的,而不是给某个组件或者标签。因此不需要加入响应事件,但是要指定监听的回调函数,并且最重要的是最后要传入一个true的参数,否则失效。但是要注意,滚动事件的监听器需要手动销毁,否则会曝出异常。

methods: { 
    //使用上面介绍的方法
    getScrollTop(){},
    getClientHeight(){},
    getScrollHeight(){},
    //回调函数
    windowScroll() {
        //获取三个值
        var scrollTop = this.getScrollTop()
        var clientHeight = this.getClientHeight()
        var scrollHeight = this.getScrollHeight()
        //如果满足公式则,确实到底了
        if(scrollTop+clientHeight == scrollHeight){
            //发送异步请求请求数据,同时携带offset并自增offset
            //noMore是自定义变量,如果是最后一批数据则以后都不加载
            if(!this.noMore) {
                this.$http.get("/xxxx"+this.offset).then((res) => {
                    this.news = this.news.concat(res.data.news)
                    if(res.data.news.length < 10) {
                        this.noMore = true;
                    }
                    //记得对offset进行自增
                    this.offset += 10
                })
            }
        }
    }
}
mounted() {
    window.addEventListener('scroll', this.windowScroll,true) //监听页面滚动
},
destroyed() {
    window.removeEventListener("scroll", this.windowScroll);//销毁滚动事件
}
//删除滚动监听器,建议使用beforeRouteLeave,因为destroyed()钩子在路由跳转时不会触发
beforeRouteLeave() {
	window.removeEventListener("scroll", this.windowScroll);//销毁滚动事件
}

到此已经能实现了

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【Vue】实现无限滚动加载 的相关文章

随机推荐

  • 2021-08-03训练记录

    2021 08 03训练记录 Magic Line String Invasion A B C 小biu放牛 小A的游戏 A B C Magic Line 样例输入 1 4 0 1 1 0 1 0 0 1 样例输出 1 999000000
  • 原始GPS与百度、谷歌、高德地图的相互转换(c语言转换)

    原始GPS与百度 谷歌 高德地图的相互转换 c语言转换 原始GPS与百度 谷歌 高德地图的相互转换 1 介绍三种坐标系 2 WGS84 GCJ02 BD09之间的相互转换 C语言实现 原始GPS与百度 谷歌 高德地图的相互转换 1 介绍三种
  • centos 7中NGINX负载均衡(最详细)

    环境 centos7 192 168 186 140 负载均衡 centos7 192 168 186 141 web端 centos7 192 168 186 142 web端 1 关闭防火墙与setenforce web端也要执行 ro
  • json 模块:处理 JSON 数据

    JSON JavaScript Object Notation 是一种轻量级的数据交换格式 易于人阅读和编写 同时也易于机器解析和生成 JSON 基础 JSON 的基础结构有两种 键值对 name value pairs 和数组 array
  • VS编译程序缺失msvcp140d.dll、vcruntime140d.dll和ucrtbased.dll解决方法

    今天编译的一个程序到客户现场电脑上运行闪退 查看发现缺少msvcp140d dll vcruntime140d dll以及ucrtbased dll 总结一下解决办法 供大家参考 方式一 找到对应的 msvcp140d dll vcrunt
  • Java的SSH连接远程服务器

    在我们的示例中 我们将首先打开SSH连接 然后执行一个命令 读取输出并将其写入控制台 最后关闭SSH连接 我们将使示例代码尽可能简单 2 JSch JSch 是SSH2的Java实现 它使我们可以连接到SSH服务器并使用端口转发 X11转发
  • 记几个数据查询语句

    查看某用户所在的表空间SELECT USERNAME DEFAULT TABLESPACE FROM DBA USERS WHERE USERNAME GISAP 查看用户表分区select from user tab partitions
  • java中 instanceof 关键字 作用 和 实际用途

    instanceof 闲聊一下 所谓看书只看前三章 基础java决定上限 所以说基础很重要 Java也是基础扎实决定你的上限 1 instanceof 是Java中的一个关键字 Java中的关键子都是小写 2 instanceof关键字的作
  • 【不忘初心】Windows11 22000.652 X64 四合一[纯净精简版][2.68G](2022.5.3)

    此版可正常更新补丁关闭按流量计费 WIN11全新的UI界面出炉 可以说这一次Windows 11全新升级 无论是从Logo上还是UI界面设计 都有很大的变化 母版来自UUP WIN11 22000 652 为了保证稳定初心的系统全部都是离线
  • 【模拟集成电路】电荷泵(CP)设计

    电荷泵 CP 设计 前言 一 电荷泵 CP 原理 1 电流失配问题 2 开关管的时钟馈通问题 3 电荷注入问题 二 电荷泵 CP 电路 三 电荷泵性能测试 测试原理图 充电测试 放电测试 参考文献 各部分链接链接 前言 本文主要内容是对电荷
  • NLP 算法工程师面试问答-DeepLearningAlgorithm

    关于生成对抗网络GAN 那些你不知道的事 一 动机 之前我们提到玻尔兹曼机 Boltzmann machine 波尔茨曼机作为一种基于能量函数的概率模型 因为能量函数比较复杂 所以存在较多的限制 虽然受限玻尔兹曼机 Restricted B
  • C#通过读取appconfig文件连接数据库

    以Oracle为例 C 连接数据库的时候 需要一些连接字符串 一开始写在程序中 这样会有两个问题 通用性不太好 如果程序具有普遍性 但是连接字符串写死了 每次替换很麻烦 一个工程有很多个项目 每个项目都需要连接字符串 每次更改或者设置也很麻
  • 手机一键制作u盘启动盘_老毛桃U盘启动盘制作教程

    制作前准备 1 准备一个U盘 建议U盘内存8G以上 因为制作时会格式化 请注意备份U盘原资料 2 下载老毛桃U盘装机工具套装 官网 www laomaotao net 老毛桃U盘装机工具下载链接 www laomaotao net 制作过程
  • django 报错:urllib3.exceptions.ConnectTimeoutError 问题解决方法

    问题描述 django项目运行时报错 urllib3 exceptions ConnectTimeoutError
  • opkg 更新软件

    opkg 不同的版本存在不同的配置文件 一般常用的是 etc opkg conf etc opkg customfeeds conf 和 etc opkg distfeeds conf三个 这三个配置文件将会影响opkg运行时软件资源的取向
  • iOS 对象信息保存、转化JSON、JSON生成对象的模型方案记录

    目标 将对象的一些信息提取保存起来 然后转化成JSON 再上传到服务器 或其他保存本地的用途 从服务器接收或从本地读取 然后通过JSON的信息生成指定的对象 方案代码 KeepLabelInfoModel h TestViewXIB Cre
  • AHB VIP Example 的tb_ahb_svt_uvm_basic_ral_sys中关于slave和master接口连接的问题

    AHB 的tb ahb svt uvm basic ral sys中关于slave和master接口连接的问题 这里代码不完整太多没有截完 一 原始使用方法 hdl interconnect中文件的DUT的部分内容是 DUT外面还做了封装
  • element ui表单验证失效原因分析

    1 model 和 v model 需要区分开 model是element ui中的一个属性 而v model才是双向绑定 多表单验证时 model form 中的值不一样 2 prop
  • 浅谈H5的理解

    1 h5广义的概念 描述的是网页技术一次重要的更新迭代 更新的特征包括HTML语言的新特性 CSS的新特性 JavaScript 的新特新 浏览器新特新标准等等 html中新增了语义化标签 表单新增特性 更加简洁的文档声明 媒体标签 vid
  • 【Vue】实现无限滚动加载

    文章目录 法一 ElemntUI的InfiniteScroll 法二 直接操作window窗口的滚轮事件 先提前预告一下 如果需要的是单个确定高度的容器组里进行无限滚动刷新 则使用InfiniteScroll最方便 而如果无限滚动依赖的是整