你不可不知的Vue.js列表渲染詳解
介紹
用 v-for 把一個數(shù)組對應(yīng)為頁面上的一組元素
vue.js 使用的是 v-for 指令來處理組件元素的循環(huán)迭代邏輯。通常它會和 v-if 配合使用,達(dá)到我們所需要的處理邏輯。
v-for 的語法形式是 item in items,其中 items 就是我們要循環(huán)的數(shù)組,而 item 則是被迭代的數(shù)組元素的別名。
<ul id="example-1"> <li v-for="item in items"> {{ item.message }} </li> </ul>
我們都知道既然有循環(huán)那肯定少不了對索引的處理。v-for 指令給我們提供了可選的第二個參數(shù),即當(dāng)前項的索引。
<ul id="example-2"> <li v-for="(item, index) in items"> {{ parentMessage }} - {{ index }} - {{ item.message }} </li> </ul>
index 就是那個當(dāng)前索引了。
你也可以使用 of 替代 in 作為分隔符。
<div v-for="item of items"></div>
在 v-for 里使用對象
是噠,很明顯 v-for 也可以用來遍歷一個對象的屬性。
<ul id="v-for-object" class="demo"> <li v-for="value in object"> {{ value }} </li> </ul>
也可以提供第二個參數(shù)為 property 名稱 (也就是鍵名)
<div v-for="(value, name) in object"> {{ name }}: {{ value }} </div>
還可以用第三個參數(shù)作為索引
<div v-for="(value, name, index) in object"> {{ index }}. {{ name }}: {{ value }} </div>
維護狀態(tài)
敲黑板啦哈~
vuejs 為了維護循環(huán)列表的狀態(tài)需要提供唯一的 key 屬性。
這個唯一的 key 可以為我們提供列表元素狀態(tài)的更新,避免重復(fù)渲染等優(yōu)化頁面的性能。
這個 key 很關(guān)鍵,并不推薦使用簡單的索引作為 key 的值,因為會有造成重復(fù)渲染混亂的可能。
數(shù)組更新檢測
咳咳~ 繼續(xù)敲黑板
我們在寫程序的時候,往往會有數(shù)據(jù)更新但是頁面元素沒有跟著對應(yīng)變化的情況。
數(shù)組列表的更新檢測 vue 為我們提供了一套解決方案,但是需要注意它們在使用的方式上是不同的。
變異方法
意思就是以下的數(shù)組處理方法可以觸發(fā)視圖上的更新。
push() pop() shift() unshift() splice() sort() reverse()
需要注意的是它們處理的都是原始數(shù)組。也就是在原來的數(shù)組上增加刪除或者排序操作。
非變異方法
數(shù)組也有一些方法不會改變原始數(shù)據(jù),而是返回新的數(shù)組。
filter() concat() slice()
返回新的數(shù)組在頁面更新渲染的性能大家不必?fù)?dān)心,vue 已經(jīng)為我們做好了重用工作。
需要注意,在有些情況 vue 無法檢測數(shù)組變動的情況如下:
- 當(dāng)你利用索引直接設(shè)置一個數(shù)組項時,例如:vm.items[indexOfItem] = newValue
- 當(dāng)你修改數(shù)組的長度時,例如:vm.items.length = newLength
var vm = new Vue({ data: { items: ['a', 'b', 'c'] } }) vm.items[1] = 'x' // 不是響應(yīng)性的 vm.items.length = 2 // 不是響應(yīng)性的
為了解決這類問題,官方提供了兩種解決方案。
1、Vue.set
// Vue.set Vue.set(vm.items, indexOfItem, newValue)
2、Array.prototype.splice
// Array.prototype.splice vm.items.splice(indexOfItem, 1, newValue)
如果我們在處理數(shù)據(jù)無法更新視圖的時候記得試試這個方法。
對象變更檢測注意事項
對于對象屬性的增加和刪除,對于已經(jīng)創(chuàng)建的實例,Vue 不允許動態(tài)添加根級別的響應(yīng)式屬性。
對于這個問題可以使用 Vue.set(object, propertyName, value) 方法向嵌套對象添加響應(yīng)式屬性。
v-for 還可以處理整數(shù)的循環(huán)
<div> <span v-for="n in 10">{{ n }} </span> </div>
最后提醒使用 v-for 時一定要記得帶上 key 喲!
神秘的 set
綜上我們會知道 js 無法處理組件即時更新的都由 vue 提供的這個 set 方法接管。那么這個 set 有什么過人之處,可以完成組件與數(shù)據(jù)的綁定呢?
關(guān)鍵位置可以看 vue 源碼的這里 github.com/vuejs/vue/b…
set 方法開始會有一些邏輯判斷,對于數(shù)組的處理依然使用的是 splice 方法。
if (Array.isArray(target) && isValidArrayIndex(key)) { target.length = Math.max(target.length, key) target.splice(key, 1, val) return val }
其余的就交給我們 vue 不支持的 IE8 ECMAScript5 特性 Object.defineProperty
Object.defineProperty(obj, key, { value: val, enumerable: !!enumerable, writable: true, configurable: true })
下次我會對 Object.defineProperty 在做詳細(xì)介紹,今天就到這了,晚安😴。
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,謝謝大家對腳本之家的支持。
相關(guān)文章
前端Vue通過Minio返回的URL下載文件實現(xiàn)方法
Minio是一個靈活、高性能、開源的對象存儲解決方案,適用于各種存儲需求,并可以與云計算、容器化、大數(shù)據(jù)和應(yīng)用程序集成,這篇文章主要給大家介紹了關(guān)于前端Vue通過Minio返回的URL下載文件實現(xiàn)的相關(guān)資料,需要的朋友可以參考下2024-07-07淺析Vue下的components模板使用及應(yīng)用
這篇文章主要介紹了Vue下的components模板的使用及應(yīng)用,本文通過代碼介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下2019-11-11Vue.js使用$.ajax和vue-resource實現(xiàn)OAuth的注冊、登錄、注銷和API調(diào)用
這篇文章主要介紹了 Vue.js使用$.ajax和vue-resource實現(xiàn)OAuth的注冊、登錄、注銷和API調(diào)用,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-05-05Vue Element前端應(yīng)用開發(fā)之獲取后端數(shù)據(jù)
這篇文章主要介紹了Vue Element前端應(yīng)用開發(fā)之獲取后端數(shù)據(jù),對vue感興趣的同學(xué),可以參考下2021-05-05解決Vue2.0 watch對象屬性變化監(jiān)聽不到的問題
今天小編就為大家分享一篇解決Vue2.0 watch對象屬性變化監(jiān)聽不到的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-09-09vue3 響應(yīng)式對象如何實現(xiàn)方法的不同點
這篇文章主要介紹了vue3 響應(yīng)式對象如何實現(xiàn)方法的不同點,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-05-05