Vue:条件渲染 列表渲染

Vue:条件渲染 & 列表渲染

    • 条件渲染
      • v-show
      • v-if
    • 列表渲染
      • v-for
        • 数组
        • 对象


条件渲染

Vue允许依据一定的条件,通过表达式的布尔值,来决定是否渲染某些元素,其依赖于v-showv-if两条指令。

v-show

v-show可以依据表达式的布尔值,来显示或隐藏元素。

语法:

<标签 v-show="布尔表达式"> </标签>

当布尔表达式为true,那么渲染该标签,如果为false,则不渲染。

示例:

<h2 v-show="false"> hello </h2>
<h2 v-show="1 === 1"> world </h2>

第一个表达式为false,不渲染该标签,第二个表达式为1 === 1,也就是true,渲染该标签。

输出结果:

在这里插入图片描述

只有第二个world被渲染了,第一个hello被隐藏了。查看HTML页面结构,可以看出其是通过display: none属性实现的元素隐藏。


v-if

v-if的功能与v-show类似,但是其更加激进,而且可以配合v-else等指令一起使用。

语法:

<标签 v-if="布尔表达式"> </标签>

示例:

<h2 v-if="false"> hello</h2>
<h2 v-if="1 === 1"> world </h2>

把刚才的v-show改为v-if

输出结果:

在这里插入图片描述

虽然也只输出了world,但是其隐藏元素的方式和v-show不同,此处hello直接消失了,根本没有这个DOM元素。

因此对于高频率替换显示与隐藏的标签,建议使用v-show,其只修改属性而不增删DOM元素,效率更高。

v-if还可以配合v-else-ifv-else使用,进行多分支条件判断:

语法:

<标签 v-if="布尔表达式"> </标签>
<标签 v-else-if="布尔表达式"> </标签>
<标签 v-else-if="布尔表达式"> </标签>
......
<标签 v-else="布尔表达式"> </标签>

其中v-else-ifv-else前面,必须存在v-if

示例:

<p>当前的n值是:{{n}}</p>
<button @click="n++">n+1</button> </br>
<div v-if="n === 1">Vue:v1</div>
<div v-else-if="n === 2">Vue:v2</div>
<div v-else-if="n === 3">Vue:v3</div>
<div v-else>Vue:latest</div> 

nvm.data下的一个属性,初始值为1,每次点击按钮自增,都会使n++并且重新渲染模板,依据条件判断,渲染不同的节点。

输出结果:

在这里插入图片描述

起初值为1,触发v-if

在这里插入图片描述

n > 3时,触发v-else,输出Vue:latest

v-ifv-show也经常添加到一个父级元素上,当元素被隐藏,所有子元素也会一起隐藏。

<h2 v-if="n === 1">hello</h2>
<h2 v-if="n === 1">JavaScript</h2>
<h2 v-if="n === 1">Vue</h2>

例如以上代码,可以只使用一个v-if一次性对多个元素进行条件渲染:

<div v-if="n === 1">
	<h2>hello</h2>
	<h2>JavaScript</h2>
	<h2>Vue</h2>
</div>

但是这样三个元素最外层会多出一层div

在这里插入图片描述

在部分场景下,最外层的div可能会影响内部的元素,此时可以使用<template>标签:

<template v-if="n === 1">
	<h2>hello</h2>
	<h2>JavaScript</h2>
	<h2>Vue</h2>
</template>

输出结果:

在这里插入图片描述

这种情况下,三个<h2>标签外层直接就是root,没有多出来的<div>了。


列表渲染

v-for

当拿到一个数组或者对象时,如果需要遍历输出所有的元素,那么v-for指令可以很方便的完成该功能,且无需手动写循环。

语法:

<标签 v-for="元素 in/of 数组/对象" :key=""> </标签>

中间的关键字,既可以是in也可以是of

数组

v-for遍历数组时,元素可以接收两个参数,格式如下:

<标签 v-for="(元素值, 下标) in/of 数组" :key=""> </标签>

暂时忽略这个:key,不写该值。

示例:

<div id="root">
	<ul>
		下标 姓名 年龄
		<li v-for="(p,index) of persons">
			 {{index}} - {{p.name}} - {{p.age}}
		</li>
	</ul>
</div>

<script type="text/javascript">
	new Vue({
		el:'#root',
		data:{
			persons:[
				{id:'001',name:'张三',age:18},
				{id:'002',name:'李四',age:19},
				{id:'003',name:'王五',age:20}
			],
		}
	})
</script>

Vue实例中,有一个数组persions,内含三个对象,在<li>中通过v-for遍历该数组,输出所有值。

其中(p,index) of persons表示,遍历persons数组,每次将拿到的元素放到p中,该元素的下标放到index中。

在模板内部,可以通过{{}}插值语法直接使用这些值。

输出结果:

在这里插入图片描述

这样就成功渲染了所有对象,但是有一个很大的问题,那就是没有使用:key这个参数。

在数组操作中,如果没有key,那么默认为index,但这是一个不太安全的行为。

简单修改一下HTML结构:

<ul>
	下标 姓名 年龄
	<li v-for="(p,index) of persons" :key="index">
		 {{index}} - {{p.name}} - {{p.age}} <input>
	</li>
</ul>

每一个选项,都添加一个<input>输入框。

启动后,为每个输入框输入对应的姓名:

在这里插入图片描述

在控制台中,为数组头部增加一个元素赵六:

在这里插入图片描述

奇怪的事情发生了,张三的输入框到了赵六后面,李四的输入框到了张三后面,所有输入框都错位了,这就是:key=index惹的祸。

模板重新解析时,v-for不会重新生成所有的DOM元素,而是尽可能复用原先的元素,而元素复用依赖于key的设定

如下图:

在这里插入图片描述

由于默认情况下:key=indexVue认为更新前后key相同的选项之间,可以进行复用。

插入新元素后,重新解析模板。v-for进行第一轮循环,遍历到赵六key=index=0,于是查看原先index=0的位置,也没有可以复用的元素,发现<input>可以复用,于是把原先index=0<input>进行复用,放到赵六的后面。

后续同理,key=index=1时,复用原先index=1位置的<input>,导致拿到了错位的数据。

直到key=index=4时,发现原先没有该数据,生成一个新的元素<input>

可以理解为,原先index=0的位置的元素,被新的index=0的位置的元素复用了,就是因为key=index。因此,key一般不设置为数组下标,而是每个数组元素的唯一id

<ul>
	下标 姓名 年龄
	<li v-for="(p,index) of persons" :key="p.id">
		 {{index}} - {{p.name}} - {{p.age}} <input>
	</li>
</ul>

在每个数组元素中,都设置了对应的id,指定:key="p.id"

和之前一样,插入一个新元素:

在这里插入图片描述

这一次由于更新前后,每个数组元素的id不变,所以<input>也正确匹配了。


对象

v-for遍历对象时,元素也可以接收两个参数,格式如下:

<标签 v-for="(值, 键) in/of 对象" :key=""> </标签>

当遍历的是对象时,第一个参数接收值,第二个参数接收键,:key一般指定为属性名,因为一个对象插入或删除元素后,每个属性的名称是不变的。

示例:

<div id="root">
	<ul>
		<li v-for="(value, k) of mouse" :key="k">
			{{k}}: {{value}}
		</li>
	</ul>
</div>

<script type="text/javascript">
	Vue.config.productionTip = false
	
	const vm = new Vue({
		el:'#root',
		data:{
			mouse:{
				brand:'Logitech',
				price:'199',
				color:'black'
			}
		}
	})
</script>

data中,放了一个鼠标对象,包括其品牌,售价,颜色三个属性。通过v-for遍历输出这个对象,k拿到属性名,value拿到属性值。

