Vue学习计划-Vue2--Vue核心(五)条件、列表渲染、表单数据

1. 条件渲染

  1. v-if

    1. v-if=“表达式”
    2. v-else-if = “表达式”
    3. v-else = “表达式”
      适用于:切换频率较低的场景

    特点:不显示dom元素,直接被删除

    注意:v-if和v-else-if、v-else一起使用,但要求结构不能被打断
    v-if和template一起使用, v-show不可以

  2. v-show v-show = “表达式” 适用于: 切换频率较高的场景 特点: 不展示dom元素,未被移除,仅仅是样式隐藏

  3. 备注:使用v-if时,元素可能无法取到,v-show一定可以获取到

示例:

	<!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>
		<script src="./vue.js"></script>
	</head>
	<body>
		<div id="app">
			<!-- v-show: 控制元素style样式中display属性实现显示与隐藏 -->
			<p v-show="1 !== 3">这是v-show文本</p>
			<p v-show="false">这是v-show文本</p>
			<hr>
			<!-- v-if: 对元素的删除与渲染 -->
			<p v-show="1 !== 3">这是v-if文本</p>
			<p v-if="true">这是v-if文本</p>
			<hr>
			<!-- v-if, v-else 的使用 -->
			<button @click="n++">点击if事件</button>
			<!-- <p v-if="n === 1">	8:00</p>
			<p v-if="n === 1">	9:00</p>
			<p v-if="n === 3">	10:00</p> -->
			<p v-if="n === 1">	8:00</p>
			<p v-else-if="n === 2">	9:00</p>
			<p v-else-if="n === 3">	10:00</p>
			<p v-else>其他时间</p>
			<hr>
			<!--v-if可以和 template使用,v-show不可以 -->
			<!-- <p v-if="n === 1"> 小红</p>
			<p v-if="n === 1"> 小李</p>
			<p v-if="n === 1"> 小王</p> -->
	
			<!-- template模板,不改变页面结构 -->
			<!-- <template v-show="n === 1"> -->
			<template v-if="n === 1">
				<p> 小红</p>
				<p> 小李</p>
				<p> 小王</p>
			</template>	
		</div>
		<script>
			const vm = new Vue({
				el: '#app',
				data: {
					n: 0,
				},
			})
		</script>
	</body>
	</html>

2. 列表渲染

  1. v-for
    1. 用于展示列表数据
    2. 语法:v-for=“(val, index) in arr” :key = yyy
    3. 可遍历:数组,对象,字符串(用的很少),指定次数(用的很少)
      示例:
	<!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>
		<script src="./vue.js"></script>
	</head>
	<body>
		<div id="app">
			<!-- 遍历数组 -->
			<h2>人员列表</h2>
			<ul>
				<li v-for="(p, index) in persons" :key="index">
					{{ p.name }} - {{ p.age }}
				</li>
			</ul>
			<hr>
	
			<!-- 遍历对象 -->
			<ul>
				<li v-for="(v, index) in obj" :key="index">
					{{ index }} - {{ v }}
				</li>
			</ul>
			<hr>
	
			<!-- 遍历字符串(比较少用) -->
			<ul>
				<li v-for="(v, index) in 'ahggg'" :key="index">
					{{ index }} - {{ v }}
				</li>
			</ul>
			<hr>
	
			<!-- 遍历数字(比较少用) -->
			<ul>
				<li v-for="(v, index) in 5" :key="index">
					{{ index }} - {{ v }}
				</li>
			</ul>
		</div>
		<script>
			const vm = new Vue({
				el: '#app',
				data: {
					persons: [
						{ id: '001', name: '小红', age: 19 },
						{ id: '002', name: '小明', age: 20},
						{ id: '003', name: '小亮', age: 21}
					],
					obj: {
						name: '小丽',
						age: 19,
						sex: '女'
					}
				}
			})
		</script>
	</body>
	</html>
  1. key作用与原理

    1. 虚拟DOM中key的作用:
      1. key是虚拟DOM对象的标识,当数据发生变化时,Vue会根据【新数据】生成【新的虚拟DOM】,
      2. 随后Vue进行【新虚拟DOM】和【旧虚拟DOM】的差异比较,比较规则如下:
    2. 对比规则:
      1. 旧虚拟DOM中找到与新虚拟DOM相同的key:
        • 若虚拟DOM中的内容没有变,直接使用之前的真实DOM
        • 若虚拟DOM中的内容变了,则生成新的真实DOM,随后替换掉页面中之前的真实DOM
      2. 旧虚拟DOM中未找到与新虚拟DOM相同的key:
        • 创建新的真实DOM,随后渲染到页面
          在这里插入图片描述
          在这里插入图片描述
  2. 用index作为key可能会引发的问题:

    1. 若对数据进行:逆序添加、逆序删除等破坏顺序操作:
      • 会产生没有必要的真实DOM更新 ==>界面效果没问题,但效率低
    2. 如果结构中还包含输入类的DOM:
      • 会产生错误的DOM更新,页面有问题
  3. 开发中如何选择key:

    1. 最好使用每条数据的唯一标识作为key, 比如id、手机号、身份证号等唯一值
    2. 如果不存在对数据的逆序添加、逆序删除等破坏顺序的操作,仅用于渲染列表用于展示,使用index作为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>
		<script src="./vue.js"></script>
	</head>
	<body>
		<div id="app">
			<!-- 唯一值作为key值: 逆序添加 -->
			<button @click.once="handleClickUnshiftPerson">unshift添加person</button>
			<ul>
				<!-- <li v-for="(p, index) in persons" :key="p.id"> -->
				<li v-for="(p, index) in persons" :key="index">
					{{ p.name }} - {{p.age }}
					<input type="text">
				</li>
			</ul>
		</div>
		<script>
			const vm = new Vue({
				el: '#app',
				data: {
					persons: [
						{ id: 1, name: '小红', age: 19 },
						{ id: 2, name: '小梁', age: 20 },
						{ id: 3, name: '小名', age: 21 },
					]
				},
				methods: {
					handleClickUnshiftPerson(){
						this.persons.unshift({id: 4, name: '小丽', age:22})
					}
				},
			})
		</script>
	</body>
	</html>

3. 收集表单数据

  1. 若:<input type = "text"/>, 则v-model收集的是value值,用户输入的就是value值。
  2. 若:<input type = "radio"/>, 则v-model收集的是value值,且要给标签配置value值。
  3. 若:<input type = "checkbox"/>
    1. 没有配置input的value属性,v-model收集的就是checked(勾选 or 未勾选, 是布尔值)
    2. 配置input的value属性:
      • v-model 的初始值是非数组,那么收集的就是checked(勾选 or 未勾选, 是布尔值)
      • v-model 的初始值是数组,那么收集的就是value组成的数组
  4. 备注:v-model的三个修饰符:
    1. lazy: 失去焦点再收集数据
    2. number: 输入字符串转为有效的数字
    3. trim: 输入首尾空格过滤

示例:

	<!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>
	  <script src="./vue.js"></script>
	</head>
	<body>
	  <div id="app">
	    <form @submit.prevent="demo">
	      <!-- 完整写法 -->
	      <!-- <label for="demo">账号:</label> -->
	      <!-- <input type="text" id="demo"> -->
	      账号:<input type="text" v-model.trim="obj.account">1{{ obj.account }}2<br><br>
	      密码:<input type="password" v-model="obj.password"> {{ obj.password }}<br><br>
	      年龄:<input type="number" v-model.number="obj.age"> {{ typeof(obj.age) }}<br><br>
	      性别:
	        男<input type="radio" name="sex" v-model="obj.sex" value="male">
	        女<input type="radio" name="sex" v-model="obj.sex" value="female">
	        {{ obj.sex }}<br><br>
	      爱好:
	      <!-- 多选框的初始值影响v-model收集回来的值 -->
	        学习<input type="checkbox" v-model="obj.hobby" value="study" id="demo">
	        打游戏<input type="checkbox" v-model="obj.hobby" value="game">
	        读书<input type="checkbox" v-model="obj.hobby" value="read">
	        {{ obj.hobby }}<br><br>
	      家乡:
	        <select v-model="obj.city">
	          <option value="">请选择家乡</option>
	          <option value="sjz">石家庄</option>
	          <option value="xt">邢台</option>
	          <option value="hd">邯郸</option>
	          <option value="cd">承德</option>
	        </select>
	        {{ obj.city }}
	        <br><br>
	      其他信息:
	        <textarea v-model.lazy="obj.other"></textarea> {{ obj.other }}
	        <br><br>
	      <input v-model="obj.argee" type="checkbox"> 阅读并接受<a href="http://www.baidu.com">《用户协议》</a> {{ obj.argee }}
	      <br><br>
	      <button>提交</button>
	    </form>
	  </div>
	  <script>
	    const vm = new Vue({
	      el: "#app",
	      data:{
	        obj:{
	          account: '',
	          password: '',
	          age: 18,
	          sex: 'female',
	          hobby: [],
	          city:'',
	          other: '',
	          argee: false
	        }
	      },
	      methods: {
	        demo(){
	          console.log(this.obj);
	        }
	      },
	    })
	  </script>
	</body>
	</html>

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

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

相关文章

Redis部署-集群

目录 集群 数据分片算法 哈希求余 一致性哈希算法 哈希槽分区算法 redis集群搭建 1.创建目录和配置. 2.将上述redis节点.构建成集群 3.使用客户端连接集群 集群模式下的故障转移流程 1.故障判定 2.故障迁移 集群扩容 集群 广义上的集群,只要是多个机器,构成了分布…

一体化污水处理设备材质怎么选

在环保意识日益增强的今天&#xff0c;污水处理设备成为城市建设过程中的重要环节。而选择合适的一体化污水处理设备材质&#xff0c;则成为了一项重要的决策。本文将从专业的角度出发&#xff0c;为您解析一体化污水处理设备材质的选取。 首先&#xff0c;一体化污水处理设备材…

css:flex布局中子元素高度height没有达到100%

目录 问题flex布局示例解决办法方式一方式二 参考 问题 css中使用flex布局中子元素高度height没有达到100% flex布局示例 希望实现两个盒子左右分布&#xff0c;内容垂直居中对齐 <style>.box {display: flex;align-items: center;border: 1px solid #eeeeee;}.box-l…

信息系统安全运维服务资质认证申报流程详解

随着我国信息化和信息安全保障工作的不断深入&#xff0c;以应急处理、风险评估、灾难恢复、系统测评、安全运维、安全审计、安全培训和安全咨询等为主要内容的信息安全服务在信息安全保障中的作用日益突出。加强和规范信息安全服务资质管理已成为信息安全管理的重要基础性工作…

群晖Docker搭建HomeAssistant,结合内网穿透实现远程访问智能家居控制中心

使用群晖Docker搭建HomeAssistant并实现异地公网访问 文章目录 使用群晖Docker搭建HomeAssistant并实现异地公网访问一、下载HomeAssistant镜像二、内网穿透HomeAssistant&#xff0c;实现异地控制智能家居三、使用固定域名访问HomeAssistant HomeAssistant是一个可以控制 苹果…

苍穹外卖项目笔记(7)— 微信登录、商品浏览

前言 苍穹外卖项目代码&#xff1a;https://github.com/Echo0701/take-out 1 HttpClient 1.1 介绍 HttpClient 是 Apche Jakarta Common 下的子项目&#xff0c;可以用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包&#xff0c;并且支持 HTTP 协议最新…

[LeetCode周赛复盘] 第 374 场周赛20231203

[LeetCode周赛复盘] 第 374 场周赛20231203 一、本周周赛总结100144. 找出峰值1. 题目描述2. 思路分析3. 代码实现 100153. 需要添加的硬币的最小数量1. 题目描述2. 思路分析3. 代码实现 100145. 统计完全子字符串1. 题目描述2. 思路分析3. 代码实现 100146. 统计感冒序列的数…

LeetCode Hot100 994.腐烂的橘子

题目&#xff1a; 在给定的 m x n 网格 grid 中&#xff0c;每个单元格可以有以下三个值之一&#xff1a; 值 0 代表空单元格&#xff1b;值 1 代表新鲜橘子&#xff1b;值 2 代表腐烂的橘子。 每分钟&#xff0c;腐烂的橘子 周围 4 个方向上相邻 的新鲜橘子都会腐烂。 返回…

计算机速成课Crash Course - 08. 指令和程序

