七、vue-基础之条件渲染

news2024/11/25 13:14:47

一、条件渲染

在某些情况下,我们需要根据当前的条件决定某些元素或者组件是否渲染,这个时候我们就需要进行条件判断了。

Vue提供了下面的指令来进行条件判断:

  • v-if
  • v-else
  • v-else-if
  • v-show

(1)需求demo体验 

 我们直接来个demo~将names数组里的数据分别展示出来。

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <div id="app">
      <ul>
        <li v-for="item in names">{{ item }}</li>
      </ul>
    </div>
    <script src="../lib/vue.js"></script>

    <script>
      const app = Vue.createApp({
        // data: option api
        data: function () {
          return {
            names: ["abc", "cba", "nba"],
          }
        },
      })

      app.mount("#app")
    </script>
  </body>
</html>

页面展示: 

那此时我们再补一个需求,希望names有数据的时候展示上面部分,names无数据的时候展示下面h2元素。

 我们直接上代码~ 很好理解吧。

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <!-- 模板语法里面 -->
    <div id="app">
      <ul v-if="names.length > 0">
        <li v-for="item in names">{{ item }}</li>
      </ul>

      <h2 v-else>当前names没有数据,请求获取数据后展示</h2>
    </div>
    <script src="../lib/vue.js"></script>

    <script>
      const app = Vue.createApp({
        // data: option api
        data: function () {
          return {
            names: ["abc", "cba", "nba"],
          }
        },
      })

      app.mount("#app")
    </script>
  </body>
</html>

 (2)v-if

我们来个栗子🌰~

如果info没有值,就不展示那一栏。否则前端只展示姓名: 年龄:是不是不友好。

有伙伴说简单,直接像下面这样子写:

很明显是不行的,如果info是{},空对象布尔值还是true,所以不能这么写。 

那该怎么去写呢?

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <div id="app">
      <!-- v-if="条件" -->
      <div class="info" v-if="Object.keys(info).length">
        <h2>个人信息</h2>
        <ul>
          <li>姓名: {{ info.name }}</li>
          <li>年龄: {{ info.age }}</li>
        </ul>
      </div>
    </div>
    <script src="../lib/vue.js"></script>

    <script>
      const app = Vue.createApp({
        // data: option api
        data() {
          return {
            info: { name: "daxia", age: 18 },
          }
        },
      })

      app.mount("#app")
    </script>
  </body>
</html>

 有小伙伴也提出来了,如果info对象里面只有name 没有age呢?那前端页面是不是也不应该展示age这个字段。

我们可以再加个v-if。 

我们看下效果 

 实际工作中基本不会遇到这种情况,为啥?正常来说我们如果有这个对象,基本是用v-for去遍历。有就渲染 没有就不渲染。

(3)v-else

正常工作当中,我们不会像上面的案例一样,仅仅只是如果满足条件就展示,不满足就什么都不展示。实际工作中,我们会根据条件去判断渲染哪一个,如果条件不满足渲染另外一个。

v-if ,v-else搭配着使用。

(4)v-else-if

我们再来一个demo,当score分数达到90分是优秀,60<=score<90是良好,小于60分是不及格。

注意v-else-if可以用多个。

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <div id="app">
      <h2 v-if="score>=90">优秀</h2>
      <!-- <h2 v-else-if="60<score<90">良好</h2> -->
      <h2 v-else-if="score>60 && score<90">良好</h2>
      <h2 v-else="score<60">不及格</h2>
    </div>
    <script src="../lib/vue.js"></script>

    <script>
      const app = Vue.createApp({
        // data: option api
        data() {
          return {
            score: 89,
          }
        },
      })

      app.mount("#app")
    </script>
  </body>
</html>

(5) v-if的渲染原理

 v-if的渲染原理:

  • v-if是惰性的;
  • 当条件为false时,其判断的内容完全不会被渲染或者被销毁掉;
  • 当条件为true时,才会真正渲染条件块中的内容;

 啥意思呢?

我们看一个条件为false的场景,

我们看下前端页面长啥样子,当条件为false的时候,是不是连元素都没有。

 

(6)template元素

