【后端速成 Vue】初识指令(上)

前言:

Vue 会根据不同的指令,针对标签实现不同的功能。

在 Vue 中,指定就是带有 v- 前缀 的特殊 标签属性,比如:

<div v-html='str'> </div>

这里问题就来了,既然 Vue 会更具不同的指令,实现不同的功能,那么这个 v-html 是实现什么功能的呢?


1、v-html

v-html:设置元素的 innerHTML

如何不知道元素的 innerHTML 是什么的话,可以先去学习一下 js。

现在有这样一个需求,有一个 div,需要动态的将一个 a 标签加入到这个 div 中。

于是有的小伙伴就很聪明,上篇文章不是讲过插值表达式嘛,这简单,直接使用插值表达式就行了嘛:

<body><div id="app">{{ msg }}</div>
</body>
<!-- 开发版本引入包/生产版本 -->
<script src="https://cdn.jsdelivr.net/npm/vue@2.7.14"></script>
<script>const app = new Vue({el: '#app',data: {msg: '<a href="#">程序猿教你打篮球的博客</a>'}})
</script>

但是这样运行代码发现:

由此得知,插值表达式不具备解析标签的能力!

这时 v-html 就发挥出他的作用了:

<body><div id="app" v-html="msg"></div>
</body>
<!-- 开发版本引入包/生产版本 -->
<script src="https://cdn.jsdelivr.net/npm/vue@2.7.14"></script>
<script>const app = new Vue({el: '#app',data: {msg: '<a href="#">程序猿教你打篮球的博客</a>'}})
</script>

运行结果:

这样一来,就能正确的解析标签了,当然,想要理解这个,还是需要 js 的基础,如果没有 js 的基础,不建议着急学 Vue 哦!

通过 DOM 页面,也能看出来使用插值表达式和v-html的区别:


2、v-show 和 v-if

这两个功能类似,但是也有区别,所以这里放在一起对比讲解。先说他们两个的作用:

v-show: 控制元素显示隐藏

语法:v-show="表达式"  表达式值为 true 显示,为 false 隐藏

v-if:控制元素显示隐藏(条件渲染)

语法:v-if="表达式"  表达式值为 true 显示,为 false 隐藏

这里写一段代码,来方便理解:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><style>.box {margin: 10px;width: 150px;height: 100px;text-align: center;line-height: 100px;border: 1px solid black;border-radius: 10px;box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.3);}</style>
</head>
<body><div id="app"><div v-show="flag" class="box"> v-show 容器</div><div v-if="flag" class="box"> v-if 容器</div></div>
</body>
<script src="https://cdn.jsdelivr.net/npm/vue@2.7.14"></script>
<script>const app = new Vue({el: '#app',data: {flag: true}})
</script>
</html>

执行结果:

此时 app 实例中的 flag 的值是 true,显然这两个盒子都会显示,如果把 flag 设置成 false 呢?

const app = new Vue({el: '#app',data: {flag: false}
})

很明显,这两个 div 都被隐藏了,满足上面讲的 v-show 和 v-if 的作用,但是上面强调过,v-show 和 v-if 的区别是:v-if 是条件渲染的,当然从显示上来看并不好发现 v-show 和 v-if 的区别。

这里可以在打开页面调试,也可以直接按 F12,或者右键'检查':

这里可以发现,使用 v-show 的 div 是通过设置 css 里的 display 属性来实现隐藏这个元素的。而 v-if 的 div 是通过条件判断进行创建和移除元素的(条件渲染)!

既然他们实现原理不同,那么他们的肯定有适用不同的使用场景:

v-show 更适合频繁显示隐藏的场景

v-if 适合不频繁显示隐藏的场景

由于 v-if 是根据条件判断来创建元素和移除元素的,本质还是在操作 DOM 树,所以效率显然是没有 v-show 高的,但使用 v-if 可以减少页面的冗余元素,因为 v-show 本质上元素还是在 DOM 树上的,所以在频繁切换隐藏显示的常见推荐用 v-show,不频繁时推荐使用 v-if。

举个例子,当鼠标滑过某个元素,需要展示详细信息,这时肯定使用 v-show 更合适,当用户登录了,不用显示登录逻辑元素了,这时肯定使用 v-if 更合适。


3、v-else 和 v-else-if

这俩就像 Java,C++,JavaScript 中的 else 和 else if 一样搭配 if 使用的,而 这里的 v-else 和 v-else-if 也是需要搭配 v-if 来使用的!

语法:v-else ,v-else-if="表达式"

注意:这两个需要紧挨着 v-if 一起使用。

