日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

Vue 虛擬列表的實戰(zhàn)示例

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

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

本篇討論基于 Vue.js 的列表無限下拉實踐。

我們的目標就是:讓列表下拉縱享絲滑,而不是像以往的下拉就 loading 等待的體驗。

譯自 Better Programming 在線 Demo設計

咱還是用 Vue CLI 來快速構(gòu)建項目。

這是主頁面:

// 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 虛擬列表的實戰(zhàn)示例

大量的 DOM 元素會使得我們的網(wǎng)頁非常“重”。當 DOM 元素超過 1500 至 2000 個的時候,頁面就開始又延遲,尤其是在小型的、性能差的設備上尤為明顯。

想象一下,有一個無線滾動的頁面,你不斷的下拉,它實際上可能形成了上萬個 DOM 元素,每個元素還包含子節(jié)點,這樣將消耗巨大的性能。

Virtual scrollers 正是來解決這個問題的。

如上圖,已經(jīng)表示的很清楚了。列表分為可見區(qū)域和緩沖區(qū)域,超出這個范圍的列表 DOM 都將被刪除。

好啦,準備工作已就緒,Let`s get it!

實現(xiàn)

// 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,以便后續(xù)使用。

其中,itemComponent 是 virtual-list 的屬性,為此我們需要新建一個 SearchResult 子組件,作為搜索結(jié)果單元。

代碼如下:

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

我們可以通過搜索標題或描述來得到結(jié)果,請求數(shù)據(jù)來源于維基百科。

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; });}

搜索的方法已經(jīng)寫好,接著就是調(diào)用。

當用戶鍵入內(nèi)容的搜索時候會調(diào)用。 當下拉的時候會調(diào)用。

// 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 變化的時候,我們會得到新的搜索結(jié)果。當然,這里的輸入框也用到了防抖函數(shù)。

另一個需要注意的是,我們第一次搜索加載了兩頁的結(jié)果,用戶就會有一定的滾動空間,這樣就可以保持順暢的感覺。

我們在滾動的事件中也加了防抖函數(shù)。這里設一個疑問:為什么要在 window.onscroll 事件下設置 leading 為 true ?

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

Vue 虛擬列表的實戰(zhàn)示例

npm run dev

Vue 虛擬列表的實戰(zhàn)示例

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

小結(jié)

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

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

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

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

以上就是Vue 虛擬列表的實現(xiàn)示例的詳細內(nèi)容,更多關(guān)于Vue 虛擬列表的資料請關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標簽: Vue
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
日韩在线观看一区二区| 久草免费在线视频| 欧美日韩少妇| 午夜日韩福利| 亚洲高清毛片| 99久久激情| 欧美一区二区三区高清视频| 成人日韩在线观看| 欧美jjzz| 性欧美精品高清| 水蜜桃久久夜色精品一区的特点| 亚洲一区二区动漫| 日本不卡中文字幕| 欧美国产日韩电影| 免费看一区二区三区| 久久精品伊人| 久久久人人人| 99成人在线| 综合激情网站| 欧美精品影院| 欧美交a欧美精品喷水| 国产成人免费| 九九综合九九| 日本va欧美va精品发布| 欧美激情福利| 久久久久久黄| 日韩中文欧美在线| 国产毛片一区二区三区| 欧美日韩在线观看首页| 激情久久中文字幕| 日韩黄色在线观看| 成人精品动漫一区二区三区| 女人天堂亚洲aⅴ在线观看| 日韩国产精品久久久| 精品一区二区三区视频在线播放| 日韩.com| 免费精品视频| 美女av一区| 一区在线视频观看| 国产日韩欧美一区二区三区 | 999国产精品视频| 久久午夜影视| 麻豆国产精品视频| 国产99久久久国产精品成人免费| 免费观看在线综合色| 日韩精品三级| 中文字幕人成乱码在线观看| 人人精品人人爱| 精品视频一区二区三区四区五区| 欧美成人精品| 国产精品丝袜在线播放| 在线日韩中文| 久久精品99国产精品| 丝袜美腿诱惑一区二区三区| 日韩欧美三区| 久久精选视频| 国产一卡不卡| 红桃视频亚洲| 国产一区二区视频在线看| 亚洲一区二区三区免费在线观看| 欧美日韩中文| 亚洲成av人片一区二区密柚| 日韩高清不卡一区二区| 久久精品国产亚洲夜色av网站| 清纯唯美亚洲综合一区| 国产一区日韩一区| 国产精品探花在线观看| 好看不卡的中文字幕| 久久99精品久久久野外观看| 影音国产精品| 日韩成人免费| 奇米777国产一区国产二区| 久久久夜夜夜| 久久中文字幕一区二区三区| 中文视频一区| 超碰超碰人人人人精品| 日本高清久久| 亚洲一区二区免费看| 日韩精品不卡一区二区| 国产精品亚洲二区| 卡一精品卡二卡三网站乱码| 亚洲人亚洲人色久| 五月天综合网站| 国产精品hd| 精品91久久久久| 国产精品日本| 亚洲h色精品| 国产精品久久久久久久久久白浆 | 久久国产生活片100| 亚洲成人日韩| 日韩欧美精品一区| 国产精品777777在线播放 | 免费黄色成人| 日本免费久久| 欧美aa在线视频| 日本不卡中文字幕| 亚洲黄色在线| 裤袜国产欧美精品一区| 国产日韩高清一区二区三区在线| 国产一区白浆| av亚洲免费| 久久国产亚洲| 欧美三级精品| 成人福利av| 日韩国产欧美| 日韩欧美一区二区三区免费看| 精品视频在线一区二区在线| 国产精品一区二区三区www| 日日夜夜免费精品视频| 亚洲精品伊人| 亚久久调教视频| 亚洲精选91| 久久久蜜桃一区二区人| 国产成人精品亚洲日本在线观看| 深夜日韩欧美| 尤物tv在线精品| 日韩成人午夜精品| 国产精品久久久久9999高清| 国产视频一区在线观看一区免费| 蜜桃av.网站在线观看| 成人在线视频免费看| 久久精品资源| 91嫩草亚洲精品| 91偷拍一区二区三区精品| 国产一区二区三区四区二区| 欧美精品99| 欧美亚洲tv| 国产乱论精品| 亚洲综合在线电影| 久久一区精品| 精品久久97| 精品成av人一区二区三区| 国产一区二区三区久久| 亚洲成人va| 成人午夜网址| 日韩av片子| 久久狠狠婷婷| 欧美日韩日本国产亚洲在线 | 日韩精品91亚洲二区在线观看| 噜噜噜久久亚洲精品国产品小说| 蜜桃视频第一区免费观看| 日韩一级欧洲| 亚洲香蕉视频| 国产欧美日韩| 精品中国亚洲| 久久免费黄色| 视频一区二区三区入口| 日本午夜精品一区二区三区电影| 欧美久久精品| 国产成人久久| 999久久久免费精品国产| 狠狠色综合网| 美女日韩在线中文字幕| 中文字幕日韩欧美精品高清在线| 日韩高清一区在线 | 亚洲久久视频| 国产精品xvideos88| 成人日韩精品| 亚洲综合图色| 国产一区调教| 狠狠色狠狠色综合日日tαg| 亚洲精品日韩久久| 久久99久久久精品欧美| 99精品在线| 亚洲精品乱码久久久久久蜜桃麻豆| 日韩精品视频在线看| 国产精品白浆| 欧美日韩中文一区二区| 中文字幕日韩高清在线| 精品视频在线一区二区在线| 欧美不卡视频| 清纯唯美亚洲综合一区| 国产美女高潮在线观看| 日韩精品一区第一页| 欧美91在线| 亚洲美洲欧洲综合国产一区| 国产丝袜一区| 亚洲网站视频| 欧美精品福利| 久久影视一区| 国产日韩1区| 亚洲不卡系列| 91精品国产经典在线观看| 人人精品亚洲| 日韩av网站在线观看| 久久黄色影院| 国产精品v亚洲精品v日韩精品| 欧美精品一区二区三区精品| 国产欧美一区二区精品久久久 | 欧美.日韩.国产.一区.二区| 日韩精品欧美成人高清一区二区| 久久精品国产亚洲一区二区三区| 亚洲免费观看| 欧美激情麻豆| 中文精品电影| 久久免费黄色| 麻豆久久一区| 亚洲欧洲日韩精品在线| 91精品一区二区三区综合在线爱| 国产情侣一区|