vue实现滚动加载

这篇具有很好参考价值的文章主要介绍了vue实现滚动加载。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.实现某个div的滚动加载

注意 :前提 实现某个div的滚动要设置div的高度 和 overflow-y:auto,踩坑了
1.html

<div ref="box"></div>

2.js

data () {
    return {
        timeList: [],
        // 分页
        page: 1, // 当前页
        page_size: 10, // 每页总条数
        page_count: 1, // 总页数
    }
},
mounted () {
    this.$refs.box.addEventListener('scroll', this.lazyLoading) // 滚动到底部,再加载的处理事件
},
methods:{
	// 请求接口,获取数据
	getData () {
	    const params = {
	    	page: this.page,
            page_size: this.page_size,
        }
	    this.$api.getAttackTimeline(params).then(res => {
	    	this.page_count = res.page_count
	        this.timeList = this.timeList.concat(res.results)
	        if(this.page*this.page_size>= this.page_count) {
            alert("没有更多数据了")
			}
	    })
	},
	// 滚动加载
	lazyLoading (e) {
	    const scrollTop = e.target.scrollTop // 滚动条滚动时,距离顶部的距离
	    const windowHeight = e.target.clientHeight // 可视区的高度
	    const scrollHeight = e.target.scrollHeight // 滚动条的总高度
	    // 滚动条到底部
	    //当滚动过的距离+可视区的高度>=滚动条长度时,就相当于滚动到了底部
	    if (scrollTop + windowHeight === scrollHeight) {
	        this.page++
	        //if (this.page > this.page_count) return
	        this.getData()
	    }
	},
}

页面卸载清除滚动

destroyed() {
        window.removeEventListener('scroll', this.lazyLoading);
    }

至于怎么样判断数据是否加载完毕,到最后一页

每次在请求完成数据的时候去判断一下当前的 page × pagesize是否已经大于等于接口返回的total值就行了

if(this.page*this.page_size>= this.page_count) {
            alert("没有更多数据了")
}

2.监听整个窗口的滚动加载

mounted() {
    window.addEventListener('scroll', this.lazyLoading); // 滚动到底部,再加载的处理事件
},
methods: {
    lazyLoading () { // 滚动到底部,再加载的处理事件
        const scrollTop = document.documentElement.scrollTop || document.body.scrollTop
        const clientHeight = document.documentElement.clientHeight
        const scrollHeight = document.documentElement.scrollHeight

        if (scrollTop + clientHeight >= scrollHeight) {
            // 滚动到底部,逻辑代码
        }
    },
},

3.监听iview表格的滚动加载

mounted () {
    document.getElementsByClassName('ivu-table-body')[0].addEventListener('scroll', this.lazyLoading) // 滚动到底部,再加载的处理事件
},
methods: {
    // 滚动加载
    lazyLoading () {
        const target = document.getElementsByClassName('ivu-table-body')[0]
        const scrollTop = target.scrollTop // 滚动条滚动时,距离顶部的距离
        const windowHeight = target.clientHeight // 可视区的高度
        const scrollHeight = target.scrollHeight // 滚动条的总高度

        if (scrollTop + windowHeight === scrollHeight) {
            // 滚动到底部,逻辑代码
        }
    },
},

4.监听多个表格的滚动加载

a.需求:一个页面存在多个表格,但只需对其中的部分表格实现滚动加载
b.实现方式:

给每个需要滚动加载的表格加入一个plugin-id
根据plugin-id去获取到对应的表格需要滚动的部分
判断是否有 “pluginId”,若有,则说明此表格需要进行滚动加载
c.具体代码

<div
    v-for='(plugin, pluginIndex) in pluginList'
    :key='pluginIndex'
>
    <Table
        :columns='plugin.columns'
        :data='plugin.table_list'
        :id='`plugin-${plugin.id}`'
    />
</div>

2.js(给表格加入滚动监听)

