携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第4天,点击查看活动详情 >>
v-for的基本使用
在data 中定义的可迭代对象都可以进行列表渲染,使用形如item in movies ,现在也可以使用item of movies 效果相同,item 就是当前取到的条目,如果想要使用index 即表示当前是第几个条目的时候,就直接使用(item,index) in movies ,index从0开始
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
.item{
margin-top: 5px;
background-color: orange;
}
</style>
</head>
<body>
<div id="app">
<h2>电影列表</h2>
<ul>
<li v-for="(item,index) in movies">{{index}}-{{item}}</li>
</ul>
<h2>商品列表</h2>
<div v-for="(item,index) in products" class="item">
<h3>{{item.name}}</h3>
<span>{{item.price}}</span>
<p>{{item.desc}}</p>
</div>
</div>
<script src="../lib/vue.mini.js"></script>
<script>
const app=Vue.createApp({
data(){
return{
movies:['星际穿越','少年派','大话西游'],
products:[
{
id:110,
name:'MacBook',
price:9,
desc:'9.9秒杀'
},
{
id:110,
name:'MacBook',
price:9,
desc:'9.9秒杀'
},
{
id:110,
name:'MacBook',
price:9,
desc:'9.9秒杀'
}
]
}
}
})
app.mount('#app')
</script>
</body>
</html>
v-for的其他类型
当遍历对象的时候,我们还可以获取对象中的key ,如下所示,使用形如(item,key,index) in info 来获取条目、key和位置
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
.item{
margin-top: 5px;
background-color: orange;
}
</style>
</head>
<body>
<div id="app">
<ul>
<li v-for="(item,key,index) in info">{{item}}-{{key}}-{{index}}</li>
</ul>
</div>
<script src="../lib/vue.mini.js"></script>
<script>
const app=Vue.createApp({
data(){
return{
info:{
name:'why',
age:10,
height:18.8
}
}
}
})
app.mount('#app')
</script>
</body>
</html>
数组更新检测
- Vue将被侦听的数组的变更方法进行了包裹,所以它们页将会触发视图更新
- 这些被包裹过的方法包括:
- push
- pop
- shift
- unshift
- splice
- sort
- reverse
即对原数组造成了改变的方法,被调用会触发数组更新
key相关
当列表渲染没有绑定key的时候
我们可以看到,a和b进行了复用,但是c和d没有进行复用,它们并没有改变,不需要改动,因为列表到f的时候就和老的对不上了,后面就只有进行新增。
当列表渲染绑定key的时候
-
第一步从头开始进行遍历、比较:
- a和b是一致的会继续进行比较
- c和f因为key不一致,所以就会break跳出循环
-
第二步的操作是从尾部开始遍历、比较:
- 第三步是如果旧的节点遍历完毕,但是依然有新的节点,那么就新增节点:
- 第四步是如果新的节点遍历完毕,但是依然有旧的节点,那么就移除久节点:
- 第五步是最特殊的情况,中间还有很多未知的或者乱序的节点:
总结
- 在没有key的时候页面更新效率是十分低效的
- 在进行插入活着重置顺序的时候,保持相同的key可以让diff算法更加的高效