国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

Vue.js學習教程之列表渲染詳解

2019-11-19 16:34:00
字體:
供稿:網(wǎng)友

本文主要給大家介紹了關(guān)于Vue.js列表渲染的相關(guān)資料,分享出來給大家參考學習,下面來看看詳細的介紹:

v-for

可以使用 v-for 指令基于一個數(shù)組渲染一個列表。這個指令使用特殊的語法,形式為item in items,items 是數(shù)據(jù)數(shù)組,item 是當前數(shù)組元素的別名:

示例:

<ul id="example-1"> <li v-for="item in items"> {{ item.message }} </li></ul>
var example1 = new Vue({ el: '#example-1', data: { items: [  { message: 'Foo' },  { message: 'Bar' } ] }})

在 v-for 塊內(nèi)我們能完全訪問父組件作用域內(nèi)的屬性,另有一個特殊變量 $index,正如你猜到的,它是當前數(shù)組元素的索引:

<ul id="example-2"> <li v-for="item in items"> {{ parentMessage }} - {{ $index }} - {{ item.message }} </li></ul>
var example2 = new Vue({ el: '#example-2', data: { parentMessage: 'Parent', items: [  { message: 'Foo' },  { message: 'Bar' } ] }})

另外,你可以為索引指定一個別名(如果 v-for 用于一個對象,則可以為對象的鍵指定一個別名):

<div v-for="(index, item) in items"> {{ index }} {{ item.message }}</div>

從 1.0.17 開始可以使用 of 分隔符,更接近 JavaScript 遍歷器語法:

<div v-for="item of items"></div>

template v-for

類似于 template v-if,也可以將 v-for 用在 <template> 標簽上,以渲染一個包含多個元素的塊。例如:

<ul> <template v-for="item in items"> <li>{{ item.msg }}</li> <li class="divider"></li> </template></ul>

數(shù)組變動檢測

變異方法

Vue.js 包裝了被觀察數(shù)組的變異方法,故它們能觸發(fā)視圖更新。

被包裝的方法有:

  • push()
  • pop()
  • shift()
  • unshift()
  • splice()
  • sort()
  • reverse()

你可以打開瀏覽器的控制臺,用這些方法修改上例的 items 數(shù)組。例如:example1.items.push({ message: 'Baz' })

替換數(shù)組

變異方法,如名字所示,修改了原始數(shù)組。相比之下,也有非變異方法,如 filter() , concat()slice() ,不會修改原始數(shù)組而是返回一個新數(shù)組。在使用非變異方法時,可以直接用新數(shù)組替換舊數(shù)組:

example1.items = example1.items.filter(function (item) { return item.message.match(/Foo/)})

可能你覺得這將導致 Vue.js 棄用已有 DOM 并重新渲染整個列表――幸運的是并非如此。 Vue.js 實現(xiàn)了一些啟發(fā)算法,以最大化復用 DOM 元素,因而用另一個數(shù)組替換數(shù)組是一個非常高效的操作。

track-by

有時需要用全新對象(例如通過 API 調(diào)用創(chuàng)建的對象)替換數(shù)組。因為 v-for 默認通過數(shù)據(jù)對象的特征來決定對已有作用域和 DOM 元素的復用程度,這可能導致重新渲染整個列表。但是,如果每個對象都有一個唯一 ID 的屬性,便可以使用 track-by 特性給 Vue.js 一個提示,Vue.js 因而能盡可能地復用已有實例。

例如,假定數(shù)據(jù)為:

{ items: [ { _uid: '88f869d', ... }, { _uid: '7496c10', ... } ]}

然后可以這樣給出提示:

<div v-for="item in items" track-by="_uid"> <!-- content --></div>

然后在替換數(shù)組 items 時,如果 Vue.js 遇到一個包含 _uid: '88f869d' 的新對象,它知道它可以復用這個已有對象的作用域與 DOM 元素。

track-by $index

如果沒有唯一的鍵供追蹤,可以使用 track-by="$index" ,它強制讓 v-for 進入原位更新模式:片斷不會被移動,而是簡單地以對應索引的新值刷新。這種模式也能處理數(shù)據(jù)數(shù)組中重復的值。

這讓數(shù)據(jù)替換非常高效,但是也會付出一定的代價。因為這時 DOM 節(jié)點不再映射數(shù)組元素順序的改變,不能同步臨時狀態(tài)(比如 <input> 元素的值)以及組件的私有狀態(tài)。因此,如果 v-for 塊包含 <input> 元素或子組件,要小心使用 track-by="$index"

問題

因為 JavaScript 的限制,Vue.js 不能檢測到下面數(shù)組變化:

      1.直接用索引設(shè)置元素,如 vm.items[0] = {};

      2.修改數(shù)據(jù)的長度,如 vm.items.length = 0

為了解決問題 (1),Vue.js 擴展了觀察數(shù)組,為它添加了一個 $set() 方法:

// 與 `example1.items[0] = ...` 相同,但是能觸發(fā)視圖更新example1.items.$set(0, { childMsg: 'Changed!'})

至于問題 (2),只需用一個空數(shù)組替換 items。

除了 $set() , Vue.js 也為觀察數(shù)組添加了 $remove() 方法,用于從目標數(shù)組中查找并刪除元素,在內(nèi)部它調(diào)用 splice() 。因此,不必這樣:

var index = this.items.indexOf(item)if (index !== -1) { this.items.splice(index, 1)}

只用這樣:

this.items.$remove(item)

對象 v-for

也可以使用 v-for 遍歷對象。除了 $index 之外,作用域內(nèi)還可以訪問另外一個特殊變量 $key。

<ul id="repeat-object" class="demo"> <li v-for="value in object"> {{ $key }} : {{ value }} </li></ul>
new Vue({ el: '#repeat-object', data: { object: {  FirstName: 'John',  LastName: 'Doe',  Age: 30 } }})

也可以給對象的鍵提供一個別名:

<div v-for="(key, val) in object"> {{ key }} {{ val }}</div>

在遍歷對象時,是按 Object.keys() 的結(jié)果遍歷,但是不能保證它的結(jié)果在不同的 JavaScript 引擎下是一致的。

值域 v-for

v-for 也可以接收一個整數(shù),此時它將重復模板數(shù)次。

<div> <span v-for="n in 10">{{ n }} </span></div>

顯示過濾/排序的結(jié)果

有時我們想顯示過濾/排序過的數(shù)組,同時不實際修改或重置原始數(shù)據(jù)。有兩個辦法:

     1.創(chuàng)建一個計算屬性,返回過濾/排序過的數(shù)組;

     2.使用內(nèi)置的過濾器 filterBy 和 orderBy。

計算屬性有更好的控制力,也更靈活,因為它是全功能 JavaScript。但是通常過濾器更方便,詳細見 API。

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對武林網(wǎng)的支持。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 木兰县| 怀宁县| 赣榆县| 贺州市| 家居| 遵义县| 察隅县| 桐庐县| 扬州市| 木里| 肥乡县| 交口县| 台东县| 周宁县| 昭觉县| 武穴市| 西昌市| 循化| 洛宁县| 莱芜市| 阜平县| 秭归县| 斗六市| 沾益县| 台湾省| 廉江市| 兴海县| 台南市| 台江县| 桑日县| 克拉玛依市| 博客| 乾安县| 宣化县| 长顺县| 连州市| 武穴市| 弥勒县| 澄城县| 日喀则市| 栾城县|