案例需求:当 sex = 1 时,表示男生,当 sex = 2 表示女生,这两种情况之外,就定义为火星人,没有性别:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head>
<body><div id="app"><p v-if="sex === 1">性别: 🚹 男</p><p v-else-if="sex === 2">性别: 🚺 女</p><p v-else>火星人没有性别</p></div>
</body>
<script src="https://cdn.jsdelivr.net/npm/vue@2.7.14"></script>
<script>const app = new Vue({el: '#app',data: {sex: 1}})
</script>
</html>


4、v-on

作用:注册事件 = 添加监听 + 提供处理逻辑

语法:

① v-on:事件名 = "内联语句"

② v-on:事件名 = "methods 中的函数名"

什么叫做内联语句?简单来说就是一段可执行代码,比如 count++

案例需求:有两个按钮,分别是针对 count 进行 ++ -- 操作:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head>
<body><div id="app"><button v-on:click="count--">-</button><span>{{ count }}</span><button v-on:click="count++">+</button></div>
</body>
<script src="https://cdn.jsdelivr.net/npm/vue@2.7.14"></script>
<script>const app = new Vue({el: '#app',data: {count: 100}})
</script>
</html>

这里给第一个按钮注册了 click 监听事件,每次 click 一下就会使得 count--,由于 Vue 是响应式的,所以当 count 的值发生了变化,随之页面展示的 count 数据也会发生改变。

第二个按钮也注册了 click 监听事件,只是这个事件要处理的逻辑是 count++,于是每次点击第二个按钮,都会使 count 的值发生改变,当 Vue 监听到值发生变化了,随即就会重新渲染页面的数据了。

由于注册事件用的还是蛮多的,每次都写 v-on: 显然太麻烦了,于是 Vue 提供了一个简写,可以使用 @ 代替 'v-on:',上面的代码也可以改写成这个样子:

<body><div id="app"><button @click="count--">-</button><span>{{ count }}</span><button @click="count++">+</button></div>
</body>

在实际中,通常会使用这种简写的方式。

截至目前为止,讲解的 v-on 注册的事件执行逻辑都是内联语句,内联语句只适合逻辑简单的代码,如果逻辑复杂,代码量长了,这时就需要用到第二种语法形式了。

在实例 Vue 对象的时候,目前已经见到了两个配置项,分别是 el,data,现在就需要来认识第三个配置项 methods 了。

在这个 methods 配置项中,可以提供很多方法供 Vue 实例使用。

案例需求:有一个 button 和 span,单击 button 显示 span 中的内容,再次单击隐藏 button 隐藏 span 中的内容:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head>
<body><div id="app"><!-- 这里传要执行的函数名 --><button @click="fn">切换显示隐藏</button><span v-show="isShow">篮球哥</span></div>
</body>
<script src="https://cdn.jsdelivr.net/npm/vue@2.7.14"></script>
<script>const app = new Vue({el: '#app',data: {isShow: true},methods: {fn() {this.isShow = !this.isShow}}})
</script>
</html>

这里 button 绑定了一个单击事件,执行的逻辑是 fn 这个函数,在 fn 函数中,对 isShow 这个变量的值进行了修改。

此时注意,在 fn 中是不能直接访问 isShow 的,因为 js 会把 isShow 当作成一个全局变量,而这里的 isShow 是 app 这个实例的 isShow 变量,也可以使用 app.isShow,但是这样如果外面的 app 实例名改了,里面的 fn 也需要更改,于是 Vue 就让所有 methods 配置项中的函数的 this 都指向当前实例!

也即 this.isShow === app.isShow

看到这,细心的小伙伴就会发现,这里写函数名,那万一这个函数有参数应该怎么写呢?很简单,加上这个函数要传递的参数即可,比如:

<button @click="fn(1, 2)">按钮</button>

案例需求:实现一个功德器,有两个按钮,分别对应认真工作,功德加1,摸鱼一会,功德减10,单击对应按钮增加或减少对应功德,初始功德 10:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><style>.box {margin: 10px;width: 300px;height: 150px;text-align: center;border: 1px solid black;border-radius: 10px;box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.3);}</style>
</head>
<body><div id="app"><div class="box"><h1>功德器</h1><button @click="update(1)">认真工作(+1  功德)</button><button @click="update(-10)">摸鱼一会(-10功德)</button></div><p>功德值: {{ count }}</p></div>
</body>
<script src="https://cdn.jsdelivr.net/npm/vue@2.7.14"></script>
<script>const app = new Vue({el: '#app',data: {count: 10},methods: {update(number) {this.count = this.count + number}}})
</script>
</html>

运行结果:


5、v-bind

