Vue之条件渲染

news2025/3/11 17:04:08

1. 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>
    <!-- 
        v-if
        v-else
        v-else-if
        v-show

        v-if 和 v-show的区别:
            v-if控制元素是否渲染到页面;
            v-show控制元素是否显示(已经渲染到了页面, 即使隐藏);
     -->
</head>

<body>
    <div id="app">
        <div v-if='score > 90'>优秀</div>
        <div v-else-if='score<90 && score>80'>良好</div>
        <div v-else></div>

        <div v-show='flag'>测试v-show</div>
    </div>
    <script src="../vue.js" type="text/javascript"></script>
    <script type="text/javascript">
        var vm = new Vue({
            el: '#app',     
            data: {             
                score: 69,
                flag: false
            },
            methods: {
            }
        })
    </script>
</body>

</html>

2. 循环结构

<!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>
    <!-- 
        v-for:
            key的作用:帮助Vue区分不同的元素, 从而提高性能; 
            :key='item.id';(当然这个id可以用索引来充当, 不必单独添加id属性)
        遍历数组:
            (item, index)
        遍历对象:
            (value, key, index)
     -->
</head>

<body>
    <div id="app">

        <div>```遍历数组```</div>
        <ul>
            <li :key='index' v-for='(item, index) in fruits'>{{item + '---' + index}}</li><br>
            <li v-for='item in person'>
                <span>{{item}}</span>
            </li>
        </ul>
        <hr>


        <div>```遍历对象```</div><br>
        <div :key='index' v-for='(value, key, index) in obj'>{{ value + '    ' + key + '   ' + index}}</div>


        <hr>
        <div>```v-for和v-if的结合使用```</div><br>
        <div v-if='value == 23' :key='index' v-for='(value, key, index) in obj'> <!-- (值,键,索引) -->
            {{ value + '    ' + key + '   ' + index}}
        </div>

    </div>                                                  
    <script src="../vue.js" type="text/javascript"></script>
    <script type="text/javascript">
        var vm = new Vue({
            el: '#app',     
            data: {             
                fruits:['apple','orange,','banana'],
                person:[{
                    name: 'Zhang',
                    age: 19
                },{
                    name: 'Wang',
                    age:20
                },{
                    name: 'Li',
                    age: 23
                }],
                obj: {
                    num: 101,
                    name: 'Zhang',
                    age: 23,
                }
            },
            methods: {
            }
        });
    </script>
</body>

</html>

3. v-for和v-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>
    <script src="../vue.js" type="text/javascript"></script>
    <script src="../vue-router.js"></script>
    <script>
        /*
            1. 注意我们不推荐在同一元素上使用 v-if 和 v-for; 

            2. 当它们处于同一节点,v-for的优先级比v-if更高,这意味着v-if将分别重复运行于每个v-for循环中; 
                当你只想为部分项渲染节点时,这种优先级的机制会十分有用,如下:
                    <li v-for="todo in todos" v-if="!todo.isComplete">
                        {{ todo }}
                    </li>
               上面的代码将只渲染未完成的 todo; 
        

            3. 而如果你的目的是有条件地跳过循环的执行,
                那么可以将 v-if 置于外层元素 (或 <template>) 上。如:
                    <ul v-if="todos.length">
                        <li v-for="todo in todos">
                            {{ todo }}
                        </li>
                    </ul>
                    <p v-else>No todos left!</p>
        */
    </script>
</head>

<body>
    <div id="ok">

    </div>
    <script type="text/javascript">
        var vm = new Vue({
            el: '#ok',
            data: {},
        });
    </script>
</body>

</html>

4. 一点说明

<!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>
    <!-- 
        v-if  和 v-show:
            v-if 是“真正”的条件渲染,因为它会确保在切换过程中条件块内的事件监听器和子组件适当地被销毁和重建; 
            v-if 也是惰性的:如果在初始渲染时条件为假,则什么也不做——直到条件第一次变为真时,才会开始渲染条件块; 
            相比之下,v-show 就简单得多——不管初始条件是什么,元素总是会被渲染,并且只是简单地基于CSS进行切换; 
            一般来说,v-if 有更高的切换开销,而 v-show 有更高的初始渲染开销; 
            因此,如果需要非常频繁地切换,则使用v-show较好;如果在运行时条件很少改变,则使用v-if较好; 
     -->                
