• 👨🏻‍🎓博主介绍:大家好,我是尼克.张,热爱分享知识,很高兴在这里认识大家🌟
  • 🌈擅长领域:前端开发
  • 🙏🏻如果本文章各位小伙伴们有帮助的话,🍭关注+👍🏻点赞+🗣评论+📦收藏,相应的有空了我也会回访,互助!!!
  • 🤝另本人水平有限,旨在创作简单易懂的文章,在文章描述时如有错,恳请各位大佬指正,在此感谢!!!

虚拟滚动加载是使一定数量的dom可见,这样就能减少dom节点,当页面滚动时动态的加载可见dom,所以虽然你看见的节点都不一样,但其实就只有你看到的就那么几个。
在这里插入图片描述

1.要想容器里有滚动条出现,条件是外面的内容的高度低于里面的内容的高度,这是个先决条件。

2.假如容器的总高度为400px,放了10个元素,每个元素40px,假如总共有10000条数据,那么这些元素的总高度为(40 * 10000)px。

3.进行滚动事件的判断,首先获取滚动的距离e.target.scrollTop,因为每个元素40px,所以可以计算出滚动到哪个元素了,start = 距离/40;有了开始的元素,那么怎么算结尾的元素呢?因为每次展示有limit限制,所以end = start + limit,最后运用数组的slice动态截取元素。

4.看似做完了,当你滚动到了某个位置,然而那个位置却是空白???
在这里插入图片描述

原因是自己忘记让元素改变位置,滚动后元素的translateY应为你滚动的距离。

<div id="app" @scroll="handleScroll">
    <ul :style="{height:allHeight}">
        <li class="item" v-for="(item,index) in viewNum" :style="{transform: `translateY(${distance}px)`}">
            {{item}}
        </li>
    </ul>
</div>
let app = new Vue({
    el: "#app",
    data() {
        return {
            total: 100000,
            viewNum: [],
            limit: 10,
            height: 40,
            allNum: [],
            distance: 0
        }
    },
    computed: {
        allHeight() {
            const res = this.total * this.height
            return res + "px"
        }
    },
    created() {
        // 模拟数据
        for (let index = 0; index < this.total; index++) {
            this.allNum.push(index)
        }
        this.handleScroll = throttle(this.dealScroll, 0)
        this.handleScroll()
    },
    methods: {
        dealScroll(e) {
            // 滚动的距离
            this.distance = e?.target?.scrollTop || 0
            // 开始位置
            let start = parseInt(this.distance / this.height)
            //结束位置
            let end = start + this.limit
            //可见数据
            this.viewNum = this.allNum.slice(start, end)
        }
    }
})

在这里插入图片描述

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