最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Vue.js 無(wú)限滾動(dòng)列表性能優(yōu)化方案

 更新時(shí)間:2019年12月02日 15:46:32   作者:KaysonLi  
這篇文章主要介紹了Vue.js 無(wú)限滾動(dòng)列表性能優(yōu)化方案,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

問(wèn)題

大家都知道,Web 頁(yè)面修改 DOM 是開(kāi)銷(xiāo)較大的操作,相比其他操作要慢很多。這是為什么呢?因?yàn)槊看?DOM 修改,瀏覽器往往需要重新計(jì)算元素布局,再重新渲染。也就是所謂的重排(reflow)和重繪(repaint)。尤其是在頁(yè)面包含大量元素和復(fù)雜布局的情況下,性能會(huì)受到影響。那對(duì)用戶有什么實(shí)際的影響呢?

一個(gè)常見(jiàn)的場(chǎng)景是大數(shù)據(jù)量的列表渲染。通常表現(xiàn)為可無(wú)限滾動(dòng)的無(wú)序列表或者表格,當(dāng)數(shù)據(jù)很多時(shí),頁(yè)面會(huì)出現(xiàn)明顯的滾動(dòng)卡頓,嚴(yán)重影響了用戶體驗(yàn)。怎么解決呢?

解決方案

既然問(wèn)題的根源是 DOM 元素太多,那就想辦法限制元素?cái)?shù)量。

  • 限制列表對(duì)用戶可見(jiàn)的元素?cái)?shù)量。我們把可見(jiàn)區(qū)域稱(chēng)為 ViewPort
  • 當(dāng)列表滾動(dòng)時(shí),列表種的其他元素怎么由不可見(jiàn)變?yōu)榭梢?jiàn)?
  • 監(jiān)聽(tīng)列表容器元素的滾動(dòng)事件,當(dāng)列表里的元素進(jìn)入可視區(qū)域,則添加到DOM中
  • 問(wèn)題是如果一直這么滾下去,列表會(huì)越來(lái)越大。所以需要在列表元素離開(kāi) ViewPort 的時(shí)候從DOM中移除
  • 問(wèn)題又來(lái)了,由于 ViewPort 剛好是一屏的大小,滾動(dòng)的時(shí)候元素還沒(méi)來(lái)得及渲染,會(huì)出現(xiàn)一段時(shí)間的空白。解決辦法就是上下增加一部分?jǐn)?shù)據(jù)渲染。

無(wú)限滾動(dòng)的性能優(yōu)化方案基本思路就是這樣。

在實(shí)際項(xiàng)目中,我們可能不需要自己從頭實(shí)現(xiàn)一個(gè)無(wú)限滾動(dòng)列表組件,Vue.js 就有一個(gè)現(xiàn)成的輪子:vue-virtual-scroller。

在項(xiàng)目中安裝這個(gè)插件:

$ npm install -D vue-virtual-scroller

項(xiàng)目入口文件 main.js 引入這個(gè)插件:

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

Vue.use(VueVirtualScroller);

案例一:VirtualList

我們來(lái)看一個(gè)簡(jiǎn)單的例子,用vue-virtual-scroller渲染一個(gè)包含大量數(shù)據(jù)的列表。 先用JSON-Generator 生成 5000 條數(shù)據(jù)的 JSON 對(duì)象,并保存到 data.json 文件??梢杂孟旅娴囊?guī)則:

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

新建一個(gè) VirtualList.vue 文件,引入data.json,并將它賦值給組件的items屬性。然后套一個(gè) <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 組件必須設(shè)置 item-height 。另外,由于我們要?jiǎng)?chuàng)建一個(gè)列表,可以設(shè)置content-tag="ul",表示內(nèi)容渲染成 <ul>標(biāo)簽。

vue-virtual-scroller 支持使用 scoped slots,增加了內(nèi)容渲染的靈活性。通過(guò)使用slot-scope="props",我們可以訪問(wèn) vue-virtual-scroller 暴露的數(shù)據(jù)。

props 有一個(gè)itemKey屬性,出于性能考慮,我們應(yīng)該在內(nèi)容部分的根元素上綁定 :key="props.itemKey"。然后我們就可以通過(guò) props.item 拿到 JSON 里的原始數(shù)據(jù)了。

如果你要給列表設(shè)置樣式,可以給 virtual-scroller 設(shè)置 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

類(lèi)似 VirtualList,我們?cè)倏匆粋€(gè)表格組件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>

這里有個(gè)小問(wèn)題,我們需要增加一個(gè) <thead>標(biāo)簽,用于顯示列名: Age, Name 和 Company

幸好 virtual-scroller 支持 slot,可以定制各部分內(nèi)容:

<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 都可以放置自定義內(nèi)容。container 會(huì)被 container-tag 屬性值替換,默認(rèn)是div,content 被 content-tag 值替換。