data () {
    return {
        tableScroll: null, // 滚动的表格
    }
},
mounted () {
    this.getPluginIds() // 获取所有需要实现滚动的id
},
methods: {
   // 获取所有需要实现滚动的id
   getPluginIds () {
        this.$api.getPluginIds().then(res => {
            res.forEach(pluginId => {
                this.addScroll(pluginId) // 监听每个表格的滚动
            })
        })
    },
    // 监听每个表格的滚动
    addScroll (pluginId) {
        this.tableScroll = document.getElementById(`plugin-${pluginId}`).getElementsByClassName('ivu-table-body')[0] // 获取到进行滚动的表格
        this.tableScroll.addEventListener('scroll', this.lazyLoading) // 监听滚动
        this.tableScroll.params = { pluginId } // 给表格详情传入:pluginId
    },
    // 滚动加载
    lazyLoading (event) {
        const pluginId = event.target.params?.pluginId

        // 有pluginId:说明是表格详情,需要做滚动加载
        if (pluginId) {
            const target = document.getElementById(`plugin-${pluginId}`).getElementsByClassName('ivu-table-body')[0]
            const scrollTop = target.scrollTop // 滚动条滚动时,距离顶部的距离
            const windowHeight = target.clientHeight // 可视区的高度
            const scrollHeight = target.scrollHeight // 滚动条的总高度

            if (scrollTop + windowHeight === scrollHeight) {
                // 滚动到底部,逻辑代码
                console.log(pluginId)
            }
        }
    },
},

3.完整的js(给表格加入滚动监听+分页信息的处理)

data () {
    return {
        tableScroll: null, // 滚动的表格
        page: {}, // 所有滚动表格的分页信息
    }
},
mounted () {
    this.getPluginIds() // 获取所有需要滚动加载的id
},
methods: {
    // 获取所有需要滚动加载的id
    getPluginIds () {
        this.$api.getPluginIds().then(res => {
            res.forEach(pluginId => {
                this.dealPlugin(pluginId) // 处理单个的表格
            })
        })
    },
    // 处理单个的表格
    dealPlugin (pluginId) {
        // 给每个需要滚动的表格加入分页信息
        this.page[`plugin-${pluginId}`] = {
            current: 1, // 当前页
            page_size: 10, // 每页总条数
            page_count: 1, // 总页数
        }
        this.getPluginTable(pluginId) // 获取每个表格数据
        this.addScroll(pluginId) // 监听每个表格的滚动
    },
    // 获取插件的表格数据
    getPluginTable (pluginId) {
        const params = {
            page: this.page[`plugin-${pluginId}`].current,
            page_size: this.page[`plugin-${pluginId}`].page_size,
        }
        this.$api.getPluginTable(params, pluginId).then(res => {
            const pluginIndex = this.pluginList.findIndex(item => item.id === plugin_id)
            this.pluginList[pluginIndex].table_list = this.pluginList[pluginIndex].table_list.concat(res.results)
            this.page[`plugin-${pluginId}`].page_count = res.page_count
        })
    },
    // 监听每个表格的滚动
    addScroll (pluginId) {
        this.tableScroll = document.getElementById(`plugin-${pluginId}`).getElementsByClassName('ivu-table-body')[0]
        this.tableScroll.addEventListener('scroll', this.lazyLoading) // 滚动到底部,再加载的处理事件
        this.tableScroll.params = { pluginId } // 给表格详情传入:pluginId
    },
    // 滚动加载
    lazyLoading (event) {
        const pluginId = event.target.params?.pluginId

        // 有pluginId:说明是表格详情,需要做滚动加载
        if (pluginId) {
            const target = document.getElementById(`plugin-${pluginId}`).getElementsByClassName('ivu-table-body')[0]
            const scrollTop = target.scrollTop // 滚动条滚动时,距离顶部的距离
            const windowHeight = target.clientHeight // 可视区的高度
            const scrollHeight = target.scrollHeight // 滚动条的总高度

            if (scrollTop + windowHeight === scrollHeight) {
            // 滚动到底部,逻辑代码
                this.page[`plugin-${pluginId}`].current++
                if (this.page[`plugin-${pluginId}`].current > this.page[`plugin-${pluginId}`].page_count) return
                this.getPluginTable(pluginId)
            }
        }
    },
},

本文参考 : https://blog.csdn.net/wytraining/article/details/122543795
https://www.jb51.net/javascript/302873mq0.htm文章来源地址https://www.toymoban.com/news/detail-835142.html

