說說 Vue.js 中的 v-for 列表渲染指令

1 基本用法

當遍歷一個數(shù)組或枚舉一個對象進行迭代循環(huán)展示時秀又,就會用到列表渲染指令 v-for季惩。 它的表達式需要結(jié)合 in 來使用邀摆,類似 item in items 的形式。

1.1 遍歷數(shù)組

html:

<div id="app">
    <ul>
        <li v-for="n in news">{{n.title}}</li>
    </ul>
</div>

js:

<script>
    var app = new Vue({
        el: '#app',
        data: {
            news: [
                {title: '被智能手機綁架的i世代 愛熬夜敬鬓、拒絕戀愛、不考駕照'},
                {title: '黑莓宣布14億美元收購網(wǎng)絡安全公司Cylance'},
                {title: '如何看待阿里巴巴開酒店這件事笙各?'}
            ]
        }
    });
</script>

效果:

在 v-for 指令的表達式中钉答, news 是 data 內(nèi)定義的數(shù)據(jù), n 是當前數(shù)組元素的別名杈抢。

列表渲染指令的表達式也支持使用 of 作為分隔符希痴。

html:

<li v-for="n of news">{{n.title}}</li>

v-for 表達式支持當前項索引參數(shù),索引從 0 開始春感,它是可選的 砌创。

html:

 <li v-for="(n,index) of news">{{index}} - {{n.title}}</li>

效果:


也可以使用內(nèi)置標簽 <template>,渲染多個元素鲫懒。

html:

<div id="app2">
    <dl>
        <template v-for="n in news">
            <dt>{{n.title}}</dt>
            <dd>{{n.content}}</dd>
        </template>
    </dl>
</div>

js:

var app2 = new Vue({
    el: '#app2',
    data: {
        news: [
            {title: '科技',content:'智能手機是我們生活的好幫手... ...'},
            {title: '互聯(lián)網(wǎng)',content:'黑莓公司周五宣布... ...'},
            {title: '社會',content:'阿里實體酒店“FlyZoo Hotel”將開業(yè)... ...'}
        ]
    }
});

效果:

1.2 遍歷對象屬性

我們也可以使用 v-for 列表渲染指令來遍歷對象屬性嫩实。

html:

<div id="app3">
    <li v-for="val in account">{{val}}</li>
</div>

js:

var app3 = new Vue({
    el: '#app3',
    data: {
        account: {
            name: 'deniro',
            messageCount: 100
        }
    }
});

效果:

遍歷對象屬性,可以帶上兩個可選參數(shù)窥岩,它們就是對象的屬性名和索引:

html:

<li v-for="(val,name,index) in account">{{index}} - {{name}} : {{val}}</li>

1.3 迭代整數(shù)

html:

<div id="app4">
    <ul>
        <li v-for="i in 5">{{i}}</li>
    </ul>
</div>

js:

var app4 = new Vue({
    el: '#app4'
});

效果:


2 更新數(shù)組

Vue.js 的核心是數(shù)據(jù)與視圖的雙向綁定甲献。因此當我們修改數(shù)組時, Vue.js 就會檢測到數(shù)據(jù)了變化颂翼,所以用 v-for 渲染的視圖也會更新 晃洒。使用以下方法修改數(shù)組時,就會觸發(fā)視圖更新:

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

這些方法會改變原數(shù)組朦乏,所以又稱為變異方法球及。

我們使用 push() 為 app 對象新增一個新聞標題:

js:

app.news.push({
    title:'沃爾瑪將超過蘋果成美國第三大在線零售商'
});

效果:


也有一些非變異方法,它們不會改變原數(shù)組呻疹,只會返回新數(shù)組:

  • filter()
  • concat()
  • slice()

我們在使用這些方法時吃引,可以通過設置新數(shù)組的方式來更新視圖。

js:

//非變異方法更新數(shù)組
    app.news = app.news.filter(function (item) {
        return item.title.match(/阿里巴巴/);
    });

效果:

這個示例中刽锤,我們使用 filter 函數(shù)镊尺,把新聞標題中含有“阿里巴巴”字樣的新聞過濾出來。

Vue.js 在檢測數(shù)組變化時并思,會最大化地復用 DOM 元素庐氮。 替換的數(shù)組,如果含有相同元素的項并不會被重新渲染宋彼,所以不用擔心性能問題弄砍。

注意:通過以下方法來改變數(shù)組颅筋, Vue.js 是無法檢測的,所以不會更新視圖:

  1. 通過索引來設置項输枯,比如 app.new[1]={...}
  2. 修改數(shù)組長度议泵,比如 app.new.length=1

我們可以使用 Vue.js 內(nèi)置的 set 方法(可指定索引)來更新數(shù)組:

//通過 set 的設置索引方式來更新數(shù)組
Vue.set(app.news,1,{
    title: '大數(shù)據(jù)之下的錦鯉:為什么你的微博總抽不到獎'
});

效果:


也可以使用 splice 指定索引來更新數(shù)組:

//通過 splice 的設置索引方式來更新數(shù)組
app.news.splice(1, 0, {
    title: '南京現(xiàn)“刷臉支付”超市 網(wǎng)友:素顏去結(jié)賬機器能識'
});