這里用 before-content slot 加一個(gè)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>

請(qǐng)注意,我們把content-tag="table" 改成了content-tag="tbody",因?yàn)槲覀冊(cè)O(shè)置了container-tag="table",這是為了構(gòu)造table 標(biāo)簽的常規(guī)結(jié)構(gòu)。

如果要加一個(gè) tfoot,應(yīng)該知道怎么做了吧。

總結(jié)

我們了解了無(wú)限滾動(dòng)列表的性能優(yōu)化原理,以及利用vue-virtual-scroller Vue 插件創(chuàng)建了 VirtualList 和  VirtualTable 組件。如果用它們來(lái)展示前面生成的 5000 條數(shù)據(jù),應(yīng)該可以比較流暢地渲染和滾動(dòng)了。更多用法可以參考 vue-virtual-scroller 文檔 。

文章涉及的源碼 戳這里。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • vue中v-model失效原因以及解決方案

    vue中v-model失效原因以及解決方案

    這篇文章主要給大家介紹了關(guān)于vue中v-model失效原因以及解決方案的相關(guān)資料,vue的v-model是一個(gè)雙向綁定的數(shù)據(jù)流,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-07-07
  • Vue3中引入scss文件的方法步驟

    Vue3中引入scss文件的方法步驟

    這篇文章主要給大家介紹了關(guān)于Vue3中引入scss文件的方法步驟,在實(shí)際項(xiàng)目中,各種樣式往往有很多重復(fù)的情況,為了能夠使樣式的后續(xù)開(kāi)發(fā)和維護(hù)更加愜意,將這些共同的代碼進(jìn)行命名然后調(diào)用這些變量是一個(gè)很好的選擇,需要的朋友可以參考下
    2023-08-08
  • 詳解element-ui動(dòng)態(tài)限定的日期范圍選擇器代碼片段

    詳解element-ui動(dòng)態(tài)限定的日期范圍選擇器代碼片段

    這篇文章主要介紹了element-ui動(dòng)態(tài)限定的日期范圍選擇器代碼片段,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • vue分割面板封裝實(shí)現(xiàn)記錄

    vue分割面板封裝實(shí)現(xiàn)記錄

    這篇文章主要為大家詳細(xì)介紹了vue分割面板封裝實(shí)現(xiàn)記錄,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • 關(guān)于vue表單提交防雙/多擊的例子

    關(guān)于vue表單提交防雙/多擊的例子

    今天小編就為大家分享一篇關(guān)于vue表單提交防雙/多擊的例子,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-10-10
  • vue中如何使用embed標(biāo)簽PDF預(yù)覽

    vue中如何使用embed標(biāo)簽PDF預(yù)覽

    這篇文章主要介紹了vue中如何使用embed標(biāo)簽PDF預(yù)覽,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-05-05
  • 如何使用Vuex+Vue.js構(gòu)建單頁(yè)應(yīng)用

    如何使用Vuex+Vue.js構(gòu)建單頁(yè)應(yīng)用

    這篇文章主要教大家如何使用Vuex+Vue.js構(gòu)建單頁(yè)應(yīng)用,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-10-10
  • Vue包大小優(yōu)化的實(shí)現(xiàn)(從1.72M到94K)

    Vue包大小優(yōu)化的實(shí)現(xiàn)(從1.72M到94K)

    這篇文章主要介紹了Vue包大小優(yōu)化的實(shí)現(xiàn)(從1.72M到94K),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02
  • Vite代理如何解決跨域問(wèn)題詳解

    Vite代理如何解決跨域問(wèn)題詳解

    跨域是指瀏覽器不能執(zhí)行其他網(wǎng)站的腳本,它是由瀏覽器的同源策略造成的,是瀏覽器對(duì)JavaScript實(shí)施的安全限制,下面這篇文章主要給大家介紹了關(guān)于Vite代理如何解決跨域問(wèn)題的相關(guān)資料,需要的朋友可以參考下
    2023-03-03
  • vue項(xiàng)目使用.env文件配置全局環(huán)境變量的方法

    vue項(xiàng)目使用.env文件配置全局環(huán)境變量的方法

    這篇文章主要介紹了vue項(xiàng)目使用.env文件配置全局環(huán)境變量的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-10-10

最新評(píng)論

宜昌市| 尖扎县| 湟源县| 平安县| 伊吾县| 茌平县| 怀柔区| 西峡县| 白玉县| 温泉县| 天长市| 新蔡县| 稻城县| 新兴县| 夏邑县| 玉田县| 北票市| 穆棱市| 张家口市| 廉江市| 额敏县| 且末县| 杂多县| 平阳县| 松原市| 南宫市| 福贡县| 衡南县| 海盐县| 南康市| 年辖:市辖区| 安图县| 元氏县| 富蕴县| 玛沁县| 寻甸| 射洪县| 临泽县| 上虞市| 四子王旗| 体育|