Vue中的 v-show 和 v-if 的区别

news2025/2/3 3:04:24

一、v-show与v-if的共同点

我们都知道在 vue 中 v-show 与 v-if 的作用效果是相同的(不含v-else),都能控制元素在页面是否显示

在用法上也是相同的

<Model v-show="isShow" />
<Model v-if="isShow" />
  • 当表达式为true的时候,都会占据页面的位置
  • 当表达式都为false时,都不会占据页面位置

二、v-show与v-if的区别

  • 控制手段不同
  • 编译过程不同
  • 编译条件不同

控制手段v-show隐藏则是为该元素添加css--display:nonedom元素依旧还在。v-if显示隐藏是将dom元素整个添加或删除

编译过程v-if切换有一个局部编译/卸载的过程,切换过程中合适地销毁和重建内部的事件监听和子组件;v-show只是简单的基于css切换

编译条件v-if是真正的条件渲染,它会确保在切换过程中条件块内的事件监听器和子组件适当地被销毁和重建。只有渲染条件为假时,并不做操作,直到为真才渲染

  • v-show 由false变为true的时候不会触发组件的生命周期

  • v-iffalse变为true的时候,触发组件的beforeCreatecreatebeforeMountmounted钩子,由true变为false的时候触发组件的beforeDestorydestoryed方法

性能消耗v-if有更高的切换消耗;v-show有更高的初始渲染消耗;

三、v-show与v-if原理分析

具体解析流程这里不展开讲,大致流程如下

  • 将模板template转为ast结构的JS对象
  • ast得到的JS对象拼装renderstaticRenderFns函数
  • renderstaticRenderFns函数被调用后生成虚拟VNODE节点,该节点包含创建DOM节点所需信息
  • vm.patch函数通过虚拟DOM算法利用VNODE节点创建真实DOM节点

v-show原理

不管初始条件是什么,元素总是会被渲染

我们看一下在vue中是如何实现的

代码很好理解,有transition就执行transition,没有就直接设置display属性

 

// https://github.com/vuejs/vue-next/blob/3cd30c5245da0733f9eb6f29d220f39c46518162/packages/runtime-dom/src/directives/vShow.ts
export const vShow: ObjectDirective<VShowElement> = {
  beforeMount(el, { value }, { transition }) {
    el._vod = el.style.display === 'none' ? '' : el.style.display
    if (transition && value) {
      transition.beforeEnter(el)
    } else {
      setDisplay(el, value)
    }
  },
  mounted(el, { value }, { transition }) {
    if (transition && value) {
      transition.enter(el)
    }
  },
  updated(el, { value, oldValue }, { transition }) {
    // ...
  },
  beforeUnmount(el, { value }) {
    setDisplay(el, value)
  }
}

v-if原理

v-if在实现上比v-show要复杂的多,因为还有else else-if 等条件需要处理,这里我们也只摘抄源码中处理 v-if 的一小部分

返回一个node节点,render函数通过表达式的值来决定是否生成DOM

// https://github.com/vuejs/vue-next/blob/cdc9f336fd/packages/compiler-core/src/transforms/vIf.ts
export const transformIf = createStructuralDirectiveTransform(
  /^(if|else|else-if)$/,
  (node, dir, context) => {
    return processIf(node, dir, context, (ifNode, branch, isRoot) => {
      // ...
      return () => {
        if (isRoot) {
          ifNode.codegenNode = createCodegenNodeForBranch(
            branch,
            key,
            context
          ) as IfConditionalExpression
        } else {
          // attach this branch's codegen node to the v-if root.
          const parentCondition = getParentCondition(ifNode.codegenNode!)
          parentCondition.alternate = createCodegenNodeForBranch(
            branch,
            key + ifNode.branches.length - 1,
            context
          )
        }
      }
    })
  }
)

四、v-show与v-if的使用场景

v-if 与 v-show 都能控制dom元素在页面的显示

v-if 相比 v-show 开销更大的(直接操作dom节点增加与删除)

如果需要非常频繁地切换,则使用 v-show 较好

如果在运行时条件很少改变,则使用 v-if 较好

 

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

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

