SSF0SSF0
首页
前端
  • Node
  • Go
  • C#
  • MySql
  • Bash
  • Git
  • Docker
  • VuePress
  • CI/CD
  • 服务器
  • 网站
  • 学习资料
  • 软件
Timeline
Github
标签
分类
首页
前端
  • Node
  • Go
  • C#
  • MySql
  • Bash
  • Git
  • Docker
  • VuePress
  • CI/CD
  • 服务器
  • 网站
  • 学习资料
  • 软件
Timeline
Github
标签
分类
  • HTML

    • html1
    • html2
  • CSS

    • Flex 布局常见问题与解决方案
  • JavaScript

    • 数据类型及引用问题
    • 处理 Blob 类型文件下载问题总结
    • localStorage 与 sessionStorage 区别
    • JavaScript 中的 script 标签问题详解
    • JavaScript 中的`this`指向问题详解
    • SessionStorage踩坑记录:它真的能"只设置一次"吗?
    • 动态加载 JS 脚本方法对比
    • 浏览器页面关闭场景下的数据上报
  • es6

    • Promise
    • es6 模块导出方式全解析
  • Vue2

    • created VS mounted 发起异步请求
    • vue2-2
  • Vue3

    • Vite + Vue3 修改 element-plus 源码
    • Vue v-if 与 v-show
    • Vue3 ref 获取组件
    • Vue3 路由传参
    • 父子组件与组件里 Hooks 加载顺序
    • 第三方组件传入参数TS提示
    • Vue3 Props 在 Hooks 中的响应性处理
    • Vue Router 的两种历史模式及部署配置详解
    • 在Vue 3项目中顺利集成Tailwind CSS的完整指南
    • Vue 3 深度选择器:deep()完全指南
  • Electron

    • 快速构建 electron + vue3 项目
  • TS

    • TS 泛型
    • 记录模板使用断言的问题
    • type 与 interface
  • WebPack

    • Webpack 介绍
  • Vite

    • Vite CLI 常见命令
    • vite 与 webpack 比较
  • 项目工程

    • 前端代码风格
    • Vue3 项目规范
    • npm 镜像问题
    • 包管理工具
    • 使用 engines 限制开发环境依赖
    • 打包与shell交互指定模式
    • 使用 pnpm 构建 Monorepo 实战指南
    • pnpm 修改依赖源码打包报错
  • 记录一下小程序
  • 控制浏览器正确保存网站账号密码的技巧

Vue v-if 与 v-show

v-if 与 v-show 的区别

v-if

优点:

  1. 性能开销低:在初始渲染时,如果条件为 false,则不会渲染对应的 DOM 元素和组件。

  2. 适用于条件变化不频繁的场景:因为组件和 DOM 元素会被销毁和重新创建,所以适合条件变化不频繁的场景。

缺点:

  1. 重新渲染开销大:每次条件变化导致组件销毁和重新创建时,会有较大的性能开销,尤其是组件复杂或包含大量子组件时。

  2. 状态丢失:组件被销毁后,其内部状态会丢失。

使用场景

  • 条件变化不频繁的场景。

  • 需要在条件变化时完全销毁和重新创建组件的场景。

  • 需要节省初始渲染开销的场景。

v-show

优点:

  1. 切换开销低:只是通过 CSS 切换 display 属性来控制显示和隐藏,不会销毁和重新创建组件。
  2. 状态保留:组件状态不会因为显示和隐藏而丢失。

缺点:

  1. 初始渲染开销大:即使条件为 false,组件和 DOM 元素也会被渲染,只是被隐藏。

  2. 适用于条件变化频繁的场景:因为切换显示和隐藏的开销较低,所以适合条件变化频繁的场景。

使用场景

  • 条件变化频繁的场景。

  • 需要保留组件状态的场景。

  • 组件初始渲染开销可以接受的场景。

碰到实际场景

<!-- 使用v-if -->
<template v-for="widget in item.childList" :key="widget.key">
  <div v-if="widget.key == getWidgetKey()">
    <!-- <KeepAlive>  这里使用缓存组件已经失效了,上面的v-if会把里面的整体重新渲染 -->
    <component :is="widgetConfigComponents[widget.type]" />
    <!-- </KeepAlive> -->
  </div>
</template>

<!-- 使用v-show -->
<template v-for="widget in item.childList" :key="widget.key">
  <div v-show="widget.key == getWidgetKey()">
    <component :is="widgetConfigComponents[widget.type]" />
  </div>
</template>
  • 上述代码中遍历了 item.childList,根据 widget.key 判断是否显示组件,如果 widget.key 与 getWidgetKey() 相等,则显示组件,否则隐藏组件。

  • 这时候使用 v-show 就全部渲染了如果很多就不好了, 但是使用 v-if 又经常切换导致切换一次重新渲染一次。

总结

  • v-if:适用于条件变化不频繁且初始渲染开销较大的场景。适合需要完全销毁和重新创建组件的情况。

  • v-show:适用于条件变化频繁且需要保留组件状态的场景。适合切换显示和隐藏的开销较低的情况。

选择指南:

  • 如果你的组件在条件变化时需要频繁切换显示状态,并且你希望保留组件的状态,使用 v-show。

  • 如果你的组件在条件变化时不需要频繁切换,并且你希望在条件为 false 时完全销毁组件以节省内存,使用 v-if。

最后更新时间:
贡献者: 何风顺
上一页
Vite + Vue3 修改 element-plus 源码
下一页
Vue3 ref 获取组件