Vue 2 条件渲染

条件渲染相关的指令有哪些?

  1. v-if、v-else、v-else-if
  2. v-show

v-if 的作用

<div v-if="expression"></div>

v-if 根据表达式 expression 返回的值是否为 truthy 来决定其内容是否被渲染。

Vue还实现了 v-else 和 v-else-if:

<div v-if="expression1"></div>
<div v-else-if="expression2"></div>
<div v-else></div>

注意,v-else-if 须紧跟在 v-if 后,v-else须紧跟在 v-if 或 v-else-if 后

如果想使用 v-if 控制多个元素的渲染,可以使用 <template> 元素,因为它不会被包含在渲染结果内。


v-if 相关源码

首先是 src\compiler\parser\index.ts :

处理 HTML 元素上的 if 系列指令,获取它们的表达式 exp ,如果是 v-if 指令的话,还要将其添加到它的 ifConditions 数组。

function processIf(el) {const exp = getAndRemoveAttr(el, 'v-if')if (exp) {el.if = expaddIfCondition(el, {exp: exp,block: el})} else {if (getAndRemoveAttr(el, 'v-else') != null) {el.else = true}const elseif = getAndRemoveAttr(el, 'v-else-if')if (elseif) {el.elseif = elseif}}
}

getAndRemoveAttr 从元素中移除某个 attr ,

// note: this only removes the attr from the Array (attrsList) so that it
// doesn't get processed by processAttrs.
// By default it does NOT remove it from the map (attrsMap) because the map is
// needed during codegen.
export function getAndRemoveAttr(el: ASTElement,name: string,removeFromMap?: boolean
): string | undefined {let valif ((val = el.attrsMap[name]) != null) {const list = el.attrsListfor (let i = 0, l = list.length; i < l; i++) {if (list[i].name === name) {list.splice(i, 1)break}}}if (removeFromMap) {delete el.attrsMap[name]}return val
}

以后看懂了其他源码再回来补充😉


v-if 和 v-for一起使用时的注意点

v-ifv-for 一起使用时,确实存在一个优先级关系:v-for 具有比 v-if 更高的优先级。这意味着 v-for 指令将首先对数据进行迭代,然后在每个迭代项上应用 v-if 条件。

因此,如果你的本意是先进行 v-if 的判断,那么可以在循环外套个 <template> 元素,把 v-if 写在 <template> 元素上。


使用 key attribute 阻止元素复用

当组件需要进行重新渲染的时候,Vue通过 diff 算法知道哪些元素可以复用以提高渲染效率。

但是有时候,我们需要切换一个全新的子元素,就比如我们前文介绍的 v-if 系列指令。

<div id="app"><input v-if="flag" placeholder="input1"><input v-else placeholder="input2"><button @click="toggleFlag">Toggle</button>
</div>
<script>new Vue({el: '#app',data:{flag: true},methods:{toggleFlag(){this.flag=!this.flag;}}});
</script>

上面的结果是切换 input 时会保留原来的输入数据:

动画

如果你有阻止这样复用的需求,那么可以给元素添加一个唯一的 key 。

<input v-if="flag" placeholder="input1" key="input1">
<input v-else placeholder="input2" key="input2">

在这里插入图片描述


v-show 的作用

v-show 的用途和 v-if 指令一样,都是用于根据条件显示元素。

献上 v-show 源码

src\platforms\web\runtime\directives\show.ts

import VNode from 'core/vdom/vnode'
import type { VNodeDirective, VNodeWithData } from 'types/vnode'
import { enter, leave } from 'web/runtime/modules/transition'// recursively search for possible transition defined inside the component root
function locateNode(vnode: VNode | VNodeWithData): VNodeWithData {// @ts-expect-errorreturn vnode.componentInstance && (!vnode.data || !vnode.data.transition)? locateNode(vnode.componentInstance._vnode!): vnode
}export default {bind(el: any, { value }: VNodeDirective, vnode: VNodeWithData) {vnode = locateNode(vnode)const transition = vnode.data && vnode.data.transitionconst originalDisplay = (el.__vOriginalDisplay =el.style.display === 'none' ? '' : el.style.display)if (value && transition) {vnode.data.show = trueenter(vnode, () => {el.style.display = originalDisplay})} else {el.style.display = value ? originalDisplay : 'none'}},update(el: any, { value, oldValue }: VNodeDirective, vnode: VNodeWithData) {/* istanbul ignore if */if (!value === !oldValue) returnvnode = locateNode(vnode)const transition = vnode.data && vnode.data.transitionif (transition) {vnode.data.show = trueif (value) {enter(vnode, () => {el.style.display = el.__vOriginalDisplay})} else {leave(vnode, () => {el.style.display = 'none'})}} else {el.style.display = value ? el.__vOriginalDisplay : 'none'}},unbind(el: any,binding: VNodeDirective,vnode: VNodeWithData,oldVnode: VNodeWithData,isDestroy: boolean) {if (!isDestroy) {el.style.display = el.__vOriginalDisplay}}
}

