vue-lazy-render: 延遲渲染大組件演怎,增強頁面切換流暢度

最近用element來做項目大诸,在開發(fā)的過程中捅厂,突然發(fā)現(xiàn)頁面的操作和切換在數(shù)據(jù)量大的時候相當卡,后來提了個issue,在furybean解答后才知道底挫,我每個單元格都加了tooltip恒傻,會生成大量的節(jié)點脸侥,造成頁面操作卡頓建邓。后來將tooltip去掉,操作流暢多了睁枕。

但是官边,由于我是將頁面的數(shù)據(jù)存在vuex中的,在路由切換回來的時候外遇,發(fā)現(xiàn)在數(shù)據(jù)量大的時候注簿,頁面渲染得很慢,大概兩三秒才能切換過來跳仿,用戶體驗相當不好诡渴。

這時,我就在想菲语,能不能讓頁面切換完成之后才開始渲染數(shù)據(jù)量大的組件妄辩,用戶起碼不會感知到路由切換的卡頓情況。

一開始不知道怎樣做山上,后來看到這篇blog:vue 性能優(yōu)化,作者基于vue1.0做了一個指令眼耀,基本原理是利用v-if來控制組件的渲染時機。作者在回答中提到vue2.0可以用組件來做佩憾,具體的討論可以看這里

基于此哮伟,我做了個組件vue-lazy-render干花,歡迎star。

基本功能

  • 延遲加載組件
  • 控制延遲加載的時間
  • 可以監(jiān)控數(shù)組的變化和設定數(shù)據(jù)量來決定是否開啟延遲加載

基本用法

默認

<lazy-render>
    <my-component></my-component>
</lazy-render>

trackByData

<lazy-render :data="myArray" :time="300" :limit="50" track-by-data>
    <my-component :data="myArray"></my-component>
</lazy-render>

源碼解釋

template

<div class="lazy-load">
    <slot v-if="show"></slot>
    <div v-if="!show" :class="[maskClass ? maskClass : 'lazy-load-mask']">{{tip}}</div>
</div>

props

property description type default required
time 多長時間后開始渲染組件 Number 10 false
immediately 是否立即開啟延遲渲染,vue-lazy-render組件會在路由切換時,會進行一次延遲渲染,如果在同一個路由中需經常對某個組件進行延遲渲染,可以將immediately由false設為true,就會馬上開啟一次延遲渲染 Boolean -- false
data 如果需要延遲加載的組件是由數(shù)組渲染的,可以將數(shù)據(jù)的數(shù)據(jù)prop進vue-lazy-render組件,組件會根據(jù)配置監(jiān)測數(shù)組變化,決定開啟延遲加載的時機 array -- false
trackByData 是否根據(jù)data的變化來開啟延遲加載,如果設為true,需將data prop進來,并且路由切換時不會再進行延遲渲染 Boolean -- false
limit 在數(shù)據(jù)超過多少后才開啟延遲渲染,需要data和將trackByData設為true Number 30 false
maskClass 等待渲染時的遮罩層樣式 String -- false
tip 等待渲染時的提示文字 String 正在渲染,請稍候 false

methods

/**
 * 延遲渲染數(shù)據(jù),在數(shù)據(jù)渲染完成后觸發(fā)loaded事件
 */
showLazy() {
    if ((this.data && this.data.length > this.limit) || !this.data) {  // 如果數(shù)據(jù)存在并且數(shù)據(jù)的數(shù)量比限定的數(shù)量大,則開啟延遲渲染 如果不是列表調用組件,也開啟延遲渲染
        this.syncLoader()
    } else {  // 其他情況,不開啟延遲渲染
        this.show = true
        this.$emit('loaded')
    }
},
/**
 * 延遲渲染
 */
syncLoader() {
    this.show = false
    setTimeout(() => {
        this.show = true
        this.$emit('loaded')
    },this.time)
}

定義的方法很簡單楞黄,在data定義的show初始值為false池凄,在需要延遲加載時,會用一個setTimeout來將show設為true鬼廓,當show變?yōu)閠rue時修赞,組件才可以渲染,從而達到延遲渲染的目的桑阶。組件開始渲染時柏副,會觸發(fā)loaded事件。

調用

