【Vue】条件渲染列表渲染来啦

news2024/11/20 19:26:01

hello,我是小索奇哈,精心制作的Vue系列持续发放,涵盖大量的经验和示例,由浅入深进行讲解。 本章给大家讲解的是条件&列表渲染,前面的章节已经更新完毕,后面的章节持续输出,有任何问题都可以留言或私信哈,一起加油~

条件渲染

1. v-if

这个指令根据表达式的真假来决定是否渲染元素

例如:

<div v-if="show">
  只有在 show = true 时显示
</div>

2. v-else-if/v-else

v-else-if表示v-if的“else-if”条件,v-else表示最后的“else”条件

例如:

<div v-if="type === 'A'">
  A
</div>
<div v-else-if="type === 'B'">
  B 
</div>
<div v-else>
  都不是
</div>

3. 用key管理可复用元素

让Vue通过key值识别元素,提高渲染效率

例如:

<div v-if="loginType === 'username'" key="username">
  username
</div>
<div v-else key="email">
  email
</div>

4. v-show

基于CSS显示/隐藏元素,只是切换display

例如:

<div v-show="ok">
  在 ok=true 时显示
</div>

如果要频繁的更改,使用v-show会更好点,因为它仅是切换隐藏显示,效率更高

v-if 和 v-show 在条件渲染时的选择判断如下

  1. 当需要完全切换显示/隐藏元素时,如用户权限控制,使用 v-if它会直接操作 DOM,完全销毁或重新渲染元素

  2. 当只需要简单切换元素的显示/隐藏,如一些弹窗、提示,使用 v-show它只是切换 CSS 的 display属性,开销更小

  3. 当元素较简单,渲染开销小时,两者差异不大如果元素较复杂,v-show 会略快一些

  4. 如果需要频繁切换,使用 v-show;如果在运行时不大可能改变,使用 v-if

简单总结一下:

  • 完全展示/隐藏用 v-if

  • 简单切换显示/隐藏用 v-show

  • 频繁切换用 v-show

  • 运行时不变用 v-if

template上的v-if

template元素是一个不可见的包装器,它可以容纳多个元素,但是它本身不会渲染到DOM中

常见的应用场景就是和v-if指令结合使用:

  • 把v-if加在<template>上,可以有条件地渲染<template>内部的多个元素

  • 而不需要像v-if直接加在单个元素上那样,重复写很多重复的v-if条件判断

  • <template>可以包含任意类型的元素,非常方便地组织元素块

  • 最终渲染结果不包含<template>元素,只包含其内部的元素

用户信息展示案例

<template v-if="user.loggedIn">

  <div>
    <!-- 用户信息 --> 
    <p>用户名:{{user.name}}</p>  
    <p>积分:{{user.points}}</p>
  </div>

  <div> 
    <!-- 用户菜单 -->
    <button>首页</button>
    <button>设置</button>
  </div>

</template>

<div v-else>
  <!-- 登录提示 -->
  <p>请登录后查看个人信息</p>
  <button>去登录</button>  
</div>

注意template只能和v-if使用,用v-show是不行的

列表渲染

v-for

用于基于数据多次渲染元素,通常用来渲染列表数据

<ul>
  <li v-for="item in list">
    {{ item }}
  </li>
</ul>

模板 v-for

和v-if一样,可以在<template>上使用v-for来渲染元素块

<template v-for="item in list">
  <div>{{item.name}}</div>
  <div>{{item.desc}}</div>
</template>

track-by

用来指定元素的唯一标识,提高渲染效率

<div v-for="item in list" :key="item.id"></div>

这里详解一下key

在Vue列表渲染时,就像一个todolist应用生成一长串的li元素当列表数据更新时,Vue需要知道具体哪个元素发生了变化,比如插入、删除、排序等

那么Vue如何识别每个元素的身份呢?这就是key的作用了

我们需要给每个元素添加一个独一无二的key值,来标识不同的元素:

<ul>
  <li v-for="item in list" :key="item.id">
    {{item.name}}
  </li>
</ul>

这里我们使用每个数据item的id作为keykey的要求是唯一的,比如item的id就很适合作为key

有了key,Vue就可以准确地知道哪个元素发生了变化,比如某个元素被删除了,Vue会找到对应key的元素并销毁

这样就实现了高效的列表渲染

所以简单来说,key的作用是作为元素的唯一标识,用于提高Vue列表渲染时的性能,底层会复用DOM节点需要注意key必须唯一,不要使用索引index作为key

注意

一定要写key!虽然说不写key也不报错,但不写可能导致以下内容

  • 列表重新渲染时,会直接创建新元素,而不是移动原有元素这会带来页面闪烁

  • 使用Transition过渡动画时,会无法正确获取元素状态

  • 丧失Vue内部对列表元素的身份识别能力,导致其他问题

这里仅列出以下几点,在react中不写key直接就会报错

当我们不写key的话,vue会自动把index索引作为key(下面介绍index)

  1. 直接通过索引修改数组,如 vm.items[0] = {},是非响应式的。应使用 Vue.set(vm.items, 0, {}) 或 vm.items.splice() 来修改数组。

官网的介绍

image-20230821000956765

image-20230821000956765

索引

可以通过第二个参数获得索引值

<div v-for="(item, index) in list"></div>

上面的key也可以根据索引来定义

<div v-for="(item, index) in list"></div>

这里可能会有问题,能用index作为key吗?也可以,但是不推荐!

比如下面案例

<li v-for="(item, index) in list" :key="index">
  {{ item }}
</li>

使用 index 作为 key 存在以下问题:

  • 列表重新排序时,元素的 key 会变化,导致状态混乱(比如新添加一个索引为0索引的小索奇,它就替代了初始索引为0的张三,与原来进行对比,发现张三被小索奇怼跑了,这不闹的吗?)

  • 不能准确判断变化的原因是索引变还是数据变

  • 删除元素时,产生的新索引不会跟踪到原元素

正确写法,还是建议绑定到item.id身上,使用每一项数据中稳定且唯一的标识作为 key!

注意以面试题形式存在

image-20230821002410628

image-20230821002410628

拓展Diff算法

key是虚拟DOM对象的标识,当数据变化时,Vue就会根据新数据生成新的虚拟DOM

diff 算法是 Vue 和 React 等虚拟 DOM 框架实现高效 DOM 更新的关键算法它可以增量更新视图,避免重新渲染整个 DOM 树

diff算法的基本原理是:

  1. 将当前虚拟 DOM 和上一次虚拟 DOM 进行对比,找出变化的内容(没有变化的直接就复用了)

  2. 如果在旧虚拟节点中未找到与新虚拟节点相同的key,那么直接创建新的虚拟DOM,进行渲染,如果key同,那么就对比内容

  3. 不直接操作 DOM,而是将变化记录到一个JS 对象中

  4. 将这些变化一次性更新到实际的 DOM树上

简单示例

diff算法对比会发现,只需要将 B 换成 C 即可,无需重新渲染整个 UL这样避免了不必要的 DOM 操作

<!-- 上次虚拟DOM --> 
<ul>
  <li>A</li>
  <li>B</li>
</ul>

<!-- 当前虚拟DOM -->
<ul>
  <li>A</li>
  <li>C</li>  
</ul>

Vue 和 React 都使用类似的 diff 算法实现最小化更新实际 DOM 的目的,这带来非常高的性能优势

image-20230821005540298

image-20230821005540298

数组更新检测

Vue包含一系列观察数组变异方法来响应式更新视图

像push、pop、splice等方法

列表过滤

用两组代码分别实现过滤效果

watch实现

    new Vue({
    el:'#root',
    data:{
     keyWord:'',
     persons:[
      {id:'001',name:'马冬梅、',age:19,sex:'女'},
      {id:'002',name:'周冬雨',age:20,sex:'女'},
      {id:'003',name:'周杰伦',age:21,sex:'男'},
      {id:'004',name:'温兆伦',age:22,sex:'男'}
     ],
     //存放过滤后的新数组
     filPerons:[]
    },
    watch:{
     keyWord:{
      immediate:true,
      handler(val){
       this.filPerons = this.persons.filter((p)=>{
      // 返回一个布尔值
        return p.name.indexOf(val) !== -1
       })
      }
     }
    }
   })

computed实现

 new Vue({
    el:'#root',
    data:{
     keyWord:'',
     persons:[
      {id:'001',name:'马冬梅',age:19,sex:'女'},
      {id:'002',name:'周冬雨',age:20,sex:'女'},
      {id:'003',name:'周杰伦',age:21,sex:'男'},
      {id:'004',name:'温兆伦',age:22,sex:'男'}
     ]
    },
    computed:{
     filPerons(){
     // 计算属性必备return 
      return this.persons.filter((p)=>{
      // 返回一个布尔值,计算属性没有newValue属性,但可以通过用户输入的值来拿
       return p.name.indexOf(this.keyWord) !== -1
      })
     }
    }
   })

初始时计算属性会默认调用get,当依赖的数据变化时,计算属性也会自动调用~从而实现过滤

当computed和watch都能实现时,优先考虑computed

拓展filter

filter方法的作用是:

  • 它接收一个函数作为参数,这个函数会逐个处理数组中的每个元素

  • 函数返回一个布尔值,true表示保留该元素,false表示过滤掉该元素

  • filter会返回一个新数组,包含执行函数返回true的元素

  • 下面示例中的name代表callback函数的参数,表示当前正在遍历到的数组元素

const names = ['王美丽', '李小福', '张快乐', '赵细腻', '吉祥如意', '康健壮'];

const longNames = names.filter(name => name.length > 3);

const loudLongNames = longNames.map(name => name.toUpperCase()); 

console.log(loudLongNames);
// 输出:['李小福', '张快乐', '赵细腻', '吉祥如意']

这里我们过滤出了长度大于3个字的中文名字,然后把它们转换成大写,这里仅仅为了多用一个方法~

filter 最典型的用途就是过滤数组,接受判断条件并返回过滤后的新数组,

列表排序

案例:实现过滤+排序

	<div id="root">
		<h2>人员列表</h2>
		<input type="text" placeholder="请输入名字" v-model="keyWord">
		<button @click="sortType = 2">年龄升序</button>
		<button @click="sortType = 1">年龄降序</button>
		<button @click="sortType = 0">原顺序</button>
		<ul>
			<li v-for="(p,index) of filPerons" :key="p.id">
				{{p.name}}-{{p.age}}-{{p.sex}}
				<input type="text">
			</li>
		</ul>
	</div>

	<script type="text/JS">
		Vue.config.productionTip = false
		
		new Vue({
			el:'#root',
			data:{
				keyWord:'',
				sortType:0, //0原顺序 1降序 2升序
				persons:[
					{id:'001',name:'马冬梅',age:30,sex:'女'},
					{id:'002',name:'周冬雨',age:31,sex:'女'},
					{id:'003',name:'周杰伦',age:18,sex:'男'},
					{id:'004',name:'温兆伦',age:19,sex:'男'}
				]
			},
			computed:{
				filPerons(){
					const arr = this.persons.filter((p)=>{
						return p.name.indexOf(this.keyWord) !== -1
					})
					//判断一下是否需要排序
					if(this.sortType){
						arr.sort((p1,p2)=>{
							return this.sortType === 1 ? p2.age-p1.age : p1.age-p2.age
						})
					}
					return arr
				}
			}
		}) 

	</script>

image.png

image.png

拓展

Arrays.sort()

const months = ['March', 'Jan', 'Feb', 'Dec'];
months.sort();
console.log(months);
// output: Array ["Dec", "Feb", "Jan", "March"]

const array1 = [1, 30, 4, 21, 100000];
array1.sort();
console.log(array1);
// output: Array [1, 100000, 21, 30, 4]

如果提供了 比较函数compareFn,所有非 undefined 的数组元素都会按照比较函数的返回值进行排序,所有的 undefined 元素都会被排序到数组的末尾,并且不调用 compareFn

image-20230822221418048

image-20230822221418048

简单案例

 let arr = [66,99,88]
          arr.sort((a,b)=>{
           // 前-后就是升序,相反则降序
              return a-b
          })
  console.log(arr)