</head>
<body>
    <!-- 
        以下内容摘自官网:
          用 key 管理可复用的元素:
              Vue 会尽可能高效地渲染元素,通常会复用已有元素而不是从头开始渲染。
              这么做除了使 Vue 变得非常快之外,还有其它一些好处。
              例如,如果你允许用户在不同的登录方式之间切换:
     -->
     <template v-if="loginType === 'username'">
        <label>Username</label>
        <input placeholder="Enter your username">
      </template>
      <template v-else>
        <label>Email</label>
        <input placeholder="Enter your email address">
      </template>
      <!-- 
          那么在上面的代码中切换 loginType 将不会清除用户已经输入的内容。
          因为两个模板使用了相同的元素,<input> 不会被替换掉——仅仅是替换了它的 placeholder。
          这样也不总是符合实际需求,所以Vue为你提供了一种方式来表达“这两个元素是完全独立的,不要复用它们”; 
          只需添加一个具有唯一值的 key attribute 即可:
              <input placeholder="Enter your username" key="username-input">
              <input placeholder="Enter your email address" key="email-input">
       -->
</body>
</html>

5. 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>
    <script src="../vue.js" type="text/javascript"></script>
    <script src="../vue-router.js" type="text/javascript"></script>         
    <!-- 
        在 <template> 元素上使用 v-if 条件渲染分组: 
            因为 v-if 是一个指令,所以必须将它添加到一个元素上;
            但是如果想切换多个元素呢???
                此时可以把一个<template>元素当做 ```不可见的包裹元素```,并在上面使用 v-if; 
                最终的渲染结果将不包含 <template> 元素; 
                    <template v-if="ok">
                        <h1>Title</h1>
                        <P>Paragraph 1</p>
                        <p>Paragraph 2</p>
                    </template>
     -->             
    <!-- 
        关于<template>标签的说明:
            1. template标签放在Vue实例('#app')绑定的元素内部, 那么它里面的内容可以显示, 但是后台中将不会存在这个标签; 
            2. template标签不放在Vue实例绑定的元素内部, 那么它里面的内容将不会显示, 但是后台可以查到这个标签结点;
                <template>#document-fragment</template>
     -->                                                                     
</head>

<body>
    <template id="tem">放在Vue实例外部</template>

    <div id="app">
        <template id="tem">Vue实例内部</template>
    </div>

    <script type="text/javascript">
        var vm = new Vue({
            el: '#app'
        });
        var te = document.getElementById('tem');
        console.log(te);
    </script>
</body>
</html>

6. 案例

<!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>
    <script src="../../vue.js" type="text/javascript"></script>
    <style>
        * {
            margin: 0;
            padding: 0;
        }

        table {
            margin: 0 auto;
            width: 350px;
            height: 200px;
            text-align: center;
        }

        table thead {
            background-color: orange;
        }

        .title {
            text-align: center;
        }
    </style>
</head>

<body>
    <div id="app">
        <div class="grid">
            <div class="title">
                <h1>图书管理</h1>
                <div>
                    <label>编号</label>
                    <input type="text" v-model="ID" :disabled='flag'>
                    <label>名称</label>
                    <input type="text" v-model="NAME">
                    <button @click='handle'>提交</button>
                </div>
            </div>
            <table border="1px" cellspacing="0px">
                <thead>
                    <tr>
                        <th>编号</th>
                        <th>名称</th>
                        <th>时间</th>
                        <th>操作</th>
                    </tr>
                </thead>
                <tbody>
                    <tr :key='item.id' v-for='item in boapps'>
                        <td>{{item.id}}</td>
                        <td>{{item.name}}</td>
                        <td>{{item.date}}</td>
                        <td>
                            <a href="" @click.prevent @click='modify(item.id)'>修改</a>
                            <span>|</span>
                            <a href="" @click.prevent @click='Delete(item.id)'>删除</a>
                        </td>
                    </tr>
                </tbody>
            </table>
        </div>
    </div>
    <script type="text/javascript">
        var vm = new Vue({
            el: '#app',
            data: {
                ID: '',
                NAME: '',
                flag: false,
                boapps: [{
                    id: 1,
                    name: '三国演义',
                    date: ''
                }, {
                    id: 2,
                    name: '水浒传',
                    date: ''
                }, {
                    id: 3,
                    name: '红楼梦',
                    date: ''
                }, {
                    id: 4,
                    name: '西游记',
                    date: ''
                }]
            },
            methods: {
                handle: function () {
                    if (this.flag) {
                        // 修改操作
                        // 根据当前id去更新数组中对应的数据
                        var that = this;
                        this.boapps.some(function(item) {
                            if(item.id == that.id) {
                                item.name = that.name;
                                return true;
                            }
                        }); 
                    } else {
                        // 添加操作
                        var boapp = {};
                        boapp.id = this.ID;
                        boapp.name = this.NAME;
                        boapp.date = '';
                        this.boapps.push(boapp);
                        // 清空表单input
                        this.ID = '';
                        this.NAME = '';
                    }
                    // 添加图书
                    var boapp = {};
                    boapp.id = this.ID;
                    boapp.name = this.NAME;
                    boapp.date = '';
                    this.boapps.push(boapp);
                    // 清空表单input
                    this.ID = '';
                    this.NAME = '';
                },
                modify: function (id) {
                    // 禁止修改id
                    this.flag = true;
                    // 根据id获取对应的数据
                    var boapp = this.boapps.filter(function (item) {
                        return item.id == id;
                    });
                    // 把获取到的信息填充到表单中
                    this.ID = boapp[0].id;
                    this.NAME = boapp[0].name;
                },
                Delete: function (id) {
                    var index = this.boapps.findIndex(function(item){
                        return item.id == id;
                    });
                    this.boapps.splice(index,1);
                }
            }
        }); 
    </script>
