Vue.js的学习(4)

列表渲染

我们用v-for 来进行列表的渲染操作 语法主要是 item in items语法,{{内容为item.message}},在数据中我们用一个items的数组来包含一个{}的数据。

<div id="app">
    <ul>
        <li v-for="item in items">{{item.message}}</li>
    </ul>
</div>
//JS语法
var app=new Vue({
    el:"#app",
    data:{
        items:[
            {message:1},
            {message:2}
        ]
    }
})

在 v-for 块中,我们拥有对父作用域属性的完全访问权限。v-for 还支持一个可选的第二个参数为当前项的索引。

<div id="app2">
        <ul>
            <li v-for="(item,index) in items">{{item.message}}:{{index}}:{{parent}}</li>
        </ul>
</div>
//JS代码
var app=new Vue({
      el:"#app2",
      data:{
            parent:"ParentMessage",
            items:[
                {message:1},
                {message:2}
            ]
        }
})

结果为:1:0:ParentMessage2:1:ParentMessage

对象的v-for

  <ul id="app3">
        <li v-for="value in object">{{value}}</li>
  </ul>
//JS代码
  var app3=new Vue({
        el:"#app3",
        data:{
            object:{
                name:"jack",
                age:29,
                job:"engineer"
            }
        }
    });
 //这种方法同样可以得到一个列表,还有就是我们可以使用(value,key,index) in object来输出key和index

Key

当使用key时,必须设置兄弟元素唯一的key,当key排列顺序变化时,兄弟元素会重新排列,而当key的值变化时,这个元素会被重新渲染。就像之前的那个input表单toggle—Email和User的例子

 <div id="app1">
        <template v-if="type==='Email'">
            <label>Email</label>
            <input type="text" placeholder="Enter your Email" key="Email-input">
        </template>
        <template v-if="type==='User'">
            <label>User</label>
            <input type="text" placeholder="Enter your User" key="User-input">
        </template>
        <button @click="{{change()}}">toggle</button>
    </div>
    //在这个例子中,我们如果不使用key,虽然input会被复用,但是文本框中的内容并不会被刷新,而只是简单的替换placehoder属性

为了给 Vue 一个提示,以便它能跟踪每个节点的身份,从而重用和重新排序现有元素,你需要为每项提供一个唯一 key 属性。理想的 key 值是每项都有的且唯一的 id。这个特殊的属性相当于 Vue 1.x 的 track-by ,但它的工作方式类似于一个属性,所以你需要用 v-bind 来绑定动态值,

<div id="app" :key="item.id">

</div>

数组方法

当我们在Vue中使用数组方法时,我们要注意了,由于Javascript的限制,Vue无法监测到下列代码对于数组的变化

  1. 当我们利用索引设置项时app.items[message]="hello"
    解决办法:Vue.set(app.items,itemIndex,newValue)或者app.items.splice(ItemIndex,1,newValue)
  2. 当我们设置数组长度的时候vm.items.length=newLength
    解决办法:app.items.splice(newLength)

不光是在数组中 在对象中,我们不能检测到对象的属性的添加或删除

app.message=2;
//通过这种方法添加的属性并不是响应式的,只有写在data中的属性才是响应式的

对于已经创建的实例,Vue 不能动态添加根级别的响应式属性,但是我们能通过Vue.set的方式添加响应式属性

Vue.set(object,key,value)
上面的等同于
object.$set(this.property,key,value)

过滤
有时,我们想要显示一个数组的过滤或排序副本,而不实际改变或重置原始数据。在这种情况下,可以创建返回过滤或排序数组的计算属性。

<div id="app">
    <li v-for="number in evenNum">{{number}}</li>
</div>
var app=new Vue({
    el:"#app",
    data:{
        numbers:[1,2,3,4,5,6,7,8]
    },
    computed:{
        evenNum:function(){
            return numbers.filter(function(a){
                    return a%2===0;
                })  
            }
        }
    }
})

v-for中的v-if
当它们处于同一节点,v-for 的优先级比 v-if 更高,这意味着 v-if 将分别重复运行于每个 v-for 循环中。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值