输出结果:

在这里插入图片描述


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/911649.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

计算机的错误计算(一百四十八)

摘要 本节探讨 MATLAB 中 附近数的正割函数与 附近数的余割函数的计算精度问题。 例1. 已知 计算 直接贴图吧&#xff1a; 另外&#xff0c;16位的正确值分别为 0.4105556037464873e9、0.3670813182326778e13、-0.2549029285657875e8 与 -0.1248777628817462e12&am…

input file检验成功之后才可以点击

input file检验成功之后才可以点击 需求 在上传发票前需要先填写发票号&#xff0c;然后点击选择文件直接完成上传功能 实现思路 在没有输入发票号之前&#xff0c;file按钮不可用不能点击&#xff0c;输入之后&#xff0c;按钮可用&#xff0c;点击之后选择文件&#xff…

理解鸿蒙app 开发中的 context

是什么 Context是应用中对象的上下文&#xff0c;其提供了应用的一些基础信息&#xff0c;例如resourceManager&#xff08;资源管理&#xff09;、applicationInfo&#xff08;当前应用信息&#xff09;、dir&#xff08;应用文件路径&#xff09;、area&#xff08;文件分区…

算法每日练 -- 双指针篇(持续更新中)

介绍&#xff1a; 常见的双指针有两种形式&#xff0c;一种是对撞指针&#xff08;左右指针&#xff09;&#xff0c;一种是快慢指针&#xff08;前后指针&#xff09;。需要注意这里的双指针不是 int* 之类的类型指针&#xff0c;而是使用数组下标模拟地址来进行遍历的方式。 …

Python学习从0到1 day26 第三阶段 Spark ①

要学会 剥落旧痂 然后 循此新生 —— 24.11.8 一、Spark是什么 定义&#xff1a; Apache Spark 是用于大规模数据处理的统一分析引擎 简单来说&#xff0c;Spark是一款分布式的计算框架&#xff0c;用于调度成百上千的服务器集群&#xff0c;计算TB、PB乃至EB级别的海量数据…

jenkins使用slave节点进行node打包报错问题处理

jenkins使用slave打包报错 Also: hudson.remoting.Channel$CallSiteStackTrace: Remote call to 21.136 解决方法&#xff1a; 重启从节点 选择断开连接再重新连

python登录功能实现

一.用python实现基本的登录功能 #-----------------1.基本登录功能------------------- nameinput("qq账号&#xff1a;") if name"jc":passwdinput("密码&#xff1a;")if passwd"123456":print("登录成功")else:print(&q…

三菱MR-J4伺服绝对位置检测系统

发生[AL.25 绝对位置丢失]或[AL.E3 绝对位置计数器警告]时&#xff0c;必须再次进行原点设定。否则可能会因此发生预料之外的动作。 概要 常规运行时&#xff0c;编码器由检测1转内位置的编码器和检测转数的旋转累计计数器构成。 绝对位置检测系统与伺服系统控制器电源…

mac 中python 安装mysqlclient 出现 ld: library ‘ssl‘ not found错误

1. 出现报错 2. 获取openssl位置 brew info openssl 3. 配置环境变量&#xff08;我的是在~/.bash.profile&#xff09; export LDFLAGS"-L/opt/homebrew/Cellar/openssl3/3.4.0/lib" export CPPFLAGS"-I/opt/homebrew/Cellar/openssl3/…

OceanBase详解及如何通过MySQL的lib库进行连接

OceanBase详解及如何通过MySQL的lib库进行连接 一、引言二、OceanBase概述1. 起源与发展2. 核心技术特点3. 应用场景三、OceanBase架构解析1. 系统架构2. 存储引擎3. 分布式架构四、如何使用MySQL的lib库连接OceanBase1. 前提条件2. 安装MySQL Connector/C3. 编写连接代码4. 编…

aspose如何获取PPT放映页“切换”的“持续时间”值

aspose如何获取PPT放映页“切换”的“持续时间”值 项目场景问题描述问题1&#xff1a;从官方文档和资料查阅发现并没有对切换的持续时间进行处理的方法问题2&#xff1a;aspose的依赖包中&#xff0c;所有的关键对象都进行了混淆处理 解决方案1、找到ppt切换的持续时间对应的混…

SpringBoot开发——SpringBoot3.3 中实现多端口监听

文章目录 1、项目环境与依赖配置2、配置多端口监听3、编写配置类实现多端口监听4、为每个端口创建独立的配置类4.1 8081 端口配置类4.2 8082 端口配置类 5、控制器类定义5.1 8080 端口的控制器&#xff08;保持原有配置&#xff09;5.2 8081 端口的控制器5.3 8082 端口的控制器…

大数据湖项目建设方案(100页WORD)

文档介绍&#xff1a; 随着信息技术的飞速发展&#xff0c;数据量呈现出爆炸性增长的趋势。企业、政府机构及科研单位在运营过程中积累了大量的数据资源&#xff0c;这些数据中蕴含着巨大的价值&#xff0c;但如何高效地存储、处理和分析这些数据&#xff0c;成为了一个亟待解…

【SpringBoot】SpringCloud一些常用依赖

SpringChoudAlibaba springcloud版本对应关系 可以按照hm这样写 ----以下是我自己使用过的&#xff0c;比较乱 parent <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><versi…

Webserver(5.3)线程池实现

目录 线程池locker.hthreadpool.h 线程池 相比于动态地创建子线程&#xff0c;选择一个已经存在的子线程的代价显然要小得多。至于主线程选择哪个子线程来为新任务服务&#xff0c;有多种方式&#xff1a; 主线程使用某种算法来主动选择子线程。最简单、最常用的算法是随机算…

解决:使用EasyExcel导入Excel模板时出现数据导入不进去的问题

解决&#xff1a;使用EasyExcel导入Excel模板时出现数据导入不进去的问题 在Java中&#xff0c;当我们用EasyExcel导入Excel时&#xff0c;可能会出现数据导入不进去的问题。例如&#xff1a; 这种异常等。 问题原因1&#xff1a;这个1代表从第几行开始&#xff0c;你的exce…

可视化建模与UML《类图实验报告》

史铁生&#xff1a; 余华和莫言扛着我上火车&#xff0c; 推着走打雪仗&#xff0c; 还带我偷西瓜&#xff0c; 被人发现后他们拔腿就跑&#xff0c; 却忘了我还在西瓜地里。 一、实验目的&#xff1a; 1、熟悉类图的构件事物。 2、熟悉类之间的泛化、依赖、聚合和组合关系…

python(自用查看版)

目录 1.注意事项 1.1 python的除法不是整除&#xff0c;得到的是浮点数 1.2算术符号基于数学的算术优先级。具体可自行查看。 1.3注释 1.4缩进 1.5换行 1.6常见关键字 1.7续行符 1.8报错 1.9赋值 1.10比较运算符 2.常量和表达式 3.变量 4.数据类型 4.1整型int …

TMDOG的Gin学习笔记_02——Gin集成支付宝支付沙箱环境

TMDOG的Gin学习笔记_02——Gin集成支付宝支付沙箱环境 博客地址&#xff1a;TMDOG的博客 作者自述&#xff1a; 最近忙着整理自己的项目代码&#xff0c;终于有时间更新一下博客。这次的内容是关于如何在Gin框架下集成支付宝的支付沙箱环境&#xff0c;具体包括如何初始化支付…

cmake could not find a package configuration file provided by “Microsoft.GSL“

通过查找 dir C:\vcpkg\installed\x64-windows /s /b | findstr Microsoft.GSL vspkg安装 git clone https://github.com/microsoft/vcpkg.git cd vcpkg .\bootstrap-vcpkg.bat .\vcpkg --version