</body>

</html>

请添加图片描述

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

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

相关文章

【分享】如何国内免费使用ChatGPT4教程

一、ChatGPT-3使用 1、ChatGPT用法总结&#xff1a; 自动化文本生成&#xff1a;可以用GPT生成文章、新闻、文本摘要&#xff0c;甚至小说、诗歌等文学作品。语音生成&#xff1a;结合语音合成技术&#xff0c;GPT可以生成自然流畅的语音&#xff0c;可以用于语音助手、交互式…

Python学习——数据排序及分箱pd.cut\pd.qcut

文章目录 1 排序1.1 按照索引排序 df.sort_index1.2 按照值进行排序 df.sort_values1.3 数值型数据快速排序 df.nlargest 2 分箱&#xff08;离散化&#xff09;2.1 pd.cut2.1.1 均匀切分,等距分箱2.1.2 指定切分点切分 2.2 pd.qcut 1 排序 dataFrame进行排序时&#xff0c;可…

最全面的WMS系统选购指南:从功能到价格一网打尽

WMS&#xff08;仓库管理系统&#xff09;是一款能够提高仓储和物流企业效率的重要工具&#xff0c;并且能够帮助客户更好地管理他们的供应链网络。但是市面上有很多不同的WMS系统&#xff0c;如何选出最适合自己的系统呢&#xff1f;下面将为您介绍全面的WMS系统选购指南。 功…

软件工程师,不懂点设计模式怎么行

设计模式的圣经 提起设计模式&#xff0c;就不得不提《设计模式——可复用面向对象软件的基础》这本经典著作。1995年&#xff0c;GOF&#xff08;Gang Of Four&#xff09;&#xff0c;也就是Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides这四个人&#xff0c;合…

感谢你们为科技创新和社会进步做出的贡献

感谢你们为科技创新和社会进步做出的贡献 近日中国科技发展事件 据中国载人航天工程办公室消息&#xff0c;北京时间2023年5月30日6时42分&#xff0c;神舟十六号载人飞行任务航天员乘组出征仪式在酒泉卫星发射中心问天阁圆梦园广场举行。6时44分&#xff0c;中国载人航天工程…

Linux:虚拟网卡技术tun/tap

一、介绍 Linux中的TAP网络接口详解是Linux网络管理中的很重要的一部分&#xff0c;它可以用来建立虚拟网络&#xff0c;模拟网络&#xff0c;管理网络流量以及实现安全网络功能等。本文将介绍TAP网络接口的基本原理、如何使用它进行网络管理、与以太网的区别&#x…

在 I/O 看未来 | Flutter 和 Dart 最新进展

作者 / Google 开发者框架和语言 (含 Flutter、Dart 和 Go) 产品经理/用户体验总监 Tim Sneath 今年的 Google I/O 大会在位于加利福尼亚州山景城的总部附近举办&#xff0c;我们怀着无比激动的心情面向全球直播了这场盛会&#xff01; 就在三个多月前&#xff0c;我们在肯尼亚…

软考A计划-试题模拟含答案解析-卷十二

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例 &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分享&am…

带电接10kV空载电缆线路与架空线路连接引线(绝缘手套作业法)

一、现场复勘 1.核对线路及杆塔号 线路双重名称及杆号无误。 2.检查杆身质量 3.检查电杆埋深 4.检查导线固定情况 检查作业点导线有无烧伤、断股。 5.检查气象条件 作业前需进行湿度和风速的测量&#xff0c;风力大于5级&#xff0c;或湿度大于80%时&#xff0c;不宜带电作…