因为v-if是一个指令,所以必须将其添加到一个元素上:

  • 但是如果我们希望切换的是多个元素呢?
  • 此时我们渲染div,但是我们并不希望div这种元素被渲染;
  • 这个时候,我们可以选择使用template

template元素可以当做不可见的包裹元素,并且在v-if上使用,但是最终template不会被渲染出来:

  • 有点类似于小程序中的block

 我们看下这个案例,是不是2部分,条件成立的时候渲染上面那部分,条件不成立的时候渲染下面那部分,我们上下两部分里面,最核心的是不是两个里面的具体内容要不要渲染出来,那外面为什么要包裹一个div呢?这个div用的意义是将里面的内容包裹起来,当成一个整体。当成一个整体之后,我们可以对这个整体做一个判断。不然的话只能把条件挨个写在每一个内部的内容标签上面。

但是用了div包裹后,其实是存在一个弊端的。我们最外层的div其实对我们显示的效果来说,是没有存在的必要的。  这里我们把info设置为空对象,看下效果。这个div是不是对我们显示的效果来说,是没必要存在的。

从浏览器的性能来说,你多加一个元素是不是浏览器就要多创建一个元素对象。

那我们能不能把这个元素删掉呢?

 我们现在把外面包裹的div都删掉,那我们怎么把v-if、v-else条件应用在各自需要展示的元素上面呢?

在早期vue2的时候,这里是必须要包裹一个div的或者别的元素的。

但是现在在vue3,引入template元素,这个元素本身是没有特殊的含义的。他只是把整个的这一块逻辑包裹在一起,页面上不会去渲染这个元素。

他唯一的作用就是在这个元素上面增加一个指令。

我们附下使用使用template的代码:

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <div id="app">
      <!-- v-if="条件" -->
      <template v-if="Object.keys.length">
        <h2>个人信息</h2>
        <ul>
          <li>姓名: {{ info.name }}</li>
          <li>年龄: {{ info.age }}</li>
        </ul>
      </template>

      <!-- v-else -->
      <template v-else>
        <h2>没有输入个人信息</h2>
        <p>请输入个人信息后再进行展示~</p>
      </template>
    </div>
    <script src="../lib/vue.js"></script>

    <script>
      const app = Vue.createApp({
        // data: option api
        data() {
          return {
            info: {},
          }
        },
      })

      app.mount("#app")
    </script>
  </body>
</html>

 我们看下页面效果,是不是没有额外加的div元素了对吧~ 

(7)条件渲染-阶段案例

我们来个案例:有个按钮和一个图片,我点击按钮图片消失,再点击一下按钮图片出现。

我们以前是怎么实现的?

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <style>
      img {
        width: 200px;
        height: 200px;
      }
    </style>
  </head>
  <body>
    <div id="app">
      <div>
        <button @click="toggle">切换</button>
      </div>

      <template v-if="isShowCode">
        <img src="https://img1.baidu.com/it/u=666927474,3753237121&fm=253&fmt=auto&app=138&f=GIF?w=504&h=500" alt="" />
      </template>
    </div>
    <script src="../lib/vue.js"></script>

    <script>
      const app = Vue.createApp({
        // data: option api
        data() {
          return {
            isShowCode: true,
          }
        },
        methods: {
          toggle() {
            this.isShowCode = !this.isShowCode
          },
        },
      })

      app.mount("#app")
    </script>
  </body>
</html>

(8) v-show

基于上面的案例,我们将代码改了一下template改成了div, v-if 改成了v-show。实现了界面相同的效果。

 


 我们来看下v-if 和v-show 本质具体是什么区别?

我们有2个div,分别是用v-if 和 v-show 。

需要展示的时候,两个是没什么区别。

如果不需要展示的时候,我们看下区别。v-show 是使用style = "display:none"将他隐藏起来了,本质是修改属性的操作。

但是v-if 如果不需要展示的话,元素就直接被销毁掉了,根本不会存在这个元素了。

了解到本质区别之后,我还有一个疑惑,

为什么v-show 不让用 template呢?

答:因为template这个元素压根不存在,但是当我为true的时候,我希望这个元素能够被渲染出来,而且当为false的时候,只是设置这个元素display:none。你压根就没这个元素,我怎么给你设置style?大家理解了嘛~ 

  

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

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

相关文章

Win11的两个实用技巧系列之内存不足导致永劫无间闪退解决方法、Win11本地安全机构保护误报修复方法

Win11内存不足导致永劫无间闪退解决方法 Win11内存不足导致永劫无间闪退怎么办&#xff1f;其实解决方法很简单&#xff0c;本文就为大家带来了详细的解决方法&#xff0c;感兴趣的朋友一起看看吧 Win11内存不足导致永劫无间闪退怎么办&#xff1f;永劫无间出现闪退的情况可能…

python练手小案例——采集二手车数据

前言 大家早好、午好、晚好吖 ❤ ~欢迎光临本文章 本次案例亮点: 1、系统分析目标网页 2、html标签数据解析方法 3、海量数据一键保存 环境介绍: 在开始写我们的代码之前&#xff0c;我们要准备好运行代码的程序 Python 3.8.8 | Anaconda, Inc. &#xff1a;解释器 Pych…

物联网|ARM|Keil安装|MDK|增加V5编译器|物联网开发系列课程之零基础玩转Cortex-M系列CPU-学习笔记(1)

文章目录 第一阶段-课程背景及简介问题一 什么是物联网问题二 嵌入式系统在物联网中的角色问题三 不一样的嵌入式系统 课程介绍课程内容提要&#xff08;学什么)课程特色课程要求&#xff08;怎么学)课程目的(怎么用)课程约定 浅谈ARM什么是ARMARM体系架构CPU的特点ARM体系架构…

04-24 每日一题 1163. 按字典序排在最后的子串 学习笔记反思

不晓得脑袋的灵活性是不是和精力的充沛程度相关&#xff0c;看到红色的困难&#xff0c;感觉自信都没了 题目描述 给你一个字符串 s &#xff0c;找出它的所有子串并按字典序排列&#xff0c;返回排在最后的那个子串 示例 1 :::success 输入&#xff1a;s “abab” 输出&…

【CocosCreator入门】CocosCreator组件 | Button(按钮)组件

Cocos Creator 是一款流行的游戏开发引擎&#xff0c;具有丰富的组件和工具&#xff0c;其中的Button组件可以通过设置按钮的状态和点击事件&#xff0c;实现在游戏中添加按钮交互的功能。 目录 一、组件介绍 二、组件属性 三、点击事件 Ⅰ、通过属性检查器添加回调 Ⅱ、通…

【AI话题】Chatbot UI下实现的对话模拟机

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 项目初衷&#xff1a;一、功能介绍&#xff1a;二、使用说明&#xff1a;1.注意事项&#xff1a; 三&#xff0c;未来功能&#xff1a;总结 项目初衷&#xff1a; …

让人悲观的国内ChatGPT的未来

最近关于ChatGPT的火爆已经不是简单的AI圈的事了&#xff0c;它已经席卷了所有的IT、媒体圈子&#xff0c;甚至是不同领域不同行业的人&#xff0c;只要你还对于变化与AI有一定的了解&#xff0c;那我相信你一定能知道ChatGPT是什么了。ChatGPT在某种程度上已经是相当于AGI通用…

时间序列的数据分析(七):数据平稳性

之前已经完成了六篇关于时间序列的博客&#xff0c;还没有阅读过的读者请先阅读&#xff1a; 时间序列的数据分析(一):主要成分 时间序列的数据分析(二):数据趋势的计算 时间序列的数据分析(三):经典时间序列分解 时间序列的数据分析(四):STL分解时间序列的数据分析(五):简单…

怎么使用gpt4-在哪里使用gpt

gpt-4怎么用 目前&#xff0c;GPT-4尚未发布或公开释放。因此&#xff0c;我们目前无法使用GPT-4。GPT-4是由OpenAI公司开发的人工智能语言模型&#xff0c;其预计能够比先前的版本GPT-3更加强大和智能化&#xff0c;但我们需要等待OpenAI官方发布有关GPT-4的更多信息。 如果…

搜索引擎找外贸客户

说起搜索引擎&#xff0c;我们每个人都不陌生&#xff0c;也许第一时间就能想到平日经常使用的“百度一下”和凭借强大算法及丰富功能占据近85%市场份额的谷歌搜索&#xff08;Statista 2023年1月数据&#xff09;这些耳熟能详的搜索引擎。对于外贸人而言搜索引擎也是非常实用的…

内卷的上海车展上,百度Apollo带来新型开放整零关系

/ 导读 / 汽车的智能化发展已然成为了当前市场最有热度的话题&#xff0c;更有希望引领新一代产业革命的浪潮。百度作为最早探索智能驾驶领域的企业之一&#xff0c;多年来始终打磨技术产品&#xff0c;已经形成了全栈的解决方案&#xff0c;从而帮助企业造好车。 在上海车展前…

谁不看谁是

报错Cannot create property type on string 是因为 你定义的相关变量是字符串 改成这样就行了 vue报错Cannot set properties of undefined (setting ‘xxx‘) 是因为没获取到值&#xff0c;需要在方法外层定义变量等于this&#xff0c;然后在方法内使用变量.name去查找值&a…

项目沟通管理5大技巧 第4个很重要

1、充分使用twitter管理沟通模型 项目沟通会议可以充分使用witter的管理沟通模型&#xff0c;提高会议沟通效率。使用此模型&#xff0c;主要是有三步&#xff1a; 第一步&#xff1a;倾听&#xff0c;项目经理需要保持中立的立场&#xff0c;不先表态&#xff0c;让团队成员畅…

nacos 1.4.2升级到nacos 2.1.1遇到的一些坑

文章目录 1 前言2 拉取nacos配置失败2.1 可能是端口号问题2.2 可能存在jar冲突2.3 可能nacos配置不对 1 前言 为了各组件更好的的兼容&#xff0c;最近系统进行了nacos升级, 由1.4.2升级为2.1.1&#xff0c;这里把遇到的一些坑做一下记录。 2 拉取nacos配置失败 在升级后&am…

Vue(事件处理、计算属性、监视属性)

一、事件处理 1. 语法 Vue模板 v-on:xxx"处理函数" xxx&#xff08;作为绑定事件的简写&#xff09;"处理函数" xxx指代的都是事件名 Vue实例 必须使用methods配置对象&#xff08;配置多个函数方法&#xff09; methods中配置函数&#xff0c;都是Vue…

哈希表题目:网格照明

文章目录 题目标题和出处难度题目描述要求示例数据范围 解法思路和算法代码复杂度分析 题目 标题和出处 标题&#xff1a;网格照明 出处&#xff1a;1001. 网格照明 难度 6 级 题目描述 要求 在 n n \texttt{n} \times \texttt{n} nn 的二维网格 grid \texttt{grid}…

【C++技能树】原来比C方便这么多 --引用、内联函数、Auto、NULL与nullptr

Halo&#xff0c;这里是Ppeua。平时主要更新C语言&#xff0c;C&#xff0c;数据结构算法......感兴趣就关注我吧&#xff01;你定不会失望。 &#x1f308;个人主页&#xff1a;主页链接 &#x1f308;算法专栏&#xff1a;专栏链接 我会一直往里填充内容哒&#xff01; &…

【软考备战·希赛网每日一练】2023年4月24日

文章目录 一、今日成绩二、错题总结第一题第二题第三题第四题第五题 三、知识查缺 题目及解析来源&#xff1a;2023年04月24日软件设计师每日一练 一、今日成绩 二、错题总结 第一题 解析&#xff1a; 第二题 解析&#xff1a; DPI表示每英寸像素点的个数。 300DPI表示每英寸…

ESP32学习六-构建系统

一、简介 如果想要新建一个ESP32项目&#xff0c;需要包含很多其他的文件夹和文件&#xff0c;如果对ESP32的勾线系统原理不理解&#xff0c;就会产生出很多编译不通过的问题。这里就对ESP-IDF构建系统的实现原理做一个简单的总结。 测试环境&#xff1a;Ubuntu18.4 ESP-IDF&am…

Observability:添加免费和开放的 Elastic APM 作为 Elastic 可观察性部署的一部分 - 8.x

作者&#xff1a;David Hope 在最近的一篇博文中&#xff0c;我们向你展示了如何开始使用 Elastic 可观察性的免费开放层。 下面&#xff0c;我们将介绍你需要做些什么来扩展你的部署&#xff0c;这样你就可以开始免费从应用程序性能监控&#xff08;APM&#xff09;或跟踪集群…