今天开始计算机速成课Crash Course的系列讲解。 更多技术文章&#xff0c;全网首发公众号 “摸鱼IT” 锁定 -上午11点 - &#xff0c;感谢大家关注、转发、点赞&#xff01; 计算机速成课Crash Course - 08. 指令和程序 08. 指令和程序 上集我们把 ALU, 控制单元, RAM, 时钟…

观测云实现日志存储与分析 10 倍性价比提升|SelectDB 技术团队

作者&#xff1a;观测云 CEO 蒋烁淼 & 飞轮科技技术团队 在云计算逐渐成熟的当下&#xff0c;越来越多的企业开始将业务迁移到云端&#xff0c;传统的监控和故障排查方法已经无法满足企业的需求。而观测云可提供整体数据的分析、洞察、可视化、自动化、监测告警、智能巡查…

单周爆售150w+,“不是羽绒服买不起,而是军大衣更有性价比”

拼多多收盘市值超过阿里&#xff0c;成在美中概股市值第一。 截至美股收盘&#xff08;11月30日&#xff09;&#xff0c;拼多多收盘市值超过阿里巴巴&#xff0c;成为在美中概股中的市值第一股。拼多多收涨4.03%&#xff0c;报147.44美元&#xff0c;市值1959亿美元&#xff…

Tiled Matrix Multiplication

if(true) { (function(i,s,o,g,r,a,m){i[‘GoogleAnalyticsObject’]r;i[r]i[r]||function(){ (i[r].qi[r].q||[]).push(arguments)},i[r].l1*new Date();as.createElement(o), ms.getElementsByTagName(o)[0];a.async1;a.srcg;m.parentNode.insertBefore(a,m) })(window,docum…

uniapp微信小程序分包,小程序分包

前言&#xff0c;都知道我是一个后端开发、所以今天来写一下uniapp。 起因是美工给我的切图太大&#xff0c;微信小程序不让了&#xff0c;在网上找了一大堆分包的文章&#xff0c;我心思我照着写的啊&#xff0c;怎么就一直报错呢&#xff1f; 错误原因 tabBar的页面被我放在分…

五肽-13|提亮肤色,美白肌肤

五肽-13 INCI名称&#xff1a;五肽-13 说明&#xff1a; 五肽-13是一种合成肽&#xff0c;由丙氨酸、精氨酸、赖氨酸、脯氨酸和缬氨酸组成 功能&#xff1a; 五肽-13起到增白剂的作用 应用程序&#xff1a; 提亮和美白

2023年2月8日 Go生态洞察:Profile-Guided Optimization预览

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

Streamlit框架的定制化

Streamlit框架的定制化 最近做了一个关于streamlit框架的项目&#xff0c;颇有感触&#xff0c;所以在这里记录一下。 什么是streamlit? Streamlit 是一个python的WEB UI库&#xff0c;它做了高度的封装以便于不懂后前端开发的人员也能轻松构建画面。你可以从官网进行详细的…

Linux文件结构与文件权限

基于centos了解Linux文件结构 了解一下文件类型 Linux采用的一切皆文件的思想&#xff0c;将硬件设备、软件等所有数据信息都以文件的形式呈现在用户面前&#xff0c;这就使得我们对计算机的管理更加方便。所以本篇文章会对Linux操作系统的文件结构和文件权限进行讲解。 首先…

halcon如何设置窗口背景颜色?

halcon窗口背景默认是黑色&#xff0c;有时候图片背景是黑色&#xff0c;不方便观察边缘&#xff0c;如果需要设置窗口背景颜色&#xff0c;可以使用如下算子。 设置窗口背景颜色&#xff1a;白色 set_window_param (WindowHandle, background_color, white) 设置白色后的效…

13款趣味性不错(炫酷)的前端动画特效及源码(预览获取)分享(附源码)

文字激光打印特效 基于canvas实现的动画特效&#xff0c;你既可以设置初始的打印文字也可以在下方输入文字可实现激光字体打印&#xff0c;精简易用。 预览获取 核心代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8&q…

关于 mapboxgl 的常用方法及效果

给地图标记点 实现效果 /*** 在地图上添加标记点* point: [lng, lat]* color: #83f7a0*/addMarkerOnMap(point, color #83f7a0) {const marker new mapboxgl.Marker({draggable: false,color: color,}).setLngLat(point).addTo(this.map);this.markersList.push(marker);},…