編寫 Vue v-for 循環更優雅的 7 種(zhǒng)方式

在Vue中,基本上每個項目都(dōu)會用到v-for循環。它們允許你在模闆代碼中編寫for循環。 這(zhè)在碰到諸如以下情況時特别好(hǎo)用: 渲染數組或列表 遍曆對(duì)象屬性 在Vue中v-for循環最基本的用法是這(zhè)樣(yàng)的: 但是,在本文中,我們將(jiāng)介紹一些超棒的方法,可以使你的v-for代碼更加精确、可預測和高效。 讓我們開(kāi)始吧。
1.始終在v-for循環中使用key
首先,我們讨論的是大多數Vue開(kāi)發(fā)人員已經(jīng)知道(dào)的常見最佳實踐——在v-for循環中使用:key。通過(guò)設置唯一的鍵屬性,可以确保組件按期望的方式工作。 如果我們不使用:key,Vue將(jiāng)使DOM盡可能(néng)高效。這(zhè)可能(néng)會導緻v-for元素出現亂序或其他不可預測的行爲。 如果我們對(duì)每個元素都(dōu)有唯一的鍵引用,那麼(me)就可以更好(hǎo)地預測如何操縱DOM。 2. 在一定範圍内使用v-for循環
雖然大多數時候v-for用于循環數組或對(duì)象,但也有我們隻想叠代特定次數的情況。 例如,假設我們正在爲在線商店創建分頁系統,并且我們隻想每頁顯示10個産品。使用變量來跟蹤當前頁碼,就可以像這(zhè)樣(yàng)處理分頁。 3. 避免在循環中使用v-if
一個超常見的錯誤是使用v-if來過(guò)濾v-for循環的數據。 雖然看上去直觀了,但這(zhè)會導緻一個巨大的性能(néng)問題——VueJS將(jiāng)優先v-for于v-if指令。 這(zhè)意味著(zhe)組件將(jiāng)遍曆每個元素,然後(hòu)再檢查v-if條件以查看是否應該呈現。 如果你將(jiāng)v-if與v-for一起(qǐ)使用,無論條件是什麼(me),都(dōu)將(jiāng)遍曆數組的每一項。 那麼(me)問題是什麼(me)?
假設products數組有數千個項,但想要渲染的隻有3個在售産品。
每次重新渲染時,即使出售的3種(zhǒng)産品根本沒(méi)有改變,Vue也必須遍曆這(zhè)數千個項。
必須盡量避免結合使用v-if與v-for的情況。
接下來介紹兩(liǎng)個替代方法。
4. 使用computed屬性或方法
爲了避免上述問題,我們應該在模闆中進(jìn)行叠代之前過(guò)濾數據。有兩(liǎng)種(zhǒng)非常相似的方法可以做到:
使用computed屬性
使用過(guò)濾方法
随你選擇,下面(miàn)讓我們快速介紹這(zhè)兩(liǎng)個方法。
首先,我們隻需要設置一個computed屬性。爲了獲得與之前的v-if相同的功能(néng),代碼看起(qǐ)來像這(zhè)樣(yàng)。
這(zhè)樣(yàng)的好(hǎo)處是:
數據屬性隻會在依賴項發(fā)生變化時重新評估
模闆隻遍曆在售的産品,而不是每一個産品
使用過(guò)濾方法的代碼幾乎相同,但使用方法會改變訪問模闆内值的方式。但是,如果我們希望能(néng)夠將(jiāng)變量傳遞給過(guò)濾過(guò)程,那麼(me)就應該選擇方法這(zhè)條路。
5. 或者在循環外包一層元素
在決定是否完全渲染列表時,你可能(néng)還(hái)是想要將(jiāng)v-for與v-if結合起(qǐ)來。
例如,如果我們隻想在用戶登錄時呈現産品列表怎麼(me)辦。
錯誤代碼:
這(zhè)有什麼(me)問題?
和之前一樣(yàng)。Vue模闆會優先考慮v-for——所以會遍曆每個元素并檢查v-if。
即使最後(hòu)什麼(me)都(dōu)不渲染,也會循環數千個元素。
對(duì)于此示例,有一個簡單的解決方案是移動v-if語句。
更好(hǎo)的代碼!
這(zhè)要好(hǎo)得多,因爲如果isLoggedIn爲false——那就根本不需要叠代。 6. 訪問循環中的索引
除了遍曆數組并訪問每個元素之外,我們還(hái)可以跟蹤每個項目的索引。
爲此,我們需要在項目之後(hòu)添加一個索引值。這(zhè)樣(yàng)做超級簡單,但對(duì)于分頁、顯示列表索引、顯示排名等都(dōu)很有用。
7. 叠代對(duì)象
到目前爲止,我們隻研究了使用v-for來遍曆數組。但是我們也可以很輕松地學(xué)會叠代對(duì)象的鍵值對(duì)。
與訪問元素的索引類似,我們需要向(xiàng)循環中添加另一個值。如果我們使用單個參數循環對(duì)象,我們將(jiāng)循環所有項。
如果我們添加另一個參數,則將(jiāng)獲得項和鍵。如果我們添加第三個參數,則還(hái)可以訪問v-for循環的索引。
假設我們想遍曆産品中的每個屬性。那麼(me)代碼如下: