Vue.js 条件渲染全解析

2023-11-08

注意标题是条件渲染而不是条件判断。Vue给v-if这类条件判断属性取名叫条件渲染。这些属性的目的是判断要不要渲染这些元素,而不仅仅是所谓的判断,是否渲染才是最主要的功能。

v-if的使用

例如下面的代码,span里面可以显示message的信息,但是我们添加了一个v-if属性并且设置值为false,这样message就不显示了。如果设置为true,就又显示了。

注意,如果为false,那么span元素根本就不会添加到dom里面。并不是简单的隐藏。

<div id="box">
     <span v-if="false">{{message}}</span>
</div>
<script type="text/javascript">
    var app = new Vue({
        el: "#box",
        data: {
            message:"hello"
        },
        methods: {}
    })
</script>

当然直接写值不太好,我们可以在data里面定义变量来控制,v-if的值。

<div id="box">
     <span v-if="isShow">{{message}}</span>
</div>
<script type="text/javascript">
    var app = new Vue({
        el: "#box",
        data: {
            message:"hello",
            isShow:true
        },
        methods: {}
    })
</script>

v-else的使用

v-else可以配合v-if使用。实现的效果是两者只会渲染其中一个,也就是只有一个显示会添加到dom中。

<div id="box">
     <span v-if="isShow">{{message}}</span>
     <span v-else>This is new message</span>
</div>
<script type="text/javascript">
    var app = new Vue({
        el: "#box",
        data: {
            message:"hello",
            isShow:false
        },
        methods: {

        }
    })
</script>

v-if和v-else只能使用在同级元素上,也就是兄弟元素上。如果写成下面这种样子,会直接报错。v-else找不到配对的if。

<div id="box">
      <div v-if="isShow">
          <span>1</span>
          <span>2</span>
          <span v-else>3</span>
      </div>
</div>
<script type="text/javascript">
    var app = new Vue({
        el: "#box",
        data: {
            message:"hello",
            isShow:false
        },
        methods: {

        }
    })
</script>

当内容比较多的时候,可以外层包裹一个div,然后把条件渲染写在这个div上面。这个div是多余的,有时候可能正好有一个外层div给你用,没有是话,只能自己凭空添加一个。在Vue2只能这样做。到Vue3的时候,提供了template元素来解决这个问题。

<div v-if="true">
     <p>welcome!</>
     <span >{{message}}</span>
</div>
<div v-else>
     <p>welcome!</>
     <span >没有消息</span>
</div>

template元素的使用

template元素是vue3才有的新功能。目的就是为了解决条件渲染的时候有时候需要凭空给外层套一个div的问题。template元素在dom渲染的时候,不会生成任何元素,起到和div一样的作用,但没有添加新元素而影响性能。

<template v-if="true">
     <p>welcome!</>
     <span >{{message}}</span>
</template >
<template v-else>
     <p>welcome!</>
     <span >没有消息</span>
</template >

v-else-if的使用

最经典的例子,没什么好说的。一般是不会这样写的,因为非常的麻烦,所以这个属性是非常少用的,写成这样还不如在函数里面写。

<div id="box">
      <div v-if="isShow">
          <span v-if="score>=90">优秀</span>
          <span v-else-if="score>=80">良好</span>
          <span v-else-if="score>=60">及格</span>
          <span v-else>不及格</span>
      </div>
</div>
<script type="text/javascript">
    var app = new Vue({
        el: "#box",
        data: {
            message:"hello",
            isShow:true,
            score:90
        },
        methods: {

        }
    })
</script>

登录切换的小案例

没什么好说的,非常的简单。存在的问题是,每次切换后,原来的内容消失了。

<div id="box">
      <span v-if="useName">
          <label for="username">用户名</label><input type="text" id="username" placeholder="输入用户名"/>
      </span>
    <span v-else>
          <label for="mail">邮箱</label><input type="text" id="mail" placeholder="输入邮箱"/>
    </span>
      <button @click="useName=!useName">切换类型</button>
</div>
<script type="text/javascript">
    var app = new Vue({
        el: "#box",
        data: {
            useName:true
        },
        methods: {
        }
    })
