Vue3 学习笔记(五)Vue3 模板语法详解


在 Vue3 的世界里,模板语法是我们构建用户界面的基石。今天,让我们一起深入了解 Vue3 的模板语法,我将用通俗易懂的语言和实用的例子,带你掌握这项必备技能。


1、文本插值:最基础的开始


想在页面上显示数据?双大括号语法 {{ }} 就是你的好帮手!

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Vue 测试)</title><script src="https://lf3-cdn-tos.bytecdntp.com/cdn/expire-1-M/vue/3.2.26/vue.global.min.js"></script></head>
<body><div id="hello-vue" class="demo">{{ message }}
</div><script>
const HelloVueApp = {data() {return {message: '你好 Vue!!'}}
}Vue.createApp(HelloVueApp).mount('#hello-vue')
</script>
</body>
</html>

运行结果:
在这里插入图片描述


2、插入 HTML:v-html 指令

双大括号会将数据解释为纯文本,而不是 HTML。

如果想插入 HTML,需要使用 v-html 指令.

 <p>使用双大括号的文本插值: {{ rawHtml }}</p><p>使用 v-html 指令: <span v-html="rawHtml"></span></p>
</div><script>
const RenderHtmlApp = {data() {return {rawHtml: '<span style="color: red">这里会显示红色!</span>'}}
}Vue.createApp(RenderHtmlApp).mount('#example1')
</script>

运行结果:
在这里插入图片描述


这里看到的 v-html attribute 被称为一个指令

指令由 v- 作为前缀,表明它们是一些由 Vue 提供的特殊 attribute,它们将为渲染的 DOM 应用特殊的响应式行为。这里我们做的事情简单来说就是:在当前组件实例上,将此元素的 innerHTML 与 rawHtml 属性保持同步。


3 、绑定属性:让元素活起来


双大括号不能在 HTML attributes 中使用。

想要响应式地绑定一个 attribute,应该使用 v-bind 指令。


(1)、常规 v-bind 指令
<div v-bind:id="dynamicId"></div>
<div v-bind:class="{'class1': use}">

测试案例:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Vue 测试</title>
<script src="https://cdn.staticfile.net/vue/3.2.36/vue.global.min.js"></script>
<style>
.class1{background: #444;color: #eee;
}
</style>
</head>
<body>
<div id="app"><label for="r1">修改颜色</label><input type="checkbox" v-model="use" id="r1"><br><br><div v-bind:class="{'class1': use}">v-bind:class 指令</div>
</div><script>
const app = {data() {return {use: false}}
}Vue.createApp(app).mount('#app')
</script>
</body>
</html>

运行结果:

在这里插入图片描述


(2)、简写

v-bind 非常常用,简写语法:

<div :id="dynamicId"></div>
 <div :class="{'class1': use}">

开头为 : 的 attribute 可能和一般的 HTML attribute 看起来不太一样,但它的确是合法的 attribute 名称字符,并且所有支持 Vue 的浏览器都能正确解析它。此外,他们不会出现在最终渲染的 DOM 中。


(3)、布尔型 Attribute

对于布尔属性,常规值为 true 或 false,如果属性值为 null 或 undefined,则该属性不会显示出来。

<button v-bind:disabled="isButtonDisabled">按钮</button

(4)、类名和样式绑定
<!-- 类名绑定 -->
<div :class="{ active: isActive, 'text-danger': hasError }">动态类名
</div><!-- 样式绑定 -->
<div :style="{ color: activeColor, fontSize: fontSize + 'px' }">动态样式
</div>

(5)、动态绑定多个值

如果有像这样的一个包含多个 attribute 的 JavaScript 对象:

const objectOfAttrs = {id: 'container',class: 'wrapper',style: 'background-color:green'
}

通过不带参数的 v-bind,可以将它们绑定到单个元素上:

<div v-bind="objectOfAttrs"></div>