相关文章

【微信小程序】webview使用、限制、扩展说明

0 说明 只是一些我自己常见的用法的整理和说明 更多用法还是请看官方文档&#xff1a;web-view 1 小程序web-view支持的页面 1、关联公众号的文章页【活动、文章、引导关注】 2、服务器配置了微信安全校验文件的网页【需要放置在域名根目录下】 2 小程序web-view不支持的页面…

Maxtang大唐英特尔12代J6412无风扇双网口迷你主机真实评测

今天为大家评测一款无风扇的双网口迷你主机&#xff0c;这款主机来自于maxtang大唐采用了英特尔12代赛扬J6412处理器&#xff0c;产品最出彩的地方就是它的网络配置&#xff0c;不仅拥有双千兆网口&#xff0c;还搭载了SIM卡插槽&#xff0c;并支持4G上网。评测产品配置如下&am…

蓝桥杯-玩具蛇

没有白走的路&#xff0c;每一步都算数&#x1f388;&#x1f388;&#x1f388; 题目描述&#xff1a; 已知一个4x4的方格&#xff0c;和一个16个单位长度组成的玩具蛇&#xff0c;即蛇头&#xff0c;蛇身&#xff0c;蛇尾的长度总共是16&#xff0c; 假设蛇的一节在方格中的…

Linux安装JDK8详细步骤

目录 1.虚拟机开启后&#xff0c;在/opt目录下新建文件夹 2.将JDK8压缩包传入/opt/install文件夹中 3. 解压JDK8到/opt/soft目录下 4.更改文件名 5.配置环境变量 6.检查JDK8是否安装成功 1.虚拟机开启后&#xff0c;在/opt目录下新建文件夹 2.将JDK8压缩包传入/opt/insta…

关于【继承】这些你都了解吗?

致前行的人&#xff1a; 要努力&#xff0c;但不要着急&#xff0c;繁花锦簇&#xff0c;硕果累累&#xff0c;都需要过程&#xff01; 目录 1.继承的概念和定义 1.1继承的概念 1.2继承的定义 2.基类和派生类对象赋值转换 3.继承中的作用域 4.派生类的默认成员函数 5.继承与友元…

企业微信开发(五)群活码

企业微信API&#xff0c;提供一个群活码的功能&#xff0c;好友可以通过扫码直接进群&#xff0c;非好友关系也可以。群活码的性质&#xff0c;在群满200人后自动创建新的群&#xff0c;把后面扫码的人添加进去&#xff0c;但是该活码只能放5个群&#xff0c;企业微信API&#…

【电子学会】2022年09月图形化三级 -- 加法出题器

加法出题器 编写程序出10道40以内的加法题&#xff0c;两个加数为20以内的正整数&#xff0c;程序最后提示回答正确的数量。 1. 准备工作 &#xff08;1&#xff09;默认小猫角色&#xff0c;默认白色背景。 2. 功能实现 &#xff08;1&#xff09;点击绿旗后&#xff0c;角…

安装openGauss

一、准备软硬件环境1.新建用户组、用户groupadd dbgroupuseradd -g dbgroup smispasswd smis新密码&#xff1a;smis1qazxc2.创建文件夹mkdir -p /opt/software/openGausschown 755 -R /opt/softwarechown -R smis /opt/software/openGauss3.下载安装包下载地址&#xff1a;htt…

Python爬虫之Scrapy框架系列(12)——实战ZH小说的爬取来深入学习CrawlSpider

目录&#xff1a;1. CrawlSpider的引入&#xff1a;&#xff08;1&#xff09;首先&#xff1a;观察之前创建spider爬虫文件时&#xff08;2&#xff09;然后&#xff1a;通过命令scrapy genspider获取帮助&#xff1a;&#xff08;3&#xff09;最后&#xff1a;使用模板crawl…

从电影《流浪地球2》,看东西方价值观,中华文化五千年有原因的

说起今年的春节档电影&#xff0c;很多人都会想起《满江红》&#xff0c;因为这部由张艺谋导演的电影&#xff0c;票房一直在屡创新高。其实观众关注《满江红》的同时&#xff0c;也不要忘了另一部电影&#xff0c;贺岁片《流浪地球2》同样不可小觑。 一直以来&#xff0c;科幻…