</script>

切换登录存在的问题

如果你在输入框输入内容123,点击切换按钮,你会发现原来的内容123还是存在的。这是vue的复用优化导致的。
因为这两个input按钮功能是类似的,vue并不是直接显示这两个input。如果你打开控制台,你会发现,第二个input根本就没有显示,而是直接修改第一个input来实现的。这是vue出于复用考虑而进行的优化。这是很合理的。
但是,问题怎么解决呢?vue为我们提供了key属性,你可以为两个input设置不同的key,这样vue发现key不同,就不会给我们自动复用了。

<div id="box">
      <span v-if="useName">
          <label for="username">用户名</label>
          <input type="text" id="username" placeholder="输入用户名" key="username"/>
      </span>
    <span v-else>
          <label for="mail">邮箱</label>
        <input type="text" id="mail" placeholder="输入邮箱" key="mail"/>
    </span>
      <button @click="useName=!useName">切换类型</button>
</div>

v-show

v-show和v-if实现的效果都是一样的,唯一的区别的就是v-show是通过设置display:none来实现不显示的,而v-if为false的时候,元素根本就没有添加到dom里面。
v-show适合那种需要频繁显示隐藏的场合。
v-if因为会频繁添加删除元素,开销比较大。但因为元素可能被删除或者没渲染,内存占用少。
如果需要频繁切换,则使用 v-show 较好;如果在运行时绑定条件很少改变,则 v-if 会更合适。

v-show 不支持在 元素上使用,也不能和 v-else 搭配使用。

<body>
<div id="box">
       <span v-if="isShow" id="aaa">{{message}}</span>
       <span v-show="isShow" id="bbb">{{message}}</span>
</div>
<script type="text/javascript">
    var app = new Vue({
        el: "#box",
        data: {
            message: "hello",
            isShow:false
        },
        methods: {}
    })
</script>

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Vue.js 条件渲染全解析 的相关文章