至于第二個問題桃熄,同樣可以通過 splice 來實現(xiàn):

//通過 splice 來刪除數(shù)組元素
app.news.splice(1);

以上示例 demo先口。

3 過濾或排序

其實,之前已經(jīng)有一個示例用到了 filter() 過濾方法瞳收。如果我們不想改變原數(shù)組碉京,只想返回過濾或排序后數(shù)組副本,這時可以使用計算屬性來實現(xiàn)螟深。

html:

<div id="app">
    <h3>過濾出帶“美元”的標題</h3>
    <ul>
        <li v-for="(n,index) in filterNews">{{index}} - {{n.title}}</li>
    </ul>
    <h3>按照標題長度谐宙,由短到長排序</h3>
    <ul>
        <li v-for="(n,index) in sortNews">{{index}} - {{n.title}}</li>
    </ul>
</div>

js:

<script>
    var app = new Vue({
        el: '#app',
        data: {
            news: [
                {title: '被智能手機綁架的i世代 愛熬夜、拒絕戀愛界弧、不考駕照'},
                {title: '黑莓宣布14億美元收購網(wǎng)絡安全公司Cylance'},
                {title: '如何看待XXX開酒店賺美元這件事凡蜻?'}
            ]
        },
        computed: {
            //過濾出帶“美元”的標題
            filterNews: function () {
                return this.news.filter(function (item) {
                    return item.title.match(/美元/);
                })
            },
            //按照標題長度,由短到長排序
            sortNews: function () {
                return this.news.sort(function (val1, val2) {
                    if(val1.title.length < val2.title.length){
                        return -1;
                    }
                })
            }
        }
    });
</script>

效果(demo):

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末垢箕,一起剝皮案震驚了整個濱河市划栓,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌条获,老刑警劉巖忠荞,帶你破解...
    沈念sama閱讀 217,826評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異帅掘,居然都是意外死亡委煤,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評論 3 395
  • 文/潘曉璐 我一進店門修档,熙熙樓的掌柜王于貴愁眉苦臉地迎上來碧绞,“玉大人,你說我怎么就攤上這事萍悴⊥吩猓” “怎么了?”我有些...
    開封第一講書人閱讀 164,234評論 0 354
  • 文/不壞的土叔 我叫張陵癣诱,是天一觀的道長。 經(jīng)常有香客問我袜香,道長撕予,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,562評論 1 293
  • 正文 為了忘掉前任蜈首,我火速辦了婚禮实抡,結(jié)果婚禮上欠母,老公的妹妹穿的比我還像新娘。我一直安慰自己吆寨,他們只是感情好赏淌,可當我...
    茶點故事閱讀 67,611評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著啄清,像睡著了一般六水。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上辣卒,一...
    開封第一講書人閱讀 51,482評論 1 302
  • 那天掷贾,我揣著相機與錄音,去河邊找鬼荣茫。 笑死想帅,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的啡莉。 我是一名探鬼主播港准,決...
    沈念sama閱讀 40,271評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼咧欣!你這毒婦竟也來了叉趣?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,166評論 0 276
  • 序言:老撾萬榮一對情侶失蹤该押,失蹤者是張志新(化名)和其女友劉穎疗杉,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蚕礼,經(jīng)...
    沈念sama閱讀 45,608評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡烟具,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,814評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了奠蹬。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片朝聋。...
    茶點故事閱讀 39,926評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖囤躁,靈堂內(nèi)的尸體忽然破棺而出冀痕,到底是詐尸還是另有隱情,我是刑警寧澤狸演,帶...
    沈念sama閱讀 35,644評論 5 346
  • 正文 年R本政府宣布言蛇,位于F島的核電站,受9級特大地震影響宵距,放射性物質(zhì)發(fā)生泄漏腊尚。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,249評論 3 329
  • 文/蒙蒙 一满哪、第九天 我趴在偏房一處隱蔽的房頂上張望婿斥。 院中可真熱鬧劝篷,春花似錦、人聲如沸民宿。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽活鹰。三九已至哈恰,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間华望,已是汗流浹背蕊蝗。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留赖舟,地道東北人蓬戚。 一個月前我還...
    沈念sama閱讀 48,063評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像宾抓,于是被迫代替她去往敵國和親子漩。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,871評論 2 354

推薦閱讀更多精彩內(nèi)容

  • Vue 實例 屬性和方法 每個 Vue 實例都會代理其 data 對象里所有的屬性:var data = { a:...
    云之外閱讀 2,209評論 0 6
  • 主要還是自己看的石洗,所有內(nèi)容來自官方文檔幢泼。 介紹 Vue.js 是什么 Vue (讀音 /vju?/,類似于 vie...
    Leonzai閱讀 3,350評論 0 25
  • 我拾起一片落葉 細數(shù)它的紋理 我看到了詩行 是大樹寫給大地的情書 寫滿沃土十年如一日的守護 寫滿春夏秋冬愛的語錄 ...
    王二痞子閱讀 1,147評論 17 41