Vue复习第三天:(条件渲染 列表渲染 收集表单数据)

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:输入首尾空格过滤

猜你喜欢

转载自blog.csdn.net/weixin_51624761/article/details/124595169
今日推荐