随机推荐

  • Ubuntu PCL安装过程之中遇见到问题

    详细的PCL安装过程在之前的文章之中有过记录 但是我一直忽略了一个问题 导致安装过程之中一直出现问题 在编译PCL 源码的过程如下 cd pcl mkdir build cd build cmake D CMAKE BUILD TYPE N
  • 【C++学习笔记(二十一)】之基类,子类的类型转换

    本文章由公号 开发小鸽 发布 欢迎关注 老规矩 妹妹镇楼 一 普通基类 子类的转换 子类是由继承于基类 通常子类的内容要比基类多一些 因此子类开辟的内存要比基类大一些 一 基类 gt 子类 向下类型转换 当我们要把基类强转为子类时 由于子类
  • 帕斯卡三角形

    题目链接 int generate int numRows int returnSize int returnColumnSizes int ans malloc sizeof int numRows 开辟一块内存空间 用来返回ans 大小
  • ShapeDTW代码运行问题记录与解决方法

    下载shapeDTW的GitHub代码运行 测试 源码是MATLAB写的 需要保证电脑安装MATLAB 然后根据readme txt文件提示 第一步下载UCR数据集 http www cs ucr edu eamonn time serie
  • 实现哈夫曼树和哈夫曼编码

    原谅小编做了只鸽子 鸽了这么久 哈夫曼树在日常生活中可以用于文件的压缩 所以是我们程序员必不可少的基本功 下面跟着小编我一起来实现哈夫曼树和编码吧 一 哈夫曼树的实现 一 实现原理 哈夫曼树是一种特殊的二叉树 我们先假设有一个森林 里面是一
  • 捡硬币问题 动态规划算法C语言实现

    问题描述 现有n个硬币按顺序依次排列在你面前 它们的面值可以看作一个数组coins 5 1 2 10 6 2 请在此中选取若干个硬币 使得所取硬币面值总和最大 捡取个数不限 但相邻的硬币不能捡取 请设计相应算法 要求能够输出累加值和选取的硬
  • React的生命周期 和 页面优化

    React的生命周期 和 页面优化 先上React的生命周期图 页面优化问题在 shouldComponentUpdate 函数那里写的 有颜色备注 React声明周期的四个大阶段 Initialization 初始化阶段 Mounting
  • springmvc上传文件的三种方式

    方式一 通过流的方式上传文件 RequestParam file 将name file控件得到的文件封装成CommonsMultipartFile 对象 RequestMapping fileUpload public String fil
  • 如何在csdn转载文章

    Question 如何在CSDN中快速转载文章 Solution 1 在CSDN中找到想要转载的文章 右击点击 检查 或者快捷键F12 出现以下界面 图下图右侧所示 2 按住Ctrl F快捷键 在弹出的搜索框中寻找 article cont
  • 整理注解使用

    常用注解 三个标注注解 Override 检查该方法是否是重写方法 如果发现其父类 或者是引用的接口中并没有该方法时 会报编译错误 Deprecated 标记过时方法 如果使用该方法 会报编译警告 SuppressWarnings 指示编译
  • Mybatis执行流程剖析

    这里写自定义目录标题 一 流程 从项目中看流程 一 流程 Resource获取加载全局配置文件 如图 引入properties文件和连接数据库等配置都在xml中 实例化SqlSessionFactoryBuider构造器 SqlSessio
  • 解决Oracle数据库ORA-01157: cannot identify/lock data file 10 - see DBWR trace file ORA-01110: data file 1

    解决Oracle数据库启动报错ORA 01157 cannot identify lock data file 10 see DBWR trace file ORA 01110 data file 10 u01 app oracle ora
  • 蓝桥杯-时间显示(java)

    问题描述 小蓝要和朋友合作开发一个时间显示的网站 在服务器上 朋友已经获取了当前的时间 用一个整数表示 值为从1970年1月1日O0 00 00到当前时刻经过的毫秒数 现在 小蓝要在客户端显示出这个时间 小蓝不用显示出年月日 只需要显示出时
  • es ik 词库添加词语_五、IK自定义词库及远程热更新

    IKAnalyzer cfg xml为IK分词器的配置文件 一 IKAnalyzer cfg xml文件分析properties SYSTEM http java sun com dtd properties dtd gt IK Analy
  • 本周参加两个SAP项目面试后的感想

    本周参加两个SAP项目面试后的感想 本周二和周四 应约参加了2个不同项目的电话面试 感触挺多的 1 行业经验在很多项目选人的时候具有关键性的决定作用 A项目 是一个快消品行业的大项目 客户是世界跨国巨头 听对方介绍起来该项目规模庞大 极其复
  • JS多个对象添加到一个对象中

    var obj1 qq 10 var obj2 mm 2 nn 3 var obj3 xx 1 yy 5 obj1 field1 obj2 obj1 field2 obj3 console log obj1 转载于 https www cn
  • linux系统查看文件大小及使用空间大小

    1 查看 data test文件夹下所有文件大小之和命令 du h max depth 1 data test 2 查看 data test文件夹下所有文件大小明细 每个文件大小 命令 du h max depth 1 data test
  • 四路服务器选型项目,四路服务器详细

    四路服务器详细 内容精选 换一换 在待分析的服务器上安装节点 Web服务器 即安装鲲鹏性能分析工具的服务器 默认安装了节点 如果待分析的服务器与安装工具的服务器是同一个 请跳过该章节 已成功登录系统性能分析 待添加节点的服务器已配置操作系统
  • 17款最佳的代码审查工具

    好的代码审查器可以大大地帮助程序员提高代码质量 减少错误几率 虽然现在市场上有许多可用的代码审查工具 但如何挑选也是一个艰巨的任务 在咨询过有关专家的建议和意见之后 我们罗列出了以下17款最佳的代码审查工具 1 CodeStriker Co
  • Vue.js 条件渲染全解析

    注意标题是条件渲染而不是条件判断 Vue给v if这类条件判断属性取名叫条件渲染 这些属性的目的是判断要不要渲染这些元素 而不仅仅是所谓的判断 是否渲染才是最主要的功能 v if的使用 例如下面的代码 span里面可以显示message的信