广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >Vue.js如何优化无限滚动列表
  • 664
分享到

Vue.js如何优化无限滚动列表

2024-04-02 19:04:59 664人浏览 泡泡鱼
摘要

这篇文章给大家分享的是有关vue.js如何优化无限滚动列表的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。问题大家都知道,WEB 页面修改 DOM 是开销较大的操作,相比其他操作要

这篇文章给大家分享的是有关vue.js如何优化无限滚动列表的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

问题

大家都知道,WEB 页面修改 DOM 是开销较大的操作,相比其他操作要慢很多。这是为什么呢?因为每次 DOM 修改,浏览器往往需要重新计算元素布局,再重新渲染。也就是所谓的重排(reflow)和重绘(repaint)。尤其是在页面包含大量元素和复杂布局的情况下,性能会受到影响。那对用户有什么实际的影响呢?

一个常见的场景是大数据量的列表渲染。通常表现为可无限滚动的无序列表或者表格,当数据很多时,页面会出现明显的滚动卡顿,严重影响了用户体验。怎么解决呢?

解决方案

既然问题的根源是 DOM 元素太多,那就想办法限制元素数量。

  • 限制列表对用户可见的元素数量。我们把可见区域称为 ViewPort

  • 当列表滚动时,列表种的其他元素怎么由不可见变为可见?

  • 监听列表容器元素的滚动事件,当列表里的元素进入可视区域,则添加到DOM中

  • 问题是如果一直这么滚下去,列表会越来越大。所以需要在列表元素离开 ViewPort 的时候从DOM中移除

  • 问题又来了,由于 ViewPort 刚好是一屏的大小,滚动的时候元素还没来得及渲染,会出现一段时间的空白。解决办法就是上下增加一部分数据渲染。

Vue.js如何优化无限滚动列表

无限滚动的性能优化方案基本思路就是这样。

在实际项目中,我们可能不需要自己从头实现一个无限滚动列表组件,Vue.js 就有一个现成的轮子:vue-virtual-scroller。

在项目中安装这个插件

$ npm install -D vue-virtual-scroller

项目入口文件 main.js 引入这个插件:

import "vue-virtual-scroller/dist/vue-virtual-scroller.CSS";
import Vue from "vue";
import VueVirtualScroller from "vue-virtual-scroller";

Vue.use(VueVirtualScroller);

案例一:VirtualList

我们来看一个简单的例子,用vue-virtual-scroller渲染一个包含大量数据的列表。 先用JSON-Generator 生成 5000 条数据的 JSON 对象,并保存到 data.json 文件。可以用下面的规则:

[
 '{{repeat(5000)}}',
 {
  _id: '{{objectId()}}',
  age: '{{integer(20, 40)}}',
  name: '{{firstName()}} {{surname()}}',
  company: '{{company().toUpperCase()}}'
 }
]

新建一个 VirtualList.vue 文件,引入data.json,并将它赋值给组件的items属性。然后套一个 <virtual-scroller>组件:

VirtualList.vue:

<template>
 <virtual-scroller :items="items" item-height="40" content-tag="ul">
  <template slot-scope="props">
   <li :key="props.itemKey">{{props.item.name}}</li>
  </template>
 </virtual-scroller>
</template>

<script>
import items from "./data.json";

export default {
 data: () => ({ items })
};
</script>

virtual-scroller 组件必须设置 item-height 。另外,由于我们要创建一个列表,可以设置content-tag="ul",表示内容渲染成 <ul>标签。

vue-virtual-scroller 支持使用 scoped slots,增加了内容渲染的灵活性。通过使用slot-scope="props",我们可以访问 vue-virtual-scroller 暴露的数据。

props 有一个itemKey属性,出于性能考虑,我们应该在内容部分的根元素上绑定 :key="props.itemKey"。然后我们就可以通过 props.item 拿到 JSON 里的原始数据了。

如果你要给列表设置样式,可以给 virtual-scroller 设置 class属性:

<template>
 <virtual-scroller class="virtual-list" ...></virtual-scroller>
</template>

<style>
.virtual-list ul {
 list-style: none;
}
</style>

或者也可以用scoped 样式,用 /deep/选择器:

<style scoped>
.virtual-list /deep/ ul {
 list-style: none;
}
</style>

案例二: VirtualTable

类似 VirtualList,我们再看一个表格组件VirtualTable: VirtualTable.vue:

<template>
 <virtual-scroller :items="items" item-height="40" content-tag="table">
  <template slot-scope="props">
   <tr :key="props.itemKey">
    <td>{{props.item.age}}</td>
    <td>{{props.item.name}}</td>
    <td>{{props.item.company}}</td>
   </tr>
  </template>
 </virtual-scroller>
</template>

<script>
import items from "./data.json";

export default {
 data: () => ({ items })
};
</script>

这里有个小问题,我们需要增加一个 <thead>标签,用于显示列名: Age, Name 和 Company

幸好 virtual-scroller 支持 slot,可以定制各部分内容:

<main>
 <slot name="before-container"></slot>
 <container>
  <slot name="before-content"></slot>
  <content>
   <!-- Your items here -->
  </content>
  <slot name="after-content"></slot>
 </container>
 <slot name="after-container"></slot>
</main>

这些 slot 都可以放置自定义内容。container 会被 container-tag 属性值替换,默认是div,content 被 content-tag 值替换。

这里用 before-content slot 加一个thead 就行了:

<template>
 <virtual-scroller
  :items="items"
  item-height="40"
  container-tag="table"
  content-tag="tbody"
  >
   <thead slot="before-content">
    <tr>
     <td>Age</td>
     <td>Name</td>
     <td>Company</td>
    </tr>
   </thead>
   <template slot-scope="props">
    <tr :key="props.itemKey">
     <td>{{props.item.age}}</td>
     <td>{{props.item.name}}</td>
     <td>{{props.item.company}}</td>
    </tr>
   </template>
 </virtual-scroller>
</template>

请注意,我们把content-tag="table" 改成了content-tag="tbody",因为我们设置了container-tag="table",这是为了构造table 标签的常规结构。

如果要加一个 tfoot,应该知道怎么做了吧。

感谢各位的阅读!关于“Vue.js如何优化无限滚动列表”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

--结束END--

本文标题: Vue.js如何优化无限滚动列表