【小程序】报错:no such file or directory, access ‘wxfile://usr/miniprogramLog/log2‘

出现场景 在微信小程序开发中&#xff0c;使用真机调试的时候&#xff0c;出现这个错误 解决方式 将真机调试由2.0切换到1.0

37. 实战:Xpath+线程池实现抓取任意完整小说一千余节到本地txt文件/模板任意小说网站可套用(附源码)

目录 前言 目的 思路 代码实现 1. 从给定的URL中拿到所有章节的标题和子链接 2. 将标题和子链接形成一个字典&#xff0c;便于后续提取信息 3. 实现在单个章节详细页面提取所有文本信息 4. 保存到本地文件&#xff0c;在前面加上数字序号便于顺序保存 5. 在主函数中添…

STL使用方法(C++)

目录 1 前言 2 迭代器 2.1 访问第一个元素 2.2 访问最后一个元素的下一个元素 2.3 遍历方法 2.3.1 while 2.3.2 for&#xff08;最常用&#xff09; 2.4 适用性 3 基本数据结构 3.1 vector&#xff08;动态数组&#xff09; 3.1.1 insert&#xff08;插入…

最全面的SpringBoot教程(一)——SpringBoot概述

前言 本文为 【SpringBoot教程】SpringBoot概述 相关知识&#xff0c;下边将对SpringBoot简介&#xff08;包括&#xff1a;什么是SpringBoot&#xff0c;SpringBoot的特点&#xff0c;SpringBoot的功能&#xff0c;SpringBoot官网&#xff09;&#xff0c;SpringBoot快速入门&…

JAVA 同步锁

文章目录synchronizedsynchronized 作用当前对象synchronized 作用订单号条件synchronized 作用订单号字符串条件ReentrantLock 加 ConcurrentHashMap需求&#xff1a; 同一个订单才加同步锁&#xff0c;不同订单可并行synchronized synchronized是Java中的关键字&#xff0c;…

python--飞机大战(课程设计)

实现功能&#xff1a; 1&#xff1a;飞机的移动&#xff0c;发射子弹&#xff0c;手雷&#xff0c;生命值&#xff0c;生命条 2&#xff1a;敌飞机有3种形态&#xff08;小&#xff0c;中&#xff0c;大&#xff09;不同的飞机大小不一样&#xff0c;生命值不一样&#xff0c…

【halcon学习-读图像和遍历文件下图像】

halcon学习-读图像和遍历文件下图像1.读取单张图像2.读取多张选定图片3.读取文件目录下所有的图片1.读取单张图像 与很多图像处理读图算子一样&#xff0c;halcon里读取单张图片的操作很简单&#xff1a; read_image(test1, D:/myfile/作业/拉链检测/chain1.bmp)也可以使用Ct…

【数据结构与算法】LRU Cache

&#x1f320;作者&#xff1a;阿亮joy. &#x1f386;专栏&#xff1a;《数据结构与算法要啸着学》 &#x1f387;座右铭&#xff1a;每个优秀的人都有一段沉默的时光&#xff0c;那段时光是付出了很多努力却得不到结果的日子&#xff0c;我们把它叫做扎根 目录&#x1f449;…

2023年房地产融资模式研究报告

第一章 概况 融资&#xff0c;英文为 Financing&#xff0c;指为支付超过现金或转账的购货款而采取的货币交易手段&#xff0c;或者为取得特定资产而筹集资金所采取的货币手段。融资通常指货币资金的特有者和需求者之间&#xff0c;直接或间接地进行资金融通的活动。 广义的融…

【操作系统】多线程与多进程通信之深入理解【2023.01.31】

基本概念 首先&#xff0c;假设这么一个场景&#xff0c;进程A有线程Thread_A1和线程Thread_A2&#xff0c;进程B有线程Thread_B1和Thread_B2。举个例子&#xff0c;系统中进程的内存是独立的&#xff0c;也就是一台内存为4G的计算机&#xff0c;除了系统占用的1G部分&#xf…