使用案例:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Vue 属性绑定示例</title>
<script src="https://cdn.staticfile.net/vue/3.2.36/vue.global.min.js"></script>
<style>
.wrapper {padding: 20px;margin: 10px;border-radius: 8px;
}
.active {border: 2px solid blue;color: white;
}
.large {font-size: 20px;
}
.centered {text-align: center;
}
</style>
</head>
<body>
<div id="app"><!-- 1. 基础绑定 --><div v-bind="objectOfAttrs">基础属性绑定</div><!-- 2. 动态修改属性 --><div class="controls" style="margin: 20px 0;"><button @click="toggleTheme">切换主题</button><button @click="toggleSize">切换大小</button><button @click="addNewAttr">添加新属性</button></div><!-- 3. 组合绑定 --><div v-bind="objectOfAttrs":class="additionalClasses">组合属性绑定</div><!-- 4. 显示当前属性值 --><div style="margin-top: 20px;"><h3>当前属性值:</h3><pre>{{ JSON.stringify(objectOfAttrs, null, 2) }}</pre></div><!-- 5. 自定义属性输入 --><div style="margin-top: 20px;"><h3>添加新属性:</h3><input v-model="newAttrKey" placeholder="属性名"><input v-model="newAttrValue" placeholder="属性值"><button @click="addCustomAttr">添加</button></div>
</div><script>
const app = {data() {return {// 基础属性对象objectOfAttrs: {id: 'container',class: 'wrapper',style: 'background-color: #42b983','data-custom': 'value'},// 是否使用暗色主题isDark: false,// 是否使用大号字体isLarge: false,// 新属性的输入值newAttrKey: '',newAttrValue: ''}},computed: {// 计算额外的类名additionalClasses() {return {'active': this.isDark,'large': this.isLarge,'centered': true}}},methods: {// 切换主题toggleTheme() {this.isDark = !this.isDarkthis.objectOfAttrs.style = this.isDark ? 'background-color: #34495e; color: white': 'background-color: #42b983'},// 切换大小toggleSize() {this.isLarge = !this.isLarge},// 添加新属性addNewAttr() {this.objectOfAttrs['data-timestamp'] = new Date().getTime()},// 添加自定义属性addCustomAttr() {if (this.newAttrKey && this.newAttrValue) {this.objectOfAttrs[this.newAttrKey] = this.newAttrValuethis.newAttrKey = ''this.newAttrValue = ''}}}
}Vue.createApp(app).mount('#app')
</script>
</body>
</html>

输出结果:

在这里插入图片描述


(6)、使用 JavaScript 表达式


Vue 实际上在所有的数据绑定中都支持完整的 JavaScript 表达式:

{{ number + 1 }}{{ ok ? 'YES' : 'NO' }}{{ message.split('').reverse().join('') }}<div :id="`list-${id}`"></div>

这些表达式都会被作为 JavaScript ,以当前组件实例为作用域解析执行。

在 Vue 模板内,JavaScript 表达式可以被使用在如下场景上:

  • 在文本插值中 (双大括号)
  • 在任何 Vue 指令 (以 v- 开头的特殊 attribute) attribute 的值中

仅支持单一表达式


每个绑定仅支持单一表达式,也就是一段能够被求值的 JavaScript 代码。一个简单的判断方法是是否可以合法地写在 return 后面。

下面的例子无效

<!-- 这是一个语句,而非表达式 -->
{{ var a = 1 }}<!-- 条件控制也不支持,请使用三元表达式 -->
{{ if (ok) { return message } }}

4、调用函数


可以在绑定的表达式中使用一个组件暴露的方法:

<time :title="toTitleDate(date)" :datetime="date">{{ formatDate(date) }}
</time>

使用案例:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Vue 绑定表达式中的函数调用</title>
<script src="https://cdn.staticfile.net/vue/3.2.36/vue.global.min.js"></script>
<style>
.date-display {padding: 10px;margin: 10px;border: 1px solid #ccc;border-radius: 4px;cursor: pointer;
}
.highlight {background-color: #e8f5e9;
}
.format-switch {margin: 10px 0;
}
time {display: inline-block;padding: 5px 10px;
}
time:hover {background-color: #f5f5f5;
}
</style>
</head>
<body>
<div id="app"><!-- 基础日期显示 --><time :title="toTitleDate(currentDate)" :datetime="currentDate"class="date-display":class="{ highlight: isHighlighted }"@click="toggleHighlight">{{ formatDate(currentDate) }}</time><!-- 格式切换 --><div class="format-switch"><label><input type="checkbox" v-model="useDetailedFormat">使用详细格式</label></div><!-- 多个日期展示 --><div><h3>日期列表:</h3><time v-for="date in dates" :key="date":title="toTitleDate(date)":datetime="date":style="getDateStyle(date)">{{ formatDate(date) }}</time></div><!-- 日期计算 --><div style="margin-top: 20px;"><button @click="addDays(1)">添加一天</button><button @click="addDays(-1)">减少一天</button><button @click="resetDate">重置日期</button></div><!-- 自定义格式输入 --><div style="margin-top: 20px;"><input v-model="customFormat" placeholder="输入自定义格式":title="getFormatExample()"></div>
</div><script>
const app = {data() {return {currentDate: new Date().toISOString(),useDetailedFormat: false,isHighlighted: false,customFormat: 'YYYY-MM-DD',dates: [new Date().toISOString(),new Date(Date.now() - 86400000).toISOString(), // 昨天new Date(Date.now() + 86400000).toISOString()  // 明天]}},methods: {// 格式化为标题日期toTitleDate(date) {const d = new Date(date)return d.toLocaleString('zh-CN', {weekday: 'long',year: 'numeric',month: 'long',day: 'numeric',hour: '2-digit',minute: '2-digit'})},// 格式化显示日期formatDate(date) {const d = new Date(date)if (this.useDetailedFormat) {return this.toTitleDate(date)}return d.toLocaleDateString('zh-CN')},// 获取日期样式getDateStyle(date) {const d = new Date(date)const today = new Date()const isToday = d.toDateString() === today.toDateString()return {backgroundColor: isToday ? '#e3f2fd' : 'transparent',margin: '0 5px',borderRadius: '4px'}},// 切换高亮toggleHighlight() {this.isHighlighted = !this.isHighlighted},// 添加天数addDays(days) {const d = new Date(this.currentDate)d.setDate(d.getDate() + days)this.currentDate = d.toISOString()},// 重置日期resetDate() {this.currentDate = new Date().toISOString()},// 获取格式示例getFormatExample() {return `格式示例: ${this.formatDate(this.currentDate)}`}},watch: {// 监听自定义格式变化customFormat(newFormat) {console.log('Format changed:', newFormat)}}
}Vue.createApp(app).mount('#app')
</script>
</body>
</html>

输出效果:

在这里插入图片描述


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

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

相关文章

2024 BuildCTF 公开赛|MISC

1.what is this? BuildCTF{S0_TH1S_15_M0R5E_C0DE_!!} 2.一念愚即般若绝&#xff0c;一念智即般若生 解压缩密码&#xff1a;s2j6dg* BuildCTF{D3crypt10n_1s_4_l0ng_r04d} 3.如果再来一次&#xff0c;还会选择我吗&#xff1f; 修复png 密码&#xff1a;8!67adz6&#xff…

【AI绘画】Midjourney进阶:对角线构图详解

博客主页&#xff1a; [小ᶻZ࿆] 本文专栏: AI绘画 | Midjourney 文章目录 &#x1f4af;前言&#x1f4af;什么是构图为什么Midjourney要使用构图 &#x1f4af;对角线构图特点应用场景提示词书写技巧测试 &#x1f4af;小结 &#x1f4af;前言 【AI绘画】Midjourney进阶&a…

【QT】windows 平台 QT6.8 安装

qt-online-installer-windows-x64-4.8.1.exe Index of /qt/archive/online_installers/4.8/登录,第一个字母是大写的 如果忘记了,可以在这里“ https://my.qt.io/## D:\Qt6

LDR6328:助力小家电实现TYPE-C接口快充输入

在小家电市场日益繁荣的今天&#xff0c;消费者对产品的要求越来越高&#xff0c;不仅关注功能性和实用性&#xff0c;更追求便捷和高效的充电体验。传统的充电接口如DC、Micro USB等&#xff0c;已经无法满足现代消费者对快速充电和高效数据传输的需求。为此&#xff0c;许多小…

基于SSM轻型卡车零部件销售系统的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;配件类型管理&#xff0c;配件信息管理&#xff0c;订单信息管理&#xff0c;检修休息管理&#xff0c;系统管理 用户账号功能包括&#xff1a;系统首页&#xff0c;个人中心&…

SMA-BP时序预测 | Matlab实现SMA-BP黏菌算法优化BP神经网络时间序列预测

SMA-BP时序预测 | Matlab实现SMA-BP黏菌算法优化BP神经网络时间序列预测 目录 SMA-BP时序预测 | Matlab实现SMA-BP黏菌算法优化BP神经网络时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.Matlab实现SMA-BP黏菌算法优化BP神经网络时间序列预测&#xff08;完…

【C#】调用本机AI大模型流式返回

【python】AI Navigator的使用及搭建本机大模型_anaconda ai navigator-CSDN博客 【Python】AI Navigator对话流式输出_python ai流式返回-CSDN博客 前两章节我们讲解了使用AI Navigator软件搭建本机大模型&#xff0c;并使用python对大模型api进行调用&#xff0c;使其流式返…

JS面试八股文(一)

&#x1f60a;JS面试八股文&#xff08;一&#xff09; 1.JS由哪三部分组成&#xff1f;2.JS有哪些内置对象&#xff1f;3.操作数组的方法有哪些&#xff1f;4.JS对数据类型的检测方式有哪些&#xff1f;5.说一下闭包&#xff0c;闭包有什么特点&#xff1f;6.前端的内存泄漏怎…

【go】仅设想,能不能通过pure go编写页面。

设想 通过pure-go编写页面, 似乎不太好实现&#xff0c; 就当学习前端html基础了。 完成度 0.5% App.go: package srcimport (d "github.com/go-webtools/wgo/core/document""github.com/go-webtools/wgo/core/react""github.com/go-webtools/wgo/c…

Java避坑案例 - 高并发场景下的分布式缓存策略

文章目录 概述缓存常见问题及解决方案把 Redis 当作数据库常用的数据淘汰策略如何选择合适的驱逐算法 缓存雪崩问题复现解决方案 缓存击穿&#xff08;热点缓存失效&#xff09;问题复现解决方案 缓存穿透问题复现解决方案缓存穿透 vs 缓存击穿 缓存与数据库的一致性先更新缓存…

面包种类图像分割系统:多层面改进

面包种类图像分割系统源码&#xff06;数据集分享 [yolov8-seg-GhostHGNetV2&#xff06;yolov8-seg-C2f-DCNV3等50全套改进创新点发刊_一键训练教程_Web前端展示] 1.研究背景与意义 项目参考ILSVRC ImageNet Large Scale Visual Recognition Challenge 项目来源AAAI Globa…

使用Llama Index与Streamlit实现一个从文本中提取专业术语和定义网页小程序

Llama Index有许多用例&#xff08;语义搜索、摘要等&#xff09;&#xff0c;并且都有很好的记录。然而&#xff0c;这并不意味着我们不能将Llama Index应用到非常具体的用例中&#xff01; 在本教程中&#xff0c;我们将介绍使用Llama Index从文本中提取专业术语和定义的设计…

Ovis: 多模态大语言模型的结构化嵌入对齐

论文题目&#xff1a;Ovis: Structural Embedding Alignment for Multimodal Large Language Model 论文地址&#xff1a;https://arxiv.org/pdf/2405.20797 github地址&#xff1a;https://github.com/AIDC-AI/Ovis/?tabreadme-ov-file 今天&#xff0c;我将分享一项重要的研…

量子机器学习:颠覆性的前沿技术

量子机器学习&#xff1a;颠覆性的前沿技术 引言 在科技日新月异的今天&#xff0c;量子计算和机器学习作为两大前沿领域&#xff0c;各自在推动科技进步中发挥着重要作用。而当这两者结合时&#xff0c;便诞生了一个全新的领域——量子机器学习&#xff08;Quantum Machine …

GCC 简介

Linux 中的编译器 GCC 的编译原理和使用详解 GCC 简介 GCC&#xff08;GNU Compiler Collection&#xff09;是一套由 GNU 开发的编程语言编译器&#xff0c;它支持多种编程语言&#xff0c;包括 C、C、Objective-C、Fortran、Ada 和 Go 等。GCC 是一个开源的工具集&#xff…

Spring Boot框架在学生宿舍管理中的应用研究

摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了学生宿舍信息管理系统的开发全过程。通过分析学生宿舍信息管理系统管理的不足&#xff0c;创建了一个计算机管理学生宿舍信息管理系统的方案。文章介绍了学生宿舍…

AI读教链《为什么今年ETH对BTC表现这么拉垮?》

以太坊&#xff08;ETH&#xff09;近期表现不佳&#xff0c;主要是由于市场对其价值存储功能的信心下降&#xff0c;尤其是在比特币&#xff08;BTC&#xff09;表现强劲的背景下。ETH的市值逐渐被以Solana等新兴公链抢占&#xff0c;流失了大量用户和炒币的流量。此外&#x…

JAVA排序

排序的概念 排序&#xff1a;所谓排序&#xff0c;就是使一串记录&#xff0c;按照其中的某个或某些关键字的大小&#xff0c;递增或递减的排列起来的操作。 稳定性&#xff1a;假定在待排序的记录序列中&#xff0c;存在多个具有相同的关键字的记录&#xff0c;若经过排序&…

跟着鸟儿学飞行?扑翼机器人的感知秘籍

大家好&#xff01;今天来了解一篇扑翼机器人的研究——《Avian-inspired embodied perception in biohybrid flapping-wing robotics》发表于《Nature Communications》。在广阔天空中&#xff0c;鸟类凭借精妙翅膀结构与敏锐感知自由翱翔&#xff0c;这一直吸引着科学家探索其…

cherry pick commit

cherry pick commit git cherry-pick 是一个 Git 命令&#xff0c;用于将特定的提交&#xff08;commit&#xff09;应用到当前分支上。这在需要从其他分支中挑选某些提交到当前分支时非常有用&#xff0c;例如当你需要修复一个 bug&#xff0c;但想只应用特定的变更&#xff…