Microsoft Build 2023 After Party - 上海站

点击蓝字 关注我们 编辑&#xff1a;Alan Wang 排版&#xff1a;Rani Sun 微软 Reactor 为帮助广开发者&#xff0c;技术爱好者&#xff0c;更好的学习 .NET Core, C#, Python&#xff0c;数据科学&#xff0c;机器学习&#xff0c;AI&#xff0c;区块链, IoT 等技术&#xff0…

企业级信息系统开发讲课笔记4.4 Spring Boot加载自定义配置文件

文章目录 零、学习目标一、为什么需要加载自定义配置文件二、使用PropertySource加载自定义配置文件&#xff08;一&#xff09;创建Spring Boot项目&#xff08;二&#xff09;创建自定义配置文件&#xff08;三&#xff09;创建自定义配置类&#xff08;四&#xff09;编写测…

一款射频芯片的layout设计指导案例-篇章1

RTL8762C是瑞昱一款超低功耗蓝牙芯片&#xff0c;瑞昱的硬件设计指导书中&#xff0c;关于该芯片的layout设计指导很有普适性的参考指导意义&#xff0c;如下为笔者做过一定简化的芯片最小系统原理图—— PCB Layout建议分如下几个点—— 元件布局顺序 按如下顺序布置元件&…

可视化搭建 - 场景实战

接下来用实战来说明该可视化搭建框架是否好用&#xff0c;以下几条原则需要始终贯穿在下面每个实战场景中&#xff1a; 复杂的业务场景&#xff0c;背后使用的框架 API 是简单的。底层 API 并不为业务场景特殊编写&#xff0c;而是具有很强的抽象性&#xff0c;很容易挖掘出其他…

23种设计模式之状态模式(State Pattern)

前言&#xff1a;大家好&#xff0c;我是小威&#xff0c;24届毕业生&#xff0c;在一家满意的公司实习。本篇文章将23种设计模式中的状态模式&#xff0c;此篇文章为一天学习一个设计模式系列文章&#xff0c;后面会分享其他模式知识。 如果文章有什么需要改进的地方还请大佬不…

Zabbix API开发实战,创建报警媒介和代码示例(付源码)

Zabbix API开始发挥重要作用&#xff0c;尤其是在Zabbix与第三方软件&#xff08;如配置和事件管理系统&#xff09;的集成以及日常任务的自动化方面。如果没有一些自动化&#xff0c;管理对数千台主机的监控是非常困难的。 API是在Zabbix 1.8中引入的&#xff0c;并且已经被广…

多语言电商系统_国际化电商系统流程

跨境电商系统是基于计算机技术和互联网平台的一种电子商务系统。它通常包括前端电商网站或应用程序、后台管理系统、物流管理系统、支付系统等多个模块&#xff0c;可以通过网络实现商品展示、订单管理、支付结算、物流配送等电商流程的自动化处理。 跨境电商系统基本流程包括…

JWT | 一分钟掌握JWT | 概念及实例

作者&#xff1a;Mars酱 声明&#xff1a;本文章由Mars酱编写&#xff0c;部分内容来源于网络&#xff0c;如有疑问请联系本人。 转载&#xff1a;欢迎转载&#xff0c;转载前先请联系我&#xff01; 什么是JWT JWT的全称是Json Web Token。是基于RFC 7519开放标准的&#xff…

玩转ChatGPT:视频制作

一、写在前面 最近&#xff0c;在码深度学习图像识别的相关知识和代码&#xff0c;这一part&#xff0c;看看能否用小Chat搞一个介绍视频。 简单问小Chat&#xff1a; 咒语&#xff1a;我怎么使用你做一个视频&#xff1f;需要配合什么软件生成&#xff1f;&#xff1f; 大意…

2023.5.22-5.28 AI行业周刊(第149期):毕业10年后的实验室聚会

周末和实验室&#xff0c;无锡这边师兄弟们相聚了一次&#xff0c;之前在无锡这边的江南大学读书&#xff0c;后来工作后大家大多数也都留在了无锡。 我们研究生时的实验室&#xff0c;专门有一个微信群&#xff0c;从02年入学&#xff0c;到17年入学&#xff0c;多年各界的师…

Node.JS学习 | Babel | webpack | ES6

&#x1f497;wei_shuo的个人主页 &#x1f4ab;wei_shuo的学习社区 &#x1f310;Hello World &#xff01; Node.JS Node.JS能够在服务器端运行JavaScript的开放源代码、跨平台运行环境&#xff1b;Node.js采用Google开发的V8运行代码&#xff0c;使用事件驱动、非阻塞IO和异…