1、条件渲染
Vue里提供了一种能够根据判断条件渲染页面的机制,也就是条件渲染。
条件渲染会用到两个指令,一个是v-show
,另外一个是v-if
。
1.1、v-show
v-show
可以根据判断表达式的值来决定是否渲染页面,它不会删除结点的值,底层实现是通过修改display
来实现页面的渲染
<!-- 准备好一个容器-->
<div id="root">
<h2>当前的n值是:{
{n}}</h2>
<h2 v-show="false">欢迎来到{
{name}}</h2>
</div>
</body>
<script type="text/javascript">
Vue.config.productionTip = false
const vm = new Vue({
el:'#root',
data:{
name:'尚硅谷',
}
})
</script>
v-show
中的表达式只要是一个能返回布尔值的表达式即可。值为true就渲染,否则就会隐藏结点。
1.2、v-if
v-if的用法与v-show的类似,不同之处在于v使用v-if渲染页面时,如果表达式为假,则会删除当前结点,影响当前页面的结构。
<h2 v-if="false">欢迎来到{
{name}}</h2>
<h2 v-if="1 === 1">欢迎来到{
{name}}</h2>
此时只有一个h2标签。
v-if的另一强大之处
v-if可以实现选择流程控制的效果,就像if else if else 那样,下面通过一个小例子来展示。
<div id="root">
<h2>当前的n值是:{
{n}}</h2>
<button @click="n++">点我n+1</button>
<h2 v-if="false">欢迎来到{
{name}}</h2>
<h2 v-if="1 === 1">欢迎来到{
{name}}</h2>
<!-- v-else和v-else-if -->
<div v-if="n === 1">Angular</div>
<div v-else-if="n === 2">React</div>
//中间不允许其他标签隔开
<div v-else-if="n === 3">Vue</div>
<div v-else>哈哈</div>
</div>
</body>
<script type="text/javascript">
Vue.config.productionTip = false
const vm = new Vue({
el:'#root',
data:{
name:'尚硅谷',
n:0
}
})
</script>
v-if还可以用和template标签配合使用,并且template不会影响页面的结构
<!-- v-if与template的配合使用 -->
<template v-if="n === 1">
<h2>你好</h2>
<h2>尚硅谷</h2>
<h2>北京</h2>
</template>
1.3、条件渲染总结
v-if
写法:
(1). v-if="表达式"
(2).v-else-if="表达式"
(3).v-else="表达式"
适用于:切换频率较低的场景。
特点:不展示的DOM元素直接被移除。
注意:v-if可以和:v-else-if、v-else一起使用,但要求结构不能被“打断”。
v-show
写法:v-show="表达式"
适用于:切换频率较高的场景。
特点:不展示的DOM元素未被移除,仅仅是使用样式隐藏掉
3.备注:使用v-if的时,元素可能无法获取到,而使用v-show一定可以获取到。
2、列表渲染
vue提供了一种快速渲染具有相同结构的结点的机制,也就是列表渲染,在jsp,thymeleaf有很多这样的示例。
vue中的列表本质是是通过遍历得到的,由于数组,对象,字符串都是可遍历的,所以可以对这三类进行列表渲染。
列表渲染会用到一个全新的指令v-for
,用于放在需要重复出现的标签体上,用法如下
v-for="item of items"
v-for="(item,index) of items"
v-for="item in items"
v-for="(item,index) in items"
表达式里既可以用in,也可以用of
items代指data里面配置的数据,item代表遍历的单个元素,根据需要自己命名,index表示索引,只能放在第二个位置。
<body>
<!-- 准备好一个容器-->
<div id="root">
<!-- 遍历数组 -->
<h2>人员列表(遍历数组)</h2>
<ul>
<li v-for="(p,index) in persons" :key="index">
{
{p.name}}-{
{p.age}}
</li>
</ul>
<!-- 遍历对象 -->
<h2>汽车信息(遍历对象)</h2>
<ul>
<li v-for="(value,k) in car" :key="k">
{
{k}}-{
{value}}
</li>
</ul>
<!-- 遍历字符串 -->
<h2>测试遍历字符串(用得少)</h2>
<ul>
<li v-for="(char,index) of str" :key="index">
{
{char}}-{
{index}}
</li>
</ul>
<!-- 遍历指定次数 -->
<h2>测试遍历指定次数(用得少)</h2>
<ul>
<li v-for="(number,index) of 5" :key="index">
{
{index}}-{
{number}}
</li>
</ul>
</div>
<script type="text/javascript">
Vue.config.productionTip = false
new Vue({
el:'#root',
data:{
persons:[
{
id:'001',name:'张三',age:18},
{
id:'002',name:'李四',age:19},
{
id:'003',name:'王五',age:20}
],
car:{
name:'奥迪A8',
price:'70万',
color:'黑色'
},
str:'hello'
}
})
</script>
注意,使用列表渲染时,建议显示的声明key,默认情况下key为索引或者属性名,建议大家使用唯一的标识指定key,尽量减少使用index指定key,否则会出现意想不到的结果,感兴趣的小伙伴可以看看张天禹老师在这一方面的讲解。
3、收集表单数据
根据下面的案例,收集表单数据
3.1、输入框
首先对于输入框这种,只需用v-model绑定即可
账号:<input type="text" v-model.trim="userInfo.account"> <br/><br/>
密码:<input type="password" v-model="userInfo.password"> <br/><br/>
年龄:<input type="number" v-model.number="userInfo.age"> <br/><br/>
3.2、单选框
单选框的每一个元素都要指定name,而且还要指定value的值,因为v-model默认就是绑定value的值,不指定value的值,获取到的就是null。
性别: 男
<input type="radio" name="sex" v-model="userInfo.sex" value="male"> 女
<input type="radio" name="sex" v-model="userInfo.sex" value="female">
3.3、复选框
复选框由于能一次选择多个,如果没有配置value值,则默认收集到的是布尔值,即勾选,未勾选,一般用一个数组来绑定复选框
爱好: 学习
<input type="checkbox" v-model="userInfo.hobby" value="study"> 打游戏
<input type="checkbox" v-model="userInfo.hobby" value="game"> 吃饭
<input type="checkbox" v-model="userInfo.hobby" value="eat">
hobby表示一个数组
3.4、下拉框
所属校区
<select v-model="userInfo.city">
<option value="">请选择校区</option>
<option value="beijing">北京</option>
<option value="shanghai">上海</option>
<option value="shenzhen">深圳</option>
<option value="wuhan">武汉</option>
</select>
需要为每一个选项绑定一个value的值,这时候v-model绑定的就是所选的值
3.5、文本框
<textarea v-model.lazy="userInfo.other"></textarea>
3.6、总结
<!-- 准备好一个容器-->
<div id="root">
<form @submit.prevent="demo">
账号:<input type="text" v-model.trim="userInfo.account"> <br/><br/> 密码:
<input type="password" v-model="userInfo.password"> <br/><br/> 年龄:
<input type="number" v-model.number="userInfo.age"> <br/><br/> 性别: 男
<input type="radio" name="sex" v-model="userInfo.sex" value="male"> 女
<input type="radio" name="sex" v-model="userInfo.sex" value="female"> <br/><br/> 爱好: 学习
<input type="checkbox" v-model="userInfo.hobby" value="study"> 打游戏
<input type="checkbox" v-model="userInfo.hobby" value="game"> 吃饭
<input type="checkbox" v-model="userInfo.hobby" value="eat">
<br/><br/> 所属校区
<select v-model="userInfo.city">
<option value="">请选择校区</option>
<option value="beijing">北京</option>
<option value="shanghai">上海</option>
<option value="shenzhen">深圳</option>
<option value="wuhan">武汉</option>
</select>
<br/><br/> 其他信息:
<textarea v-model.lazy="userInfo.other"></textarea>
<br/><br/>
<input type="checkbox" v-model="userInfo.agree">阅读并接受<a href="http://www.atguigu.com">《用户协议》</a>
<button>提交</button>
</form>
</div>
</body>
<script type="text/javascript">
Vue.config.productionTip = false
new Vue({
el: '#root',
data: {
userInfo: {
account: '',
password: '',
age: 18,
sex: 'female',
hobby: [],
city: 'beijing',
other: '',
agree: ''
}
},
methods: {
demo() {
console.log(JSON.stringify(this.userInfo))
}
}
})
</script>
收集表单数据总结
- 若:
<input type="text"/>
,则v-model收集的是value值,用户输入的就是value值。 - 若:
<input type="radio"/>
,则v-model收集的是value值,且要给标签配置value值。 - 若:
<input type="checkbox"/>
- 没有配置input的value属性,那么收集的就是checked(勾选 or 未勾选,是布尔值)
- 配置input的value属性:
- v-model的初始值是非数组,那么收集的就是checked(勾选 or 未勾选,是布尔值)
- v-model的初始值是数组,那么收集的的就是value组成的数组
备注:v-model的三个修饰符:
- lazy:失去焦点再收集数据
- number:输入字符串转为有效的数字
- trim:输入首尾空格过滤