共同点

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

当表达式都为 false 时,都不会占据页面位置
当表达式结果为 true 时,都会占据页面的位置

区别

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

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

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

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

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

v-if 由 false 变为 true 的时候,触发组件的beforeCreate、create、beforeMount、mounted钩子,由true变为false的时候触发组件的beforeDestory、destoryed方法。


vue3 中组合式 API 生命周期钩子


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

原理

解析过程大致为:

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

v-show 原理

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

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

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

export const vShow: ObjectDirective<VShowElement> = {beforeMount(el, { value }, { transition }) {el._vod = el.style.display === 'none' ? '' : el.style.displayif (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

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-if 与 v-show 都能控制dom元素在页面的显示

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

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

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

v-if 和 v-show 的区别相关推荐

  1. 抖音蓝V如何认证,蓝V号与普通号的区别?

    抖音蓝V如何认证,蓝V号与普通号的区别? 先说说抖音蓝V号和普通号的区别,两者之间最大的区别就是:抖音蓝V比普通号拥有更多的商业功能特权,更具有商业价值. 抖音蓝V有哪些功能特权呢? 1.外观功能 ( ...

  2. v$sql和v$sqlarea的区别

    v$sql: 共享池库缓存中在子指针级别上的SQL统计信息,包含了所有用户执行过的所有SQL信息.不同用户.不同会话执行相同的SQL的语义.执行计划可能会不同,这些SQL的字面值相同,即具有相同的sq ...

  3. FFmpeg笔记--vcodec和-c:v,-acodec和-c:a的区别?

    在看ffmpeg命令的时候经常会看到有些地方使用--vcodec指定视频解码器,而有些地方使用-c:v指定视频解码器,那这两个有没有区别呢? ffmpeg的官方文档: -vcodec codec (o ...

  4. vscode 终端 进入node_安装了Node.js 从VScode 使用node -v 和 npm -v等命令却无效

    前言 最近写TypeScript需要安装.配置Node.js环境,楼主是使用的安装包所以环境变量都是自动就配好了(如果是下载的zip压缩包解压后要自己配置到系统环境变量中).打开系统终端敲入命令 no ...

  5. POJ2762 Going from u to v or from v to u? 强连通+缩点

    题目链接: poj2762 题意: 给出一幅单向图.问这张图是否满足   随意两点ab 都能 从a到达b 或  从b到达a 题解思路: 推断一幅图是否满足弱连通 首先想到的是将图中的 强连通分量(能互 ...

  6. 事务的四大特性、事务处理开始与结束、v$transactio、 v$LOCK

    数据库事务的四大特性:ACID 事务的4大特性(ACID): 原子性(Atomicity):事务是数据库的逻辑工作单位,它对数据库的修改要么全部执行,要么全部不执行.一致性(Consistemcy): ...

  7. poj Going from u to v or from v to u? 强联通缩点+拓扑排序(或搜索)

    方法一 #include <stdio.h> #include <string.h> #include <iostream> #include <algori ...

  8. 【POJ - 2762】Going from u to v or from v to u?(Tarjan缩点,树形dp 或 拓扑排序,欧拉图相关)

    题干: In order to make their sons brave, Jiajia and Wind take them to a big cave. The cave has n rooms ...

  9. v$sql、v$sqlarea 、v$sqltext

    分享: ------------------------------- v$sql.v$sqlarea .v$sqltext 这三个视图都可以用于查询共享池中已经解析过的SQL语句及其相关信息. V$ ...

  10. 安装了Node.js 从VScode 使用node -v 和 npm -v等命令却无效

    前言 最近写TypeScript需要安装.配置Node.js环境,楼主是使用的安装包所以环境变量都是自动就配好了(如果是下载的zip压缩包解压后要自己配置到系统环境变量中).打开系统终端敲入命令 no ...

最新文章

  1. jmeter定时器的使用_jmeter压测学习30定时器之固定定时器(sleep等待时间)
  2. 【spring boot】url中传递session id
  3. linux课程_linux系统使用课程更新提示
  4. 音视频技术开发周刊 | 197
  5. 未来PCB行业互联网+发展趋势
  6. 局域网共享工具_win10一键局域网共享工具使用教程
  7. 微信小程序如何跳转视频号直播间
  8. 安全中心服务器已关闭啥意思,启用windows安全中心服务是什么意思,windows安全中心服务关闭方法...
  9. java while循环 计算机,Java while和do ... while循环 - 芒果文档
  10. 三国演义亲和度python_python爬取三国演义文本
  11. 通过Python爬虫技术获取小说信息
  12. android底层优化什么意思,华为所谓的“优化”到底是什么意思 看完这段你就明白...
  13. 开发版linux随身wifi,让linux下无线网卡变身随身wifi
  14. 10019---Linux查看CPU、内存、硬盘、版本信息
  15. What Would Warren Do?
  16. Linux Update
  17. ARMv7中 KVM对虚拟化的实现(中篇)
  18. Android 高清加载长图或大图方案
  19. 使用Octomap生成二维占据栅格导航地图
  20. 常用十大电子元器件有哪些?新手必读!

热门文章

  1. 人生是一个长期的均值回归
  2. Swift 高德地图自定义大头针自定义气泡
  3. java字节流——把两个视频文件合并成一个,输出为一个新文件
  4. 当LCD也能屏下指纹时,你还会选择OLED吗?永不为奴的LCD
  5. C盘内存不够了,如何将D盘多余的空间分配给C盘
  6. 用python画月亮怎么画_用python画月亮的代码是什么?_后端开发
  7. 公众号迁移公证怎么做,主体变更需要哪些资料?
  8. linux查看运行端口,Linux查看端口使用状态及启动
  9. Pyqt4 vnpy源码中关于GUI设计 2
  10. ctfshow简单密码题