电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

Vue 虛擬列表的實戰示例

瀏覽:28日期:2022-10-02 10:33:05
序言

現如今,我們總是在無止境的刷。刷微博、刷抖音、刷沸點......一次次絲滑下拉體驗的背后卻是前端攻城獅的用心。

本篇討論基于 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 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 庫。

Vue 虛擬列表的實戰示例

大量的 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; });}

搜索的方法已經寫好,接著就是調用。

當用戶鍵入內容的搜索時候會調用。 當下拉的時候會調用。

// 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 ?

然后我們運行程序看效果:

Vue 虛擬列表的實戰示例

npm run dev

Vue 虛擬列表的實戰示例

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

小結

用戶不會希望每下拉十條結果就要等待新的十條結果加載出來!所以我們需要有緩沖區,還未下拉到底的時候就預判它到底然后提前加載。這便是絲滑體驗的內核。

當然不在視圖區和緩沖區的 DOM 都將被刪除,這也是頁面不形成大量 DOM 元素的精髓。

這樣動態的處理列表的確是編程人員的一種智慧和用心。

你可以把 項目 克隆到本地再體會一下。以上便是本次分享~

以上就是Vue 虛擬列表的實現示例的詳細內容,更多關于Vue 虛擬列表的資料請關注好吧啦網其它相關文章!

標簽: Vue
相關文章:
主站蜘蛛池模板: 众能联合-提供高空车_升降机_吊车_挖机等一站工程设备租赁 | 视频直播 -摄影摄像-视频拍摄-直播分发 | 胶辊硫化罐_胶鞋硫化罐_硫化罐厂家-山东鑫泰鑫智能装备有限公司 意大利Frascold/富士豪压缩机_富士豪半封闭压缩机_富士豪活塞压缩机_富士豪螺杆压缩机 | 托利多电子平台秤-高精度接线盒-托利多高精度电子秤|百科 | 银川美容培训-美睫美甲培训-彩妆纹绣培训-新娘化妆-学化妆-宁夏倍莱妮职业技能培训学校有限公司 临时厕所租赁_玻璃钢厕所租赁_蹲式|坐式厕所出租-北京慧海通 | 佛山市钱丰金属不锈钢蜂窝板定制厂家|不锈钢装饰线条|不锈钢屏风| 电梯装饰板|不锈钢蜂窝板不锈钢工艺板材厂家佛山市钱丰金属制品有限公司 | 大流量卧式砂磨机_强力分散机_双行星双动力混合机_同心双轴搅拌机-莱州市龙跃化工机械有限公司 | 房车价格_依维柯/大通/东风御风/福特全顺/江铃图片_云梯搬家车厂家-程力专用汽车股份有限公司 | 江西自考网-江西自学考试网| 东莞市超赞电子科技有限公司 全系列直插/贴片铝电解电容,电解电容,电容器 | HEYL硬度计量泵-荧光法在线溶解氧仪-净时测控技术(上海)有限公司 | 上海软件开发-上海软件公司-软件外包-企业软件定制开发公司-咏熠科技 | 武汉天安盾电子设备有限公司 - 安盾安检,武汉安检门,武汉安检机,武汉金属探测器,武汉测温安检门,武汉X光行李安检机,武汉防爆罐,武汉车底安全检查,武汉液体探测仪,武汉安检防爆设备 | 步进_伺服_行星减速机,微型直流电机,大功率直流电机-淄博冠意传动机械 | 防爆电机_防爆电机型号_河南省南洋防爆电机有限公司 | 塑料异型材_PVC异型材_封边条生产厂家_PC灯罩_防撞扶手_医院扶手价格_东莞市怡美塑胶制品有限公司 | 数控专用机床,专用机床,自动线,组合机床,动力头,自动化加工生产线,江苏海鑫机床有限公司 | 吹田功率计-长创耐压测试仪-深圳市新朗普电子科技有限公司 | 上海单片机培训|重庆曙海培训分支机构—CortexM3+uC/OS培训班,北京linux培训,Windows驱动开发培训|上海IC版图设计,西安linux培训,北京汽车电子EMC培训,ARM培训,MTK培训,Android培训 | 宽带办理,电信宽带,移动宽带,联通宽带,电信宽带办理,移动宽带办理,联通宽带办理 | 耐酸泵,耐腐蚀真空泵,耐酸真空泵-淄博华舜耐腐蚀真空泵有限公司 精密模具-双色注塑模具加工-深圳铭洋宇通 | 固诺家居-全屋定制十大品牌_整体衣柜木门橱柜招商加盟 | PVC地板|PVC塑胶地板|PVC地板厂家|地板胶|防静电地板-无锡腾方装饰材料有限公司-咨询热线:4008-798-128 | 灌木树苗-绿化苗木-常绿乔木-价格/批发/基地 - 四川成都途美园林 | 欧美日韩国产一区二区三区不_久久久久国产精品无码不卡_亚洲欧洲美洲无码精品AV_精品一区美女视频_日韩黄色性爱一级视频_日本五十路人妻斩_国产99视频免费精品是看4_亚洲中文字幕无码一二三四区_国产小萍萍挤奶喷奶水_亚洲另类精品无码在线一区 | 高考志愿规划师_高考规划师_高考培训师_高报师_升学规划师_高考志愿规划师培训认证机构「向阳生涯」 | 黑龙江京科脑康医院-哈尔滨精神病医院哪家好_哈尔滨精神科医院排名_黑龙江精神心理病专科医院 | 澳门精准正版免费大全,2025新澳门全年免费,新澳天天开奖免费资料大全最新,新澳2025今晚开奖资料,新澳马今天最快最新图库-首页-东莞市傲马网络科技有限公司 | pH污水传感器电极,溶解氧电极传感器-上海科蓝仪表科技有限公司 | 登车桥动力单元-非标液压泵站-非标液压系统-深圳市三好科技有限公司 | 筛分机|振动筛分机|气流筛分机|筛分机厂家-新乡市大汉振动机械有限公司 | 恒温恒湿试验箱厂家-高低温试验箱维修价格_东莞环仪仪器_东莞环仪仪器 | 真空搅拌机-行星搅拌机-双行星动力混合机-广州市番禺区源创化工设备厂 | 广州展台特装搭建商|特装展位设计搭建|展会特装搭建|特装展台制作设计|展览特装公司 | 煤矿支护网片_矿用勾花菱形网_缝管式_管缝式锚杆-邯郸市永年区志涛工矿配件有限公司 | 混合生育酚_醋酸生育酚粉_琥珀酸生育酚-山东新元素生物科技 | 517瓜水果特产网|一个专注特产好物的网站 | 水稻烘干机,小麦烘干机,大豆烘干机,玉米烘干机,粮食烘干机_巩义市锦华粮食烘干机械制造有限公司 水环真空泵厂家,2bv真空泵,2be真空泵-淄博真空设备厂 | 水环真空泵厂家,2bv真空泵,2be真空泵-淄博真空设备厂 | 体检车_移动CT车_CT检查车_CT车_深圳市艾克瑞电气有限公司移动CT体检车厂家-深圳市艾克瑞电气有限公司 | 中矗模型-深圳中矗模型设计有限公司 |