locateNode 函数递归寻找当前 vnode 外层具有 transition 属性的 vnode。

最后使用 export default 导出了一个自定义指令的配置。

该自定义指令的bind函数的流程分析:

首先找寻外层具有 transtion 属性的 vnode,

vnode = locateNode(vnode)

保存其 transition 属性值(如果不存在为false),

const transition = vnode.data && vnode.data.transition

保存其原始的 display属性,如果本来 el.style.display 的值就为 none,那么 originalDisplay 为 空字符串''

const originalDisplay = (el.__vOriginalDisplay =el.style.display === 'none' ? '' : el.style.display)

判断指令的绑定表达式的值及是否是过渡组件,

如果绑定值为真值且是过渡组件,则调用 enter 函数进入过渡动画;

如果绑定值为假值,设置元素的 display 属性为 none;

如果绑定值是真值但不是过渡组件,设置元素的 display 属性为 originalDisplay,

if (value && transition) {vnode.data.show = trueenter(vnode, () => {el.style.display = originalDisplay})
} else {el.style.display = value ? originalDisplay : 'none'
}

所以,说这么多,v-show 的本质上是通过 元素的 display attribute 来控制其显示


v-show 和 v-if 的区别在哪里?

v-show 本质上是切换元素的 CSS 属性 display 控制元素的可见性。

v-if 是直接创建或销毁DOM。

因此,频繁切换元素使用 v-show,否则使用 v-if。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

排序算法:快速排序(三种排序方式、递归和非递归)

朋友们、伙计们&#xff0c;我们又见面了&#xff0c;本期来给大家解读一下有关排序算法的相关知识点&#xff0c;如果看完之后对你有一定的启发&#xff0c;那么请留下你的三连&#xff0c;祝大家心想事成&#xff01; C 语 言 专 栏&#xff1a;C语言&#xff1a;从入门到精通…

autojs修改顶部标题栏颜色

顶部标题栏的名字是statusBarColor 不是toolbar。难怪我搜索半天搜不到 修改之后变成这样了 代码如下&#xff1a; "ui"; importClass(android.view.View); importClass(android.graphics.Color); ui.statusBarColor(Color.parseColor("#ffffff")); ui.…

【Spring Cloud系统】- 轻量级高可用工具Keepalive详解

【Spring Cloud系统】- 轻量级高可用工具Keepalive详解 文章目录 【Spring Cloud系统】- 轻量级高可用工具Keepalive详解一、概述二、Keepalive分类2.1 TCP的keepalive2.2 HTTP的keep-alive2.3 TCP的 KeepAlive 和 HTTP的 Keep-Alive区别 三、nginx的keepalive配置3.1 nginx保持…

NPM使用技巧

NPM使用技巧 前言技巧全局模块位置PowerShell报错安装模块冲突 NPM介绍NPM命令使用方法基本命令模块命令查看模块运行命令镜像管理 常用模块rimrafyarn 前言 本文包含NodeJS中NPM包管理器的使用技巧&#xff0c;具体内容包含NPM介绍、NPM命令、常用模块等内容&#xff0c;还包…

【STM32】学习笔记-时间戳RTC

Unix时间戳 Unix 时间戳&#xff08;Unix Timestamp&#xff09;定义为从UTC/GMT的1970年1月1日0时0分0秒开始所经过的秒数&#xff0c;不考虑闰秒 时间戳存储在一个秒计数器中&#xff0c;秒计数器为32位/64位的整型变量 世界上所有时区的秒计数器相同&#xff0c;不同时区通…

upload-labs 16/17关

16 将gif文件和包含一句话木马的php文件放在同一目录下&#xff0c;用cmd的copy命令将php文件整合进文件中。 可以看到最后一行包含了注入代码 将b1文件上传到服务器后&#xff0c;发现并未能正常执行代码&#xff0c;将上传后的文件下载到本地&#xff0c;打开后发现最后的代…

XML解析 不允许有匹配 _[xX][mM][lL]_ 的处理指令目标

以上错误是在解析xml参数时候报出的。 我这里错误的原因在于&#xff0c;<?xml version\"1.0\" encoding\"UTF-8\"?>少了个空格&#xff0c;参考下图&#xff1a; 下面一行才是对的。

发收一体的2.4G射频合封芯片Y62G,内置九齐MCU

宇凡微2.4GHz发收一体合封芯片Y62G是一款高度集成的系统芯片&#xff0c;融合了2.4G芯片G350和微控制器&#xff08;MCU&#xff09;功能&#xff0c;为开发人员提供了更好的设计自由度和成本效益的解决方案。以下是Y62G芯片的主要特点和优势&#xff1a; 高度合封集成 Y62G芯…