// [66, 88, 99]

如果对你有用,请点个免费的爱心叭~

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Anaconda启动错误

错误 An unexpected error occurred on Navigator start-up | Could not find a suitable TLS CA certificate bundle, invalid path 导致Anaconda启动失败&#xff01; [解决办法]1 找到anaconda的安装目录&#xff0c;该目录下的__init__.py 这两处分别改为verifyself.sessio…

程序员不得不知道的排序算法-上

目录 前言 1.冒泡排序 2.选择排序 3.插入排序 4.希尔排序 5.快速排序 6.归并排序 总结 前言 今天给大家讲一下常用的排序算法 1.冒泡排序 冒泡排序&#xff08;Bubble Sort&#xff09;是一种简单的排序算法&#xff0c;它重复地从待排序的元素中比较相邻的两个元素&a…

如何制作gif动图gif (多图合成gif、GIF录制软件、视频制作成GIF动图)

文章目录 1 在线制作多图合成gif动画2 GIF录制软件3 将现有的视频 制作成GIF动图 1 在线制作多图合成gif动画 在线制作gif动画链接:https://www.matools.com/gif ①选择需要制作gif动画的图片将其添加 ②调整时间间隔&#xff0c;图片宽高等设置 ③一键生成gif ④下载到本…

十年耕耘,致力于让垂直领域合作企业提升竞争力

2013年6月叶帆科技公司成立&#xff0c;时光如驹&#xff0c;距今已经十年了&#xff08;叶帆科技的前身叶帆工作室&#xff0c;官方博客上的第一篇博文发表于2004年6月&#xff0c;已近二十年了&#xff09;。 十年时间&#xff0c;初心不变&#xff0c;一直和各垂直领域的企…

最新AI写作系统ChatGPT源码/支持GPT4.0+GPT联网提问/支持ai绘画Midjourney+Prompt应用+MJ以图生图+思维导图生成

一、智能创作系统 SparkAi创作系统是基于国外很火的ChatGPT进行开发的Ai智能问答系统。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭建部署AI创作ChatGPT&#xff1f;小编这里写一个详细图文教程吧&…

使用ElementUI完成登入注册的跨域请求提高开发效率

&#x1f3ac; 艳艳耶✌️&#xff1a;个人主页 &#x1f525; 个人专栏 &#xff1a;《Spring与Mybatis集成整合》​​​​​​​ ⛺️ 生活的理想&#xff0c;为了不断更新自己 ! 目录 ​编辑 1、前言 1.1.什么是ELementUI 2、完成登陆注册前端页面 2.1环境搭建 运行…

通过pfx格式证书生成Nginx的SSL证书

1、安装openssl 工具地址&#xff1a;Win32/Win64 OpenSSL Installer for Windows - Shining Light Productions 安装完成后&#xff0c;自行配置环境变量。 2、生成证书 &#xff08;1&#xff09;以管理员身份运行cmd&#xff0c;进入到pfx文件的目录&#xff1a; &#x…

CSS详细基础(二)文本样式

插播一条CSS的工作原理&#xff1a; CSS是一种定义样式结构如字体、颜色、位置等的语言&#xff0c;被用于描述网页上的信息格式化和显示的方式。CSS样式可以直接存储于HTML网页或者单独的样式单文件。无论哪一种方式&#xff0c;样式单包含将样式应用到指定类型的元素的规则。…

postman记录backup

之前一直未登录postman&#xff0c;在临时空间处理请求&#xff0c;可能是因为postman更新了&#xff0c;导致其记录没了 别着急&#xff01; 首先我们先登录postman&#xff0c;有谷歌登录方式等 第一步、登录后点击import 第二步、点击files 第三步、找到c:/users/AppData…

三、VXLAN静态方式实验举例

VXLAN静态方式实验举例 1.1、静态方式部署集中式网关1.1.1、VXLAN隧道建立1.1.2、MAC地址动态学习1.1.3、同子网已知单播报文转发1.1.4、同子网BUM报文转发1.1.5、跨子网报文转发1.1.6、配置VXLAN接入业务部署方式 1.2、配置举例&#xff0c;相同网段互通&#xff08;静态方式&…

