当前位置:   article > 正文

vue实现虚拟表格 一看就懂_vue虚拟表格

vue虚拟表格

于常见的触底懒加载的优劣对比

优势:

  1. 滚动平滑性: 虚拟列表可以在滚动时实时渲染可见区域内的数据,保持滚动的平滑性,不会因为数据量大而导致滚动卡顿。
  2. 性能优化: 虚拟列表能够有效减少渲染的 DOM 元素数量,从而提高页面的性能和响应速度。
  3. 快速渲染: 虚拟列表根据滚动位置计算需要渲染的数据,渲染速度较快,可以更快地展示数据。

劣势:

  1. 不适用动态数据: 虚拟列表适用于静态数据或数据变化不频繁的情况,对于动态变化的数据需要额外的处理。

效果展示

 

 

创建一个父级div

 

主要添加下面两个属性,其他样式随便

overflow: auto;
position: relative;

 

然后添加子级div仅用于撑开父级,高度是根据数据量来的,我这里模拟1w条数据 高度55w px 

 

 然后再添加 存放数据的盒子 使用绝对定位

数据展示

 

实现逻辑

滚动实际是撑开的div实现的,与数据展示没有关系,展示数据的box盒子 使用绝对定位和top 让它一直固定在能看到的位置

数据的展示:

        上图中可以看到,第一跳数据已经滚动到了顶部以外,当它超出一个行高的时候 它就会被删除替换成地二条数据 比如 开始是 0--9 当滑动的时候 他就变成了 1 -- 10 然后top下移一个行高。

        在下边我们看到除了能看到的22 在dom里面还有24 这个就是防止下滑太快导致出现空白区域的

 完整代码

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. <style>
  7. .content{
  8. width: 500px;
  9. height: 550px;
  10. border: #2d9f75 1px solid;
  11. overflow: auto;
  12. margin: 0 auto;
  13. position: relative;
  14. }
  15. .item-box{
  16. position: absolute;
  17. width: 100%;
  18. top: 0; /* Add top: 0; */
  19. left: 0; /* Add left: 0; */
  20. }
  21. .item-li{
  22. width: 100%;
  23. text-align: center;
  24. height: 55px;
  25. line-height: 55px;
  26. border: antiquewhite 0.5px solid;
  27. }
  28. </style>
  29. </head>
  30. <body>
  31. <div id="app">
  32. <div class="content" ref="contentRef" @scroll="handleScroll">
  33. <!-- 根据总条数和 每行的高度 计算出 高度,次div 只用于撑开父级 出现滚动条-->
  34. <div :style="{'height':`${total * this.lineHeight}px`}"></div>
  35. <!-- 用于绝对定位,展示可视窗口数据-->
  36. <div class="item-box">
  37. <div v-for="(item,index) in visibleList" :key="index" class="item-li">{{item.name}}</div>
  38. </div>
  39. </div>
  40. </div>
  41. <script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
  42. <script>
  43. var app = new Vue({
  44. el: '#app',
  45. data: {
  46. total:10000,// 总条数 ,也可根据list数组长度计算
  47. lineHeight:55,// 每一行高度
  48. bufferSize:2,// 缓冲数
  49. list:[],// 原数组
  50. visibleList: [],// for循环 展示的数组
  51. },
  52. methods:{
  53. updateVisibleList() {
  54. // 获取父级div dom计算距离顶部距离
  55. const content = this.$refs.contentRef;
  56. // 获取浮动div 设置top值
  57. const itemBox = this.$el.querySelector('.item-box');
  58. // content.scrollTop 是当前滚动条距离顶部的距离 / this.lineHeight(每行高度) 得出可视窗口内 展示的数据开始下标
  59. const startIndex = Math.floor(content.scrollTop / this.lineHeight);
  60. /* content.clientHeight 可视窗口区域高度用于计算 窗口内展示多少行数据 ,
  61. bufferSize缓冲数 在原数据上多显示两行 防止快速滑动的时候出现白色区域*/
  62. const endIndex = startIndex + Math.ceil(content.clientHeight / this.lineHeight) + this.bufferSize;
  63. // list 是1万条数据,visibleList才是正常for循环的数据,需要根据下标赋值
  64. this.visibleList = this.list.slice(startIndex, endIndex);
  65. // 设置绝对定位top 使得 itemBox 始终在我们的视线内
  66. itemBox.style.top = `${startIndex * this.lineHeight}px`;
  67. },
  68. handleScroll(){
  69. this.updateVisibleList();
  70. }
  71. },
  72. mounted(){
  73. // 构造1万条数据 一般来说是从后端请求的数据
  74. for (let i = 0; i < this.total;i++) {
  75. this.list.push({
  76. name:'name'+i
  77. })
  78. }
  79. this.updateVisibleList();
  80. }
  81. })
  82. </script>
  83. </body>
  84. </html>

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

闽ICP备14008679号