SQL4 查询结果限制返回行数

描述 题目&#xff1a;现在运营只需要查看前2个用户明细设备ID数据&#xff0c;请你从用户信息表 user_profile 中取出相应结果。 示例&#xff1a; iddevice_idgenderageuniversityprovince12138male21北京大学Beijing23214male复旦大学Shanghai36543female20北京大学Beijin…

SpringMvc 之crud增删改查应用

目录 1.创建项目 2.配置文件 2.1pom.xml文件 2.2 web.xml文件 2.3 spring-context.xml 2.4 spring-mvc.xml 2.5 spring-MyBatis.xml 2.6 jdbc.properties 数据库 2.7 generatorConfig.xml 2.8 日志文件log4j2 3.后台代码 3.1 pageBean.java 3.2切面类 3.3 biz层…

【Spring Boot】JPA — JPA入门

JPA简介 1. JPA是什么 JPA是Sun官方提出的Java持久化规范&#xff0c;它为Java开发人员提供了一种对象/关联映射工具来管理Java应用中的关系数据&#xff0c;通过注解或者XML描述“对象-关系表”之间的映射关系&#xff0c;并将实体对象持久化到数据库中&#xff0c;极大地简…

公司内部传文件怎么安全——「用绿盾透明加密软件」

为保证公司内部文件传递的安全性&#xff0c;可以使用天锐绿盾透明加密软件来进行保护。以下是具体的操作步骤&#xff1a; 在公司内部部署天锐绿盾加密软件&#xff0c;确保需要传递的文件都能受到加密保护。 在员工的工作电脑上安装天锐绿盾客户端&#xff0c;并设置好相关的…

Grafana配置邮件告警

1、创建一个监控图 2、grafana邮件配置 vim /etc/grafana/grafana.ini [smtp] enabled true host smtp.163.com:465 user qinziteng05163.com password xxxxx # 授权码 from_address qinziteng05163.com from_name Grafanasystemctl restart grafana-serv…

本地启动 Falcon-180B

本地启动 Falcon-180B 通过 Gradio 的 load 函数&#xff0c;我们可以在本地加载 HuggingFace 的 Spaces 上面的 demo。 那就运行 Falcon-180B 来试试吧。 创建 falcon_demo.py 文件&#xff0c; cat << EOF > falcon_demo.py import gradio as grdemo gr.load(&q…

亚马逊云科技与德勤中国推出新工具,有效缓解生成式AI时代下的安全问题

随着人工智能技术的飞速发展&#xff0c;生成式AI应用越发广泛&#xff0c;在各领域迎来了新的机遇&#xff0c;但同时也在安全层面给企业带来了新的挑战。网络攻击、数据泄露、隐私侵犯等安全威胁&#xff0c;以及法律法规的不断更新&#xff0c;使跨区域运营过程中的网络安全…

Apipost:API开发者的协同工作神器

在当今快速发展的数字化时代&#xff0c;API已成为企业与开发者实现数据互通、应用集成的重要桥梁。然而&#xff0c;随着API数量的不断增加&#xff0c;API开发、调试、测试、文档等工作也变得越来越复杂。为了解决这一痛点&#xff0c;一款名为Apipost的API协同研发工具应运而…

【业务功能篇106】 微服务-springcloud-springboot-电商订单模块--秒杀服务-定时任务【下篇】

四、秒杀活动 1.秒杀活动关注点 秒杀活动的最大特点就是高并发而且是短时间内的高并发&#xff0c;那么对我们的服务要求就非常高&#xff0c;针对这种情况所产生的共性问题&#xff0c;对应的解决方案&#xff1a; 2. 秒杀服务前端 当我们点击 秒杀抢购按钮后&#xff0c;对应…

单片机C语言实例:6、定时器的应用

定时器原理 1、什么是定时器&#xff1f;什么是计数器&#xff1f; 定时器&#xff0c;字面意思就是定时的。手机的闹钟就是个定时器&#xff0c;定个每天早上7点的闹钟。 计数器&#xff0c;字面意思计时统计个数的&#xff0c;来一个就加一个&#xff0c;一直累加着。 其实…

什么是Docker和Docker-Compose?

Docker的构成 Docker仓库&#xff1a;https://hub.docker.com Docker自身组件 Docker Client&#xff1a;Docker的客户端 Docker Server&#xff1a;Docker daemon的主要组成部分&#xff0c;接受用户通过Docker Client发出的请求&#xff0c;并按照相应的路由规则实现路由分发…

@ApiImplicitParams这个注解的作用

ApiImplicitParams这个注解的作用&#xff1f; ApiImplicitParams是一个用于描述方法参数的注解&#xff0c;它可以用在方法上&#xff0c;作用是为方法中的参数定义多个注解&#xff0c;并将这些注解集中到一个注解集中进行统一管理。通过ApiImplicitParams注解&#xff0c;我…