到了这里,关于vue实现滚动加载的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • vue+element-UI实现跟随滚动条加载表格数据

    el-table当数据量大的时候,实现滚动到底部后加载数据,直接上js代码,有其他需求请各自更改  第一步、在data中定义两个数组 第二步、在数据发生改变的方法中先循环存放一部分数据用于页面显示 第三步、在mounted监听滚动事件

    2024年02月16日
    浏览(51)
  • Flutter vs 前端 杂谈:SliverAppBar、手动实现Appbar、前端Html+JS怎么实现滚动变化型Appbar - 比较

    Flutter vs 前端 杂谈 SliverAppBar的弹性背景的显隐效果使用Html+JS怎么实现 作者 : 李俊才 (jcLee95):https://blog.csdn.net/qq_28550263 邮箱 : 291148484@163.com 本文地址 :https://blog.csdn.net/qq_28550263/article/details/134149018 在 Flutter 中,最简单的 appbar 就是 Appbar 组件,它没有任何难点,任何刚

    2024年02月05日
    浏览(37)
  • vue3+element-plus 通过v-infinite实现下拉滚动无限加载

    v-infinite官网 v-infinite-scroll无限滚动组件使用详解  官网给到的基础案例: 自己写了一个简单的demo: 当使用v-infinite时,控制台会报错:  原因: 官方上的Issues解释是需要nextTick()之后再去显示 解决方法是组件挂载完成再去显示el-select组件 所以在上面demo中select组件加了v-if,

    2024年02月09日
    浏览(38)
  • JavaScript中的scrollTop(js中的scrollTop,滚动到顶部,javascript滚动到顶部)

    简述:scrollTop是JavaScript中一个非常有用且重要的方法,它用于获取或设置元素的垂直滚动条位置,实现各种滚动相关的功能,无论是回到顶部、滚动到指定位置还是监听滚动事件,都需要用到scrollTop,在本文中,我们将深入了解scrollTop的用法和实际应用,这是一张scrollTop的关

    2024年02月08日
    浏览(35)
  • vue中数据滚动显示 实现Element-UI中el-table内数据的懒加载

    工作中我们经常会用到element-ui组件库中的le-table组件来展示数据,但当table的数据源数量过大的时候统一展示可能会出现页面卡顿,且会影响用户体验,为此我们可以尝试对el-table中的数据做懒加载的效果展示: 1. 挂在阶段监听el-table的scroll滚动事件 2. 当table表格滚动条的位置

    2023年04月08日
    浏览(46)
  • js,jquery解决 图片加载-滚动底部 问题

    问题描述 :让图片加载完成后,再执行滚动函数,避免出现图片加载一半的时候,滚动下来底部只出现半张图片。 这里记录4种测试成功方式: (适用于不容易找到图片位置的情况,否则直接onload函数即可)

    2024年01月18日
    浏览(27)
  • vue自定义穿梭框支持远程滚动加载

    欢迎点击领取 -《前端开发面试题进阶秘籍》:前端登顶之巅-最全面的前端知识点梳理总结 技术框架公司的选型(老项目):vue2 + iview-ui 方案的实现思路是共性的,展现UI样式需要你们自定义进行更改;因为iview是全局注入,基本使用原先的类名进行二次创建公共组件,修改基

    2024年02月13日
    浏览(27)
  • Vue.js 中使用 Element UI 实现异步加载分页列表

    在前端开发中,我们常常需要展示大量数据,并提供分页浏览的功能。本篇博客将介绍如何使用 Vue.js 和 Element UI 组件库创建一个简单的异步加载分页列表。 Vue.js Element UI JavaScript 我们将创建一个包含表格和分页组件的 Vue 单文件组件。以下是组件的基本结构: 引入 Element U

    2024年02月04日
    浏览(44)
  • h5网站开发,页面加载wow.js动画时,出现了左右滚动条,怎么解决?

    如下图所示,页面在加载WOW动画时出现了左右滚动条: 使用CSS样式来隐藏滚动条 在CSS文件中添加以下样式:

    2024年02月10日
    浏览(30)
  • 小程序实现滚动加载(懒加载)

    小程序是一项很受欢迎的技术,随着其能力的不断增强,越来越多的人开始使用小程序来完成各种任务。当我面面临一个页面有非常多的数据时,该如何处理呢,显然一次性全部加载完,会非常消耗性能的,为了解决这些问题从而出现了一种叫滚动加载的数据处理方式,也被

    2024年02月11日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包