iis服务器助手广告广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >Vue 虚拟列表的实战示例
  • 215
分享到

Vue 虚拟列表的实战示例

2024-04-02 19:04:59 215人浏览 薄情痞子
摘要

目录序言 设计 实现 小结 序言 现如今,我们总是在无止境的刷。刷微博、刷抖音、刷沸点......一次次丝滑下拉体验的背后却是前端攻城狮的用心。 本篇讨论基于 vue.js 的列表

序言

现如今,我们总是在无止境的刷。刷微博、刷抖音、刷沸点......一次次丝滑下拉体验的背后却是前端攻城狮的用心。

本篇讨论基于 vue.js 的列表无限下拉实践。

我们的目标就是:让列表下拉纵享丝滑,而不是像以往的下拉就 loading 等待的体验。

  • 译自 Better Programming
  • 在线 Demo

设计

咱还是用 Vue CLI 来快速构建项目

这是主页面:

// EndlessList.vue


<template>
 <div class="endless-scrolling-list">
  <!-- 搜索框 -->
  <div class="search-box">
   <input type="text" v-model="searchQuery"/>
  </div>
  <p class="center" v-if="results.length == 0 && !loading">
   Start typing to search something.
  </p>
  <!-- 虚拟列表 -->
  <virtual-list
   :data-key="'pageid'"
   :data-sources="results"
   :data-component="itemComponent"
   :page-mode="true"
   />
  <!-- loading -->
  <loader v-if="loading" />
 </div>
</template>

其中核心当然是virtual-list组件啦~

这里的虚拟列表,我们用到一个三方库 Vue Virtual Scroll List,它在 GitHub 上又 2.5k+ 的 stars。类比于 React 的 react-virtualized 库。

大量的 DOM 元素会使得我们的网页非常“重”。当 DOM 元素超过 1500 至 2000 个的时候,页面就开始又延迟,尤其是在小型的、性能差的设备上尤为明显。

想象一下,有一个无线滚动的页面,你不断的下拉,它实际上可能形成了上万个 DOM 元素,每个元素还包含子节点,这样将消耗巨大的性能。

Virtual scrollers 正是来解决这个问题的。

如上图,已经表示的很清楚了。列表分为可见区域和缓冲区域,超出这个范围的列表 DOM 都将被删除。

好啦,准备工作已就绪,Let`s get it!

实现

// imports.js(EndlessList.vue)


import axiOS from 'axios';
import lodash from 'lodash';
import VirtualList from 'vue-virtual-scroll-list';
import SearchResult from './SearchResult';
import Loader from './Loader';
export default {
 name: 'EndlessList',
 components: {
  VirtualList,
  Loader
 },
 data() {
  return {
   searchQuery: '',
   currentPage: 0,
   results: [],
   itemComponent: SearchResult,
   loading: false
  }
 },
};

我们引入第三方库 axios 和 loadsh,以便后续使用。

其中,itemComponent 是 virtual-list 的属性,为此我们需要新建一个 SearchResult 子组件,作为搜索结果单元。

代码如下:

// SearchResult.vue


<template>
 <div class="list-item">
  <h3>
   {{ source.title }}
  </h3>
  <div v-html="source.snippet"></div>
 </div>
</template>

<script>
export default {
 props: {
  index: {
   // index of current item
   type: Number,
  },
  source: {
   type: Object,
   default() {
    return {};
   },
  },
 },
};
</script>

<style scoped>
.list-item {
 padding: 0 10px 20px 10px;
}
.list-item h3 {
 margin: 0;
 padding-bottom: 10px;
}
</style>

我们可以通过搜索标题或描述来得到结果,请求数据来源于维基百科。


search(query, page) {
 // We prepare the data that the Wikipedia api expects.
 const data = {
  action: "query",
  fORMat: "JSON",
  list: "search",
  continue: "-||",
  utf8: 1,
  srsearch: query,
  sroffset: page * 10,
  origin: "*",
 };
 // And then we convert these params TO GET params in the format
 // action=query&format=json ...
 const params = Object.keys(data)
  .map(function(k) {
   return data[k] == ""
    ? ""
    : encodeURIComponent(k) + "=" + encodeURIComponent(data[k]);
  })
  .join("&");
 // We prepare the url with the params string
 const searchUrl = `https://en.wikipedia.org/w/api.PHP?${params}`;
 // we set loading to true so that we can display the loader 
 this.loading = true;
 // Then we execute the request and concatenate the results
 axios.get(searchUrl).then((response) => {
  this.results = this.results.concat(response.data.query.search);
  // And of course set loading to false to hide the loader.
  this.loading = false;
 });
}

