vue.js实战学习——内置指令(二)

注:此内容摘抄自:梁灏的《Vue.js实战》

注:记得要引入vue.js才能运行哦,文章中贴出的代码直接复制是不行的,html css js 都放在了一起,而且也没有引用vue.js。

5.列表渲染指令 v-for

当需要将一个数组遍历或每句一个对象循环显示时,就会用到列表渲染指令v-for。它的表达式需要结合in来使用,类似item in items 的形式。

<div class="app7">
    <ul>
        <li v-for="book in books">{{book.name}}</li>
    </ul>
</div>

var app7=new Vue({
    el:'.app7',
    data:{
        books:[
            {name:'《Vue.js实战》'},
            {name:'《JavaScript语言精粹》'},
            {name:'《JavaScript高级程序设计》'}
        ]
    }
});

v-for的表达式支持一个可选参数作为房前项的索引。

<div class="app8">
    <ul>
        <li v-for="(book,index) of books">{{index}}-{{book.name}}</li>
    </ul>
</div>

与v-if 一样,v-for 也可以用在内置标签<template>上,将多个元素进行渲染:

<div class="app9">
    <ul>
        <template v-for="book in books">
            <li>书名:{{book.name}}</li>
            <li>作者:{{book.author}}</li>
        </template>
    </ul>
    <span v-for="(value,key,index) in user">{{index}}-{{key}}-{{value}}</span>
    <span v-for="n in 10">{{n}}</span>
</div>

var app9=new Vue({
    el:'.app9',
    data:{
        books:[
            {name:'《Vue.js实战》',author:'梁灏'},
            {name:'《JavaScript语言精粹》',author:'Douglas Crockford'},
            {name:'《JavaScript高级程序设计》',author:'Nicholas C.Zakas'}
        ],
        user:{
            name:'Nancy',
            gender:'女',
            age:24
        }
    }
});

除了数组外,对象的属性也是可以遍历的,如上的user;还可以迭代整数,如上的n。

遍历对象属性时,有两个可选参数,分别是键名和索引。

<li v-for="(value,key,index) in user">
{{index}} - {{key}}:{{value}}
</li>

 

6.数组更新

Vue 的核心是数据与视图的双向绑定,当我们修改数组时,Vue 会检测到数据变化,所以用v-for 渲染的视图也会立即更新。Vue 包含了一组观察数组变异的方法,使用他们改变数组也会触发视图更新:

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

我们将上面的实例的数据books添加一项:

//push只能加一个
app9.books.push({
    name:'CSS揭秘',
    author:'[希] Lea Verou'
});

使用以上方法会改变被这些方法调用的原始数组,有些方法不会改变原数组,如:

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

它们返回的是一个新数组,在使用这些非变异方法时,可以用新数组来替换原数组。

app9.books=app9.books.filter(function(item){
    return item.name.match(/JavaScript/);
});

 Vue在检测到数组变化是,并不是直接重新渲染整个列表,而是最大化的复用DOM元素。替换的数组中,含有相同元素的项不会被重新渲染,因此可以大胆的用新书需来替换六数组,不用担心性能问题。

需要注意的是,以下变动的数组中,Vue是不能检测到的,也不会触发视图更新:

  • 通过索引直接设置项,比如 app.books[3]={...}
  • 修改数组长度,比如app.books.length=1

解决第一个问题可以用两种方式实现同样的效果。第一种是使用Vue内置的set方法:

Vue.set(app.books,3,{
name:'《Vue.js实战》',author:'梁灏'
})

如果实在webpack中使用组件化的方式,默认是没有导入Vue的,可以使用$set:

this.$set(app.books,3,{
name:'《Vue.js实战》',author:'梁灏'
})
//这里的this指向的是当前组件实例,即app。在非webpack模式下也可以用$set方法,例如:app.$set(...)

另一种方法:

app.books.splice(3,1,{name:'《Vue.js实战》',author:'梁灏'})

第二个问题也可以直接用splice来解决:

app.books.splice(1);

 

posted @ 2017-12-27 09:42  塞夏的春天  阅读(219)  评论(0)    收藏  举报