上一篇文章讲解到的插值选择器是不能作用于 html 的标签属性的,比如:

<!-- 错误写法 -->
<a href="{{url}}">程序猿教你打篮球</a>

作用: v-bind 就是动态的设置 html 的标签属性,比如 src,href,title,placeholder...

语法: v-bind:属性名="表达式"

案例需求:有一个input txt 输入框,要求通过 v-bind 动态设置标签的属性:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><style></style>
</head>
<body><div id="app"><input type="text" v-bind:placeholder="msg" v-bind:title="inputTitle"></div>
</body>
<script src="https://cdn.jsdelivr.net/npm/vue@2.7.14"></script>
<script>const app = new Vue({el: '#app',data: {msg: "你好呀",inputTitle: 'hello'}})
</script>
</html>

运行结果: 

这样写代码冗余性太高了,那么多 v-bind,能不能跟 v-on 一样可以简写呢?当然可以,只是跟 v-on 简写有点不同,v-bind 可以直接去掉 v-bind,比如 :title="inputTitle"

上述的代码也可以替换成如下这样:

<input type="text" :placeholder="msg" :title="inputTitle">

下期预告:【后端速成Vue】初识指令(下)

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在SpringBoot项目中整合SpringSession,基于Redis实现对Session的管理和事件监听

1、SpringSession简介 SpringSession是基于Spring框架的Session管理解决方案。它基于标准的Servlet容器API&#xff0c;提供了Session的分布式管理解决方案&#xff0c;支持把Session存储在多种场景下&#xff0c;比如内存、MongoDB、Redis等&#xff0c;并且能够快速集成到Spr…

微服务07-认识MQ+RabbitMQ入门

1.前言 了解同步调用和异步调用 1.1.同步调用 比如这里的支付服务&#xff0c;需要等待订单服务、短信服务…执行完毕才能执行&#xff0c;这样支付整个流程完毕需要500ms 然后如果订单、仓储等其中一个服务挂掉了&#xff0c;那么支付服务请求请求不了&#xff0c;挂掉的服…

一文读懂SSL、TLS和mTLS的通信安全协议

今天让我们深入探讨一下SSL、TLS和mTLS等一系列重要的通信安全协议。尽管从整体系统设计的角度来看,这个主题可能并不是至关重要,但仍然值得我们深入了解。 1. SSL协议 SSL,即安全套接字层(Secure Socket Layer),是一种通信协议,旨在加密和保护互联网通信的安全性。虽…

Windows+Pycharm 如何创建虚拟环境

当我们开发一个别人的项目的时候,因为项目里有很多特有的包,比如 Pyqt5.我们不想破坏电脑上原来的包版本,这个时候,新建一个虚拟环境,专门针对这个项目就很有必要了. 简略步骤: 1.新建虚拟环境 1.打开 pycharm 终端(Terminal)安装虚拟环境工具: pip install virtualenv2.创…

2023年度教育部人文社会科学研究一般项目评审结果,已公布!

【SciencePub学术】 9月15日&#xff0c;教育部社科司公示了2023年度教育部人文社会科学研究一般项目评审结果&#xff0c;共3482项。 其中&#xff0c;规划基金、青年基金、自筹经费项目共3029项通过专家评审&#xff1b;西部和边疆地区项目200项&#xff0c;新疆项目20项&a…

【C++面向对象侯捷】5.操作符重载与临时对象

文章目录 operator loading&#xff08;操作符重载-1&#xff0c;成员函数&#xff09; this返回值&#xff1a;引用 分析Header&#xff08;头文件&#xff09;的布局操作符重载-2&#xff0c;非成员函数&#xff08;无 this&#xff09;临时对象&#xff1a;返回的 绝不可能是…

经验分享|作为程序员之后了解到的算法知识

欢迎关注博主 六月暴雪飞梨花 或加入【六月暴雪飞梨花】一起学习和分享Linux、C、C、Python、Matlab&#xff0c;机器人运动控制、多机器人协作&#xff0c;智能优化算法&#xff0c;滤波估计、多传感器信息融合&#xff0c;机器学习&#xff0c;人工智能等相关领域的知识和技术…

LabVIEW开发航天器模拟器的姿态控制和反作用轮动量管理

LabVIEW开发航天器模拟器的姿态控制和反作用轮动量管理 在过去十年中&#xff0c;航天器一直是现代技术进步的先决条件。迄今为止&#xff0c;为了更好地完成各种实际任务&#xff0c;已经在航天器姿态控制领域进行了大量研究。航天器一旦进入太空&#xff0c;就容易出现不确定…

【深度学习实验】前馈神经网络(一):使用PyTorch构建神经网络的基本步骤