搜索的方法已经写好,接着就是调用。

  1. 当用户键入内容的搜索时候会调用。
  2. 当下拉的时候会调用。

// EndlessList.vue


<script>
export default {
 // data() and methods skipped for brevity
 watch: {
  searchQuery: {
   immediate: true,
   handler: lodash.debounce(function (newVal) {
    if (newVal == "") {
     return;
    }
    this.results = [];
    this.currentPage = 0;
    this.search(newVal, this.currentPage);
    this.search(newVal, this.currentPage + 1);
    this.currentPage = 2;
   }, 200),
  },
 },
 mounted() {
  const vm = this;
  window.onscroll = lodash.debounce(function () {
   var distanceFromBottom =
    document.body.scrollHeight - window.innerHeight - window.scrollY;
   if (distanceFromBottom < 400 && vm.searchQuery !== "") {
    vm.search(vm.searchQuery, vm.currentPage);
    vm.currentPage++;
   }
  }, 100, {leading: true});
 },
}
</script>

显而易见,当 searchQuery 变化的时候,我们会得到新的搜索结果。当然,这里的输入框也用到了防抖函数。

另一个需要注意的是,我们第一次搜索加载了两页的结果,用户就会有一定的滚动空间,这样就可以保持顺畅的感觉。

我们在滚动的事件中也加了防抖函数。这里设一个疑问:为什么要在 window.onscroll 事件下设置 leading 为 true ?

然后我们运行程序看效果:


npm run dev

如何?只要你不是疯狂下拉,基本上感受不到 loading 的过程~

小结

用户不会希望每下拉十条结果就要等待新的十条结果加载出来!所以我们需要有缓冲区,还未下拉到底的时候就预判它到底然后提前加载。这便是丝滑体验的内核。

当然不在视图区和缓冲区的 DOM 都将被删除,这也是页面不形成大量 DOM 元素的精髓。

这样动态的处理列表的确是编程人员的一种智慧和用心。

你可以把 项目 克隆到本地再体会一下。以上便是本次分享~

以上就是Vue 虚拟列表的实现示例的详细内容,更多关于Vue 虚拟列表的资料请关注编程网其它相关文章!

--结束END--

本文标题: Vue 虚拟列表的实战示例

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

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

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

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

下载Word文档
猜你喜欢
  • Vue 虚拟列表的实战示例
    目录序言 设计 实现 小结 序言 现如今,我们总是在无止境的刷。刷微博、刷抖音、刷沸点......一次次丝滑下拉体验的背后却是前端攻城狮的用心。 本篇讨论基于 Vue.js 的列表...
    99+
    2024-04-02
  • vue虚拟列表如何实现
    本篇内容介绍了“vue虚拟列表如何实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!多数据渲染现在解决多数据渲染,相信大家可能会想到分页,触...
    99+
    2023-07-02
  • 微信小程序虚拟列表的实现示例
    目录前言分析初始渲染方法初步优化进一步优化方法二前言 大部分小程序都会有这样的需求,页面有长列表,需要下拉到底时请求后台数据,一直渲染数据,当数据列表长时,会发现明显的卡顿,页面白...
    99+
    2024-04-02
  • vue虚拟化列表封装的实现
    目录vue虚拟化列表封装将下面代码复制一份到自己的项目中 vue虚拟列表-vue-virtual-scroll-list使用场景安装使用vue虚拟化列表封装 将下面代码复制...
    99+
    2024-04-02
  • React虚拟列表的实现
    目录1.背景 2.什么是虚拟列表 3.相关概念简介 4.虚拟列表实现 4.1 驱动开发:参数剖析4.2 组件初始化计算和布局 4.3 滚动触发注册事件与更新 4.4 item高度不等...
    99+
    2024-04-02
  • vue实现列表展示示例详解
    目录Vue 的CSS之deep语法::v-deepclassPrefix 前缀给元素绑定class总结Object.freeze关于Vue和ts的配合问题ISO8601和dayjs库...
    99+
    2024-04-02
  • vue长列表优化之虚拟列表实现过程详解
    目录前言实现原理实现代码总结 前言 应用场景:后台一次性发送上千条或更多数据给前台 场景模拟:用户发起一个请求,后台发送了10w条数据 使用虚拟列表之前:前台需要生成10w...
    99+
    2024-04-02
  • vue实现虚拟列表组件解决长列表性能问题
    目录一、虚拟列表二、实现思路难点与思考:其他注意事项:三、实现最终实现效果实现代码模拟数据的后端代码四、封装为组件props:event:虚拟列表组件代码使用代码最近项目中需要用到列...
    99+
    2024-04-02
  • 微信小程序虚拟列表的应用实例
    目录前言什么是虚拟列表?demo效果准备工作屏高&盒子高度优化总结前言 股票热门榜单有4000多条,渲染到页面上在盘中时还得实时更新,如果采用接口和分页,当下拉几十页的时候页...
    99+
    2024-04-02
  • vue中虚拟DOM的示例分析
    这篇文章主要介绍了vue中虚拟DOM的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。虚拟 DOM 优点:保证性能下限:&n...
    99+
    2024-04-02
  • vxe-list vue怎么实现下拉框的虚拟列表
    本篇内容主要讲解“vxe-list vue怎么实现下拉框的虚拟列表”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“vxe-list vue怎么实现下拉框的虚拟列表”吧!vxe-...
    99+
    2023-06-30
  • vxe-list vue 如何实现下拉框的虚拟列表
    目录vxe-list vue下拉框的虚拟列表虚拟列表的实现原理接下来测试一下vue虚拟列表实现原理应用场景实现思路基础实现vxe-list vue下拉框的虚拟列表 vxe-table...
    99+
    2024-04-02
  • React虚拟列表的实现方法
    这篇文章给大家分享的是有关React虚拟列表的实现方法的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。1.背景在开发过程中,总是遇到很多列表的显示。当上数量级别的列表渲染于浏览器,终会导致浏览器的性能下降。如果数据...
    99+
    2023-06-15
  • vue轻松实现虚拟滚动的示例代码
    目录前言 滚动原理 实现 源代码 参考前言 移动端网页的日常开发中,偶尔会包含一些渲染长列表的场景.比如某旅游网站需要完全展示出全国的城市列表,再有将所有通讯录的姓名按照A,B,C...
    99+
    2024-04-02
  • 基于Vue实现封装一个虚拟列表组件
    目录组件效果属性插槽封装过程滚动条正常显示加载渲染大量数据不卡顿能对列表数据进行操作增删等完整代码待完善正常情况下,我们对于数据都会分页加载,最近项目中确实遇到了不能分页的场景,如果...
    99+
    2023-03-07
    Vue封装虚拟列表组件 Vue 虚拟列表组件 Vue 虚拟列表
  • 结合康熙选秀讲解vue虚拟列表实现
    目录场景康熙选妃多数据渲染虚拟列表的概念实现基本实现场景 康熙选妃 话说这年是康熙五十三年,天下太平,天下无人不感叹这“康熙盛世”啊,康熙自己也是开心的不得了...
    99+
    2024-04-02
  • vue实现列表拖拽排序的示例代码
     本文主要介绍了vue实现列表拖拽排序的示例代码,具体如下: <template> <div class="test_wrapper" @drago...
    99+
    2024-04-02
  • vue项目实战的示例分析
    这篇文章主要为大家展示了“vue项目实战的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“vue项目实战的示例分析”这篇文章...
    99+
    2024-04-02
  • C++ 虚拟函数实战应用:代码示例与解疑
    虚拟函数允许在派生类中覆盖基类函数,在运行时根据对象类型调用适当函数:创建虚拟函数:基类中使用 virtual 关键字声明函数。覆盖虚拟函数:派生类中使用 override 关键字覆盖基...
    99+
    2024-04-29
    c++ 虚函数实战
  • Vue ELement Table技巧表格业务需求实战示例
    目录前言常见业务需求:合并行思路分析需求合并列思路分析前言 在我们日常开发中,表格业务基本是必不可少的,对于老手来说确实简单,家常便饭罢了,但是对于新手小白如何最快上手搞定需求呢?本...
    99+
    2022-11-16
    Vue ELement Table表格业务 Vue ELement Table
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作