本文链接: https://www.lsjlt.com/news/68310.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Vue.js如何优化无限滚动列表
    这篇文章给大家分享的是有关Vue.js如何优化无限滚动列表的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。问题大家都知道,Web 页面修改 DOM 是开销较大的操作,相比其他操作要...
    99+
    2022-10-19
  • Vue怎么优化无限滚动列表
    这篇文章主要介绍“Vue怎么优化无限滚动列表”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Vue怎么优化无限滚动列表”文章能帮助大家解决问题。问题大家都知道,Web 页面修改 DOM 是开销较大的操...
    99+
    2023-07-04
  • 解决Unity无限滚动复用列表的问题
    目录无限滚动复用列表前言设计思路关键基类1.ScrollData2.ScrollView3.ScrollItem测试类1.添加20组数据2.回到顶部3.回到底部坑点1.ScrollV...
    99+
    2022-11-13
  • 原生+React实现懒加载(无限滚动)列表方式
    目录应用场景效果预览思路剖析原生代码实现迁移到React总结应用场景 懒加载列表或叫做无限滚动列表,也是一种性能优化的方式,其可疑不必一次性请求所有数据,可以看做是分页的另一种实现形...
    99+
    2023-03-24
    React懒加载 React无限滚动 React列表
  • Vue.js中mint-ui如何实现无限滚动加载更多
    这篇文章主要介绍Vue.js中mint-ui如何实现无限滚动加载更多,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!代码如下:html://父组件 <div v-inf...
    99+
    2022-10-19
  • vue.js如何实现无缝滚动效果
    这篇文章将为大家详细讲解有关vue.js如何实现无缝滚动效果,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一个简单的基于vue.js的无缝滚动 :feet:在线...
    99+
    2022-10-19
  • vue如何实现列表固定列滚动
    这篇文章主要介绍了vue如何实现列表固定列滚动的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇vue如何实现列表固定列滚动文章都会有所收获,下面我们一起来看看吧。功能介绍:在移动端开发中,会用到列表作为信息展示方...
    99+
    2023-07-02
  • vue可视化大屏实现无线滚动列表飞入效果
    目录一、效果如下二、代码如下(因项目是vite与vue3.0、element-plus)一、效果如下 二、代码如下(因项目是vite与vue3.0、element-plus) &l...
    99+
    2022-11-13
  • 纯css3如何实现横向无限滚动
    小编给大家分享一下纯css3如何实现横向无限滚动,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!wxml装图片的盒子多复制一份,让循环图片的首尾相接<view...
    99+
    2023-06-08
  • js如何实现列表循环滚动
    本篇内容主要讲解“js如何实现列表循环滚动”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“js如何实现列表循环滚动”吧!先介绍几个属性clientHeight 元素的高度clientTop 元素顶...
    99+
    2023-07-02
  • vue可视化大屏怎么实现无线滚动列表飞入效果
    今天小编给大家分享一下vue可视化大屏怎么实现无线滚动列表飞入效果的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。一、效果如下...
    99+
    2023-06-30
  • CSS3如何实现无限循环的滚动效果
    这篇文章主要讲解了“CSS3如何实现无限循环的滚动效果”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“CSS3如何实现无限循环的滚动效果”吧!1. 使用CSS3来实现若要用CSS3的属性实现的...
    99+
    2023-07-04
  • JQuery如何实现文字列表向上滚动
    这篇文章给大家分享的是有关JQuery如何实现文字列表向上滚动的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。jQuery实现代码如下:<script type="...
    99+
    2022-10-19
  • 如何使用CSS3实现无限循环的无缝滚动效果
    这篇文章将为大家详细讲解有关如何使用CSS3实现无限循环的无缝滚动效果,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1. 使用CSS3来实现若要用CSS3的属性实现的话,...
    99+
    2022-10-19
  • js如何实现列表自动滚动循环播放
    这篇文章主要介绍了js如何实现列表自动滚动循环播放的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇js如何实现列表自动滚动循环播放文章都会有所收获,下面我们一起来看看吧。1.实现效果图鼠标移入,暂停滚动; 鼠标移...
    99+
    2023-07-02
  • 如何使用sroll-snap-type优化滚动
    本篇内容介绍了“如何使用sroll-snap-type优化滚动”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成...
    99+
    2022-10-19
  • 小程序如何实现列表滚动上下联动效果
    这篇文章主要为大家展示了“小程序如何实现列表滚动上下联动效果”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“小程序如何实现列表滚动上下联动效果”这篇文章吧。1、背景最近在做公司的一款小程序,其中有...
    99+
    2023-06-22
  • 如何使用CSS Snap优化滚动容器
    这篇文章主要介绍“如何使用CSS Snap优化滚动容器”,在日常操作中,相信很多人在如何使用CSS Snap优化滚动容器问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何使用...
    99+
    2022-10-19
  • vue如何通过滚动行为实现从列表到详情
    这篇文章主要介绍了vue如何通过滚动行为实现从列表到详情,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。vue项目滚动行为场景:项目中,从列表...
    99+
    2022-10-19
  • win7如何优化注册表自动关闭无响应程序
    本文小编为大家详细介绍“win7如何优化注册表自动关闭无响应程序”,内容详细,步骤清晰,细节处理妥当,希望这篇“win7如何优化注册表自动关闭无响应程序”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。优化方法:按w...
    99+
    2023-06-28
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作