created() {
    this.showLazy()
},
watch: {
    data() { // 數(shù)據(jù)變化時重新渲染
        if (this.trackByData) {
            this.showLazy()
        }
    },
    // 路由變化,重新渲染
    $route() {
        if (!this.trackByData) {
            this.showLazy()
        }
    },
    // 立即重新變?yōu)閠rue時,重新渲染
    immediately() {
        if (this.immediately) {
            this.showLazy()
        }
    },
},
  • 在頁面進入時蚣录,開啟
  • 如果不是track-by-data模式割择,則每次路由切換時,開啟
  • 如果是track-by-data模式萎河,則數(shù)組變化時荔泳,開啟。由于我的頁面中虐杯,有些表格是在彈層中展示的玛歌,同一個組件,可能每次打開彈層時擎椰,數(shù)據(jù)都不一樣支子,一開始打算用這種方法來實現(xiàn)延遲的,后來加了immediately达舒,感覺這個track-by-data模式完全沒有意義了值朋,用了反應會造成不必要的重新渲染。
  • 當immediately由false變?yōu)閠rue時巩搏,開啟

最后昨登,所有文章都會同步發(fā)送到微信公眾號上,歡迎關注,歡迎提意見:

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末贯底,一起剝皮案震驚了整個濱河市丰辣,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌禽捆,老刑警劉巖笙什,帶你破解...
    沈念sama閱讀 221,273評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異睦擂,居然都是意外死亡得湘,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,349評論 3 398
  • 文/潘曉璐 我一進店門顿仇,熙熙樓的掌柜王于貴愁眉苦臉地迎上來淘正,“玉大人摆马,你說我怎么就攤上這事『柽海” “怎么了囤采?”我有些...
    開封第一講書人閱讀 167,709評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長惩淳。 經常有香客問我蕉毯,道長,這世上最難降的妖魔是什么思犁? 我笑而不...
    開封第一講書人閱讀 59,520評論 1 296
  • 正文 為了忘掉前任代虾,我火速辦了婚禮,結果婚禮上激蹲,老公的妹妹穿的比我還像新娘棉磨。我一直安慰自己,他們只是感情好学辱,可當我...
    茶點故事閱讀 68,515評論 6 397
  • 文/花漫 我一把揭開白布乘瓤。 她就那樣靜靜地躺著,像睡著了一般策泣。 火紅的嫁衣襯著肌膚如雪衙傀。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,158評論 1 308
  • 那天萨咕,我揣著相機與錄音统抬,去河邊找鬼。 笑死任洞,一個胖子當著我的面吹牛蓄喇,可吹牛的內容都是我干的发侵。 我是一名探鬼主播交掏,決...
    沈念sama閱讀 40,755評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼刃鳄!你這毒婦竟也來了盅弛?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,660評論 0 276
  • 序言:老撾萬榮一對情侶失蹤叔锐,失蹤者是張志新(化名)和其女友劉穎挪鹏,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體愉烙,經...
    沈念sama閱讀 46,203評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡讨盒,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,287評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了步责。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片返顺。...
    茶點故事閱讀 40,427評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡禀苦,死狀恐怖,靈堂內的尸體忽然破棺而出遂鹊,到底是詐尸還是另有隱情振乏,我是刑警寧澤,帶...
    沈念sama閱讀 36,122評論 5 349
  • 正文 年R本政府宣布秉扑,位于F島的核電站慧邮,受9級特大地震影響,放射性物質發(fā)生泄漏舟陆。R本人自食惡果不足惜误澳,卻給世界環(huán)境...
    茶點故事閱讀 41,801評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望秦躯。 院中可真熱鬧脓匿,春花似錦、人聲如沸宦赠。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,272評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽勾扭。三九已至毡琉,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間妙色,已是汗流浹背桅滋。 一陣腳步聲響...
    開封第一講書人閱讀 33,393評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留身辨,地道東北人丐谋。 一個月前我還...
    沈念sama閱讀 48,808評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像煌珊,于是被迫代替她去往敵國和親号俐。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,440評論 2 359

推薦閱讀更多精彩內容

  • 發(fā)現(xiàn) 關注 消息 iOS 第三方庫定庵、插件吏饿、知名博客總結 作者大灰狼的小綿羊哥哥關注 2017.06.26 09:4...
    肇東周閱讀 12,117評論 4 61
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,264評論 25 707
  • 概念 索引被創(chuàng)建于已有的表中,它可使對行的定位更快速更有效蔬浙≈砺洌可以在表格的一個或多個列上創(chuàng)建索引,每個索引都會被起個...
    NoFacePeace閱讀 195評論 0 0