JVS低代码开发工具:触发逻辑引擎后对象变量节点回显配置说明

使用说明 通常业务中会涉及到表单上部分字段填写后通过触发逻辑处理已填写的数据进行回显到表单上&#xff0c;这时我们可以采用业务逻辑来配置对象变量节点进行表单数据回显。 对象变量&#xff1a;将自定义字段重新组装新的数据结构&#xff0c;数据结构类型为对象。 设计…

【网络安全】2023年堡垒机品牌大全

随着大家网络安全意识的增加&#xff0c;随着国家等保政策的严格执行&#xff0c;越来越多的企业开始采购堡垒机。这里就给大家总结了部分堡垒机品牌&#xff0c;让大家参考参考。 2023年堡垒机品牌大全 1、行云堡垒 2、JumpServer 3、安恒 4、骞云 5、齐治 6、阿里云 …

ahk系列——ahk_v2实现win10任意界面搜狗翻译

1、准备环境 win10或者以上系统安装ahkv2_64环境&#xff0c;安装包安装好后会有32和64位的unicode版本准备一个编译器&#xff0c;我用idea&#xff0c;不会ahk编程的我会把编译好的exe连接放到最后需要 联网 才能翻译 2、 使用方法 选中需要翻译的文字&#xff0c;然后ctr…

【算法】递归(高阶题目) -随时补充

文章目录 岛问题汉诺塔问题牛群繁衍数量问题求字符串的全部子序列字符串的全排列数字的全排列I数字的全排列IIN皇后IIN皇后I 岛问题 递归的方法: 遍历岛这个二维数组&#xff0c;如果当前数为1&#xff0c;则进入感染函数并将岛个数1感染函数&#xff1a;其实就是一个递归标注…

win11+wsl+git+cmake+x86gcc+armgcc+clangformat+vscode环境安装

一、安装wsl &#xff08;1&#xff09;打开power shell 并运行&#xff1a; Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux Enable-WindowsOptionalFeature -Online -FeatureName VirtualMachinePlatform &#xff08;2&#xff0…

通过containerd部署k8s集群环境及初始化时部分报错解决

目录 一.基础环境配置&#xff08;每个节点都做&#xff09; 1.hosts解析 2.防火墙和selinux 3.安装基本软件并配置时间同步 4.禁用swap分区 5.更改内核参数 6.配置ipvs 7.k8s下载 &#xff08;1&#xff09;配置镜像下载相关软件 &#xff08;2&#xff09;配置kube…

用CRM系统协助销售跟踪客户

客户跟踪对销售来说非常重要&#xff0c;销售不及时跟进很容易导致潜在客户流失。那么对于销售来说&#xff0c;该如何做好客户跟踪呢&#xff1f;或许可以使用CRM客户管理系统。下面来说说&#xff0c;CRM系统如何协助销售跟踪客户&#xff1f; 智能联系客户提醒 销售人员通…

Django中的缓存

Django中的缓存 缓存的定义 定义: 缓存是-类可以更快的读取数据的介质统称&#xff0c;也指其它可以加快数据读取的存储方式。一般用来存储临时数据&#xff0c;常用介质的是读取速度很快的内存 意义:视图渲染有一定成本&#xff0c;数据库的频繁查询过高;所以对于低频变动的页…

蓝桥杯 题库 简单 每日十题 day11

01 质数 质数 题目描述 给定一个正整数N&#xff0c;请你输出N以内&#xff08;不包含N&#xff09;的质数以及质数的个数。 输入描述 输入一行&#xff0c;包含一个正整数N。1≤N≤10^3 输出描述 共两行。 第1行包含若干个素数&#xff0c;每两个素数之间用一个空格隔开&…

Day 03 python学习笔记

位运算 基于二进制的运算&#xff08;计算机的底层基于位运算&#xff09; 计算机最小单位&#xff1a;bit (比特/位/二进制) 1byte&#xff08;字节&#xff09; 8bit &#xff08; 0000 0000&#xff09; &&#xff1a;与 &#xff08;全真为真&#xff0c;一假则…