本文我们来介绍下v-if,v-show和v-for指令,也就是最基础的流程控制和循环处理。
v-if和v-show
v-if和v-show的作用有点类似,我们一起来看下,案例代码如下:
<html lang="en"> | |
<head> | |
<meta charset="UTF-"> | |
<meta name="viewport" content="width=device-width, initial-scale=.0"> | |
<meta http-equiv="X-UA-Compatible" content="ie=edge"> | |
<title>Document</title> | |
<script src="./lib/vue-.4.0.js"></script> | |
</head> | |
<body> | |
<div id="app"> | |
<h v-if='flag'>v-if的使用</h2> | |
<h v-show='flag'>v-show的使用</h2> | |
</div> | |
<script> | |
var vm = new Vue({ | |
el:"#app", | |
data:{ | |
flag:true | |
}, | |
methods:{ | |
} | |
}) | |
</script> | |
</body> | |
</html> |
效果如下:
在这里插入图片描述
通过演示效果我们能看到v-if和v-show都能控制标签元素的现实和隐藏,但相互之间又有区别
指令 | 说明 |
v-if | 每次都会重新删除或创建元素, 有较高的切换性能消耗 如果元素涉及到频繁的切换,最好不要使用 v-if, 而是推荐使用 v-show |
v-show | 每次不会重新进行DOM的删除和创建操作,只是切换了元素的 display:none 样式 有较高的初始渲染消耗 如果元素可能永远也不会被显示出来被用户看到,则推荐使用 v-if |
v-for的使用
1.普通数组
针对数据为数组的类型,循环的使用。
简单插值的使用
<html lang="en"> | |
<head> | |
<meta charset="UTF-"> | |
<meta name="viewport" content="width=device-width, initial-scale=.0"> | |
<meta http-equiv="X-UA-Compatible" content="ie=edge"> | |
<title>Document</title> | |
<script src="./lib/vue-.4.0.js"></script> | |
</head> | |
<body> | |
<div id="app"> | |
<p>{{list[]}}</p> | |
<p>{{list[]}}</p> | |
<p>{{list[]}}</p> | |
<p>{{list[]}}</p> | |
<p>{{list[]}}</p> | |
</div> | |
<script> | |
// 创建 Vue 实例,得到 ViewModel | |
var vm = new Vue({ | |
el: '#app', | |
data: { | |
list: [, 2, 3, 4, 5, 6] | |
}, | |
methods: {} | |
}); | |
</script> | |
</body> | |
</html> |
在这里插入图片描述
循环使用
简单的使用循环
在这里插入图片描述
在这里插入图片描述
获取循环下标
在这里插入图片描述
在这里插入图片描述
2.对象数组
集合中的元素是对象
<html lang="en"> | |
<head> | |
<meta charset="UTF-"> | |
<meta name="viewport" content="width=device-width, initial-scale=.0"> | |
<meta http-equiv="X-UA-Compatible" content="ie=edge"> | |
<title>Document</title> | |
<script src="./lib/vue-.4.0.js"></script> | |
</head> | |
<body> | |
<div id="app"> | |
<p v-for="(user, i) in list">Id:{{ user.id }} --- 名字:{{ user.name }} --- 索引:{{i}}</p> | |
</div> | |
<script> | |
// 创建 Vue 实例,得到 ViewModel | |
var vm = new Vue({ | |
el: '#app', | |
data: { | |
list: [ | |
{ id:, name: '张三' }, | |
{ id:, name: '李四' }, | |
{ id:, name: '王五' }, | |
{ id:, name: '小明' } | |
] | |
}, | |
methods: {} | |
}); | |
</script> | |
</body> | |
</html> |
在这里插入图片描述
数组中的元素是自定义的对象的时候直接通过”.”存取器来获取元素。
3.循环对象
注意:在遍历对象身上的键值对的时候, 除了有val,key ,在第三个位置还有 一个 索引 。
<html lang="en"> | |
<head> | |
<meta charset="UTF-"> | |
<meta name="viewport" content="width=device-width, initial-scale=.0"> | |
<meta http-equiv="X-UA-Compatible" content="ie=edge"> | |
<title>Document</title> | |
<script src="./lib/vue-.4.0.js"></script> | |
</head> | |
<body> | |
<div id="app"> | |
<!-- 注意:在遍历对象身上的键值对的时候, 除了 有 val key ,在第三个位置还有 一个 索引 --> | |
<p v-for="(val, key, i) in user">值是: {{ val }} --- 键是: {{key}} -- 索引: {{i}}</p> | |
</div> | |
<script> | |
// 创建 Vue 实例,得到 ViewModel | |
var vm = new Vue({ | |
el: '#app', | |
data: { | |
user: { | |
id:, | |
name: '波波烤鸭', | |
gender: '男' | |
} | |
}, | |
methods: {} | |
}); | |
</script> | |
</body> | |
</html> |
在这里插入图片描述
4.迭代数字
<html lang="en"> | |
<head> | |
<meta charset="UTF-"> | |
<meta name="viewport" content="width=device-width, initial-scale=.0"> | |
<meta http-equiv="X-UA-Compatible" content="ie=edge"> | |
<title>Document</title> | |
<script src="./lib/vue-.4.0.js"></script> | |
</head> | |
<body> | |
<div id="app"> | |
<!-- in 后面我们放过 普通数组,对象数组,对象, 还可以放数字 --> | |
<!-- 注意:如果使用 v-for 迭代数字的话,前面的 count 值从 开始 --> | |
<p v-for="i in">这是第 {{ i }} 次循环</p> | |
</div> | |
<script> | |
// 创建 Vue 实例,得到 ViewModel | |
var vm = new Vue({ | |
el: '#app', | |
data: {}, | |
methods: {} | |
}); | |
</script> | |
</body> | |
</html> |
在这里插入图片描述
5.循环中key属性的使用
注意 :2.2.0+ 的版本里,当在组件中使用 v-for 时, key 现在是必须的 。
当 Vue.js 用 v-for 正在更新已渲染过的元素列表时,它默认用 “ 就地复用 ” 策略。如果数据项的顺序被改变,Vue将 不是移动 DOM 元素来匹配数据项的顺序 , 而是 简单复用此处每个元素 ,并且确保它在特定索引下显示已被渲染过的每个元素。为了给 Vue 一个提示, 以便它能跟踪每个节点的身份,从而重用和重新排序现有元素 ,你需要为每项提供一个唯一 key 属性。
有问题的情况
<html lang="en"> | |
<head> | |
<meta charset="UTF-"> | |
<meta name="viewport" content="width=device-width, initial-scale=.0"> | |
<meta http-equiv="X-UA-Compatible" content="ie=edge"> | |
<title>Document</title> | |
<script src="./lib/vue-.4.0.js"></script> | |
</head> | |
<body> | |
<div id="app"> | |
<div> | |
<label>Id: | |
<input type="text" v-model="id"> | |
</label> | |
<label>Name: | |
<input type="text" v-model="name"> | |
</label> | |
<input type="button" value="添加" @click="add"> | |
</div> | |
<!-- 注意: v-for 循环的时候,key 属性只能使用 number 获取string --> | |
<!-- 注意: key 在使用的时候,必须使用 v-bind 属性绑定的形式,指定 key 的值 --> | |
<!-- 在组件中,使用v-for循环的时候,或者在一些特殊情况中,如果 v-for 有问题,必须 在使用 v-for 的同时,指定 唯一的 字符串/数字 类型 :key 值 --> | |
<p v-for="item in list" > | |
<input type="checkbox">{{item.id}} --- {{item.name}} | |
</p> | |
</div> | |
<script> | |
// 创建 Vue 实例,得到 ViewModel | |
var vm = new Vue({ | |
el: '#app', | |
data: { | |
id: '', | |
name: '', | |
list: [ | |
{ id:, name: '张三1' }, | |
{ id:, name: '张三2' }, | |
{ id:, name: '张三3' }, | |
{ id:, name: '张三4' }, | |
{ id:, name: '张三5' } | |
] | |
}, | |
methods: { | |
add() { // 添加方法 | |
this.list.unshift({ id: this.id, name: this.name }) | |
} | |
} | |
}); | |
</script> | |
</body> | |
</html> |
效果
在这里插入图片描述
我们发现原来我们勾选的是id为4的选项,但是当我们插入新的一行的时候,被选中的就变为3了,这就有问题的,这时我们需要使用key来给每天数据绑定一个特定的key
key的使用
在这里插入图片描述
直接给key绑定循环变量访问有问题:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这时我们发现前面的问题解决了~
- 注意 : v-for 循环的时候,key 属性只能使用 number或者string
- 注意 : key 在使用的时候,必须使用 v-bind 属性绑定的形式,指定 key 的值
- 在组件中,使用v-for循环的时候,或者在一些特殊情况中,如果 v-for 有问题,必须 在使用 v-for 的同时,指定 唯一的 字符串/数字 类型 :key 值