qt给qdialog加一个滚动条_用vue实现一个虚拟列表

f293072b6e21fadaa671f32c93f58929.png

上次分享了超长列表分片加载的方式,这种方式现在一般不会使用,因为dom会变的无比庞大,页面会很卡,今天分享用vue实现一个虚拟列表的简易实现,本来是想用原生实现一个,后来觉得直接使用computed,简单一些。

思路就是用vue的for循环渲染列表,自己手动加一个滚动条,然后通过监听scroll,算出应该显示到第几个,通过计算属性截取显示的数据,直接上代码: 

<html lang="en"><head>    <meta charset="UTF-8">    <title>Titletitle>    <style>        .list-wrap{            position: relative;            overflow-y: scroll;            width: 200px;            margin: 100px auto;            box-sizing: border-box;            border: solid 1px red;        }        .list{            position: absolute;            top: 0;            left: 0;        }        .list li{            border: solid 1px blue;            line-height: 30px;        }style>head><body><ul id="app">    <div class="list-wrap" ref="listWrap" @scroll="scrollListener">        <div class="scroll-bar" ref="scrollBar">div>        <ul class="list" ref="list">            <li v-for="val in showList">{{val}}li>        ul>    div>ul><script src="../../js/vue.js">script><script>    new Vue({        el: '#app',        data(){            return {                list: [],//超长的显示数据                itemHeight: 30,//每一列的高度                showNum: 10,//显示几条数据                start: 0,//滚动过程显示的开始索引                end: 10,//滚动过程显示的结束索引            }        },        computed: {            //显示的数组,用计算属性计算            showList(){                return this.list.slice(this.start, this.end);            }        },        mounted(){            //构造一个超长列表            for (let i = 0; i < 1000000; i++) {                this.list.push('列表' + i)            }            //计算滚动容器高度            this.$refs.listWrap.style.height = this.itemHeight * this.showNum + 'px';            //计算总的数据需要的高度,构造滚动条高度            this.$refs.scrollBar.style.height = this.itemHeight * this.list.length + 'px';        },        methods: {            scrollListener(){                //获取滚动高度                let scrollTop = this.$refs.listWrap.scrollTop;                //开始的数组索引                this.start = Math.floor(scrollTop / this.itemHeight);                //结束索引                this.end = this.start + this.showNum;                //绝对定位对相对定位的偏移量                this.$refs.list.style.top = this.start * this.itemHeight + 'px';            }        }    })script>body>html>

看效果:

01876a5d8db0a48f5e00bc19846f9986.gif 

其实原理很简单,把代码跑起来,输出看看这些数据就很容易就搞懂虚拟列表的实现了。但这只是实现,要想做的更好就很难了。比如可以前后多添加几条数据,像swiper样,然后滚动的过程加一些小的过渡动画,让页面滑动过程柔顺一些,还有,做个节流还是很有必要的。要是想做高度不固定的,那就更难了,要缓存每个列表的高度,然后用一些算法去计算滚动过程的高度。

最后祝大家六一快乐!!!

(可添加好友共同进步)

Coding 个人笔记

ec4eade142f5526c37677b8e4820ebc1.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值