目录 一、实验介绍 二、实验环境 1. 配置虚拟环境 2. 库版本介绍 三、实验内容 0. 导入库 1. 定义x,w,b 2. 计算净活性值z 3. 实例化线性层并进行前向传播 4. 打印结果 5. 代码整合 一、实验介绍 本实验使用了PyTorch库来构建和操作神经网络模型&#xff0c;主要是关…

算法训练 第三周

二、环形链表 本题给了我们一个链表的头节点&#xff0c;需要我们判断这个链表之中是否存在环状结构&#xff0c;如果存在返回true&#xff0c;如果不存在则返回false。 1.hash表 我们可以从头遍历整个链表&#xff0c;并将遍历到的节点放入一个hashset中&#xff0c;当我们遍…

北邮22级信通院数电:Verilog-FPGA(2)modelsim北邮信通专属下载、破解教程

北邮22信通一枚~ 跟随课程进度更新北邮信通院数字系统设计的笔记、代码和文章 持续关注作者 迎接数电实验学习~ 获取更多文章&#xff0c;请访问专栏&#xff1a; 北邮22级信通院数电实验_青山如墨雨如画的博客-CSDN博客 目录 1.下载 2.解压打开 3.modelsim初安装 4.…

深度剖析Linux信号机制

文章目录 信号的概念信号的分类信号的产生方式从键盘获取通过系统调用硬件异常软件条件 如何处理信号的到来信号的更深入剖析信号的处理动作是何时进行的&#xff1f;当有一大批同种信号到来时会怎样&#xff1f;Linux也提供了一批信号相关的系统调用 信号的概念 Linux中的信号…

C语言——通讯录管理系统

通讯录管理系统项目简介 功能说明 控制台黑窗口实现程序需要满足以下几个功能 程序开始运行时首先显示选择菜单界面&#xff0c;根据用户输入确定实现何种功能 程序界面 代码实现 多文件实现 和之前写的实战项目类似&#xff0c;这里同样采用多文件实现的方式 多文件写代码…

day3_QT

day3_QT 1、文件保存2、始终事件 -闹钟 1、文件保存 2、始终事件 -闹钟 widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QTimerEvent> #include <QTime> #include <QTextToSpeech>QT_BEGIN_NAMESPACE namespace Ui { clas…

Qt --- Day03

<?xml version"1.0" encoding"UTF-8"?> <ui version"4.0"><class>Widget</class><widget class"QWidget" name"Widget"><property name"geometry"><rect><x>0…

fatal error: linux/compiler-gcc9.h: No such file or directory

linux 找到README文件 cd /mnt/e/CLionProjects/linux-3.10.99 sudo useradd linux3x sudo passwd linux3x sudo mkdir /home/linux3x sudo chown linux3x:linu3x /home/linux3x sudo chmod 755 /home/linux3x su - linux3x mkdir ~/build mkdir ~/build/kernel exit make O/…

目标检测Neck:FPN(Feature Pyramid Network)与PAN(附torch代码)

文章目录 0. 前言1. FPN1.1 FPN核心思想与步骤1.2 FPN的融合过程2. PAN2.1 PANet2.2 原版2.3 mmdetection中yolo_neck版本2.4 nanodet版本ReferenceFPN和PAN都是用于解决在目标检测中特征金字塔网络(FPN)在多尺度检测任务上的不足的方法。下面分别详细介绍一下它们的原理和区别…

Docker 容器设置为自动重启

Docker自动重启原因 Docker自动重启通常是由以下几个原因导致的&#xff1a; 程序崩溃系统内存不足系统进程使用过多CPU和RAM导致的阻塞docker容器被杀死或重新启动&#xff0c;导致应用程序中断网络中断 当这些问题出现时&#xff0c;Docker会自动重启运行中的服务来尝试解…

malloc与free

目录 前提须知&#xff1a; malloc&#xff1a; 大意&#xff1a; 头文件&#xff1a; 申请空间&#xff1a; 判断是否申请成功&#xff1a; 使用空间&#xff1a; 结果&#xff1a; 整体代码&#xff1a; malloc申请的空间怎么回收呢? 注意事项&#xff1a; free:…

【入门篇】ClickHouse最优秀的开源列式存储数据库

文章目录 一、什么是ClickHouse&#xff1f;OLAP场景的关键特征列式数据库更适合OLAP场景的原因输入/输出CPU 1.1 ClickHouse的定义与发展历程1.2 ClickHouse的版本介绍 二、ClickHouse的主要特性2.1 高性能的列式存储2.2 实时的分析查询2.3 高度可扩展性2.4 数据压缩2.5 SQL支…