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.isDark
      this.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.newAttrValue
        this.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>

输出效果:

在这里插入图片描述


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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

《探索 HarmonyOS NEXT(5.0):开启构建模块化项目架构奇幻之旅 —— 模块化基础篇》

从无到有&#xff0c;打造模块化项目。构建一个开箱即用的项目&#xff0c;从 Git 上拉取下来即可直接进行开发&#xff0c;其中涵盖路由通信、上下拉刷新、网络请求、事件通知、顶部tab封装等功能&#xff0c;项目里调用API为鸿洋大佬的wanAndroidAPI。后期将持续完善&#xf…

【C】数组(array)

数组(array) 数组的概念 数组是一组相同类型元素的集合 数组中存放的是1个或者多个数据&#xff0c;但是数组元素个数不能为0数组中存放的多个数据&#xff0c;类型是相同的 数组分为一维数组和多维数组&#xff0c;多维数组一般比较多见的是二维数组 一维数组的创建和初始…

JAVA面试八股文(五)

#1024程序员节&#xff5c;征文# 在1024程序员节这个特别的日子里&#xff0c;首先&#xff0c;我想对每一位程序员表示最诚挚的祝贺&#xff01;祝愿大家在未来的日子里&#xff0c;能够继续热爱编程、追求卓越&#xff0c;携手共创更美好的科技未来&#xff01;让我们共同庆祝…

Redis Search系列 - 第六讲 基准测试 - Redis Search VS. MongoDB VS. ElasticSearch

目录 一、引言二、Redis Search 2.x版本的性能提升三、Redis Search VS. MongoDB VS. ElasticSearch3.1 测试环境3.2 100%写 - 基准测试3.3 100%读 - 基准测试3.4 混合读/写/搜索 - 基准测试2.5 搜索延迟分析3.6 读延迟分析3.7 写延迟分析3.8 Redis Search VS. ElasticSearch3.…

混个1024勋章

一眨眼毕业工作已经一年了&#xff0c;偶然进了游戏公司成了一名初级游戏服务器开发。前两天总结的时候&#xff0c;本来以为自己这一年没学到多少东西&#xff0c;但是看看自己的博客其实也有在进步&#xff0c;虽然比不上博客里的众多大佬&#xff0c;但是回头看也算是自己的…

micro-app【微前端实战】主应用 vue3 + vite 子应用 vue3+vite

micro-app 官方文档为 https://micro-zoe.github.io/micro-app/docs.html#/zh-cn/framework/vite 子应用 无需任何修改&#xff0c;直接启动子应用即可。 主应用 1. 安装微前端框架 microApp npm i micro-zoe/micro-app --save2. 导入并启用微前端框架 microApp src/main.ts …

手机摄影入门

感觉会摄影的人是能够从生活中发现美的人。 我不太会拍照&#xff0c;觉得拍好的照片比较浪费时间&#xff0c;而且缺乏审美也缺乏技巧&#xff0c;所以拍照的时候总是拍不好。但有时候还是需要拍一些好看的照片的。 心态和审美可能需要比较长时间提升&#xff0c;但一些基础…

Apple Vision Pro市场表现分析:IDC最新数据揭示的真相

随着AR/VR技术逐渐成熟并被更多消费者接受,2024年第二季度(Q2)成为这一领域的一个重要转折点。根据国际数据公司(IDC)发布的最新报告,整个AR/VR市场在本季度经历了显著的增长。接下来,我们将深入探讨Apple Vision Pro在这股增长浪潮中的具体表现。 市场背景 2024年Q2,…

中航资本:股票支撑位和压力位什么意思?股票如何找支撑与压力?

股票支撑位和压力位什么意思&#xff1f; 支撑位是指股票价格在下跌过程中遇到的一个或多个价格方位&#xff0c;这些价位上存在着较强的买盘力气&#xff0c;可以提供满足的支撑&#xff0c;阻止股价继续下跌。 而股票压力位是指股票价格在上涨过程中遇到的一个或多个价格方…

docker部署rustdesk

文章目录 一.ubuntu修改ssh端口二.开放端口三.安装rustDesk四.连接验证 一.ubuntu修改ssh端口 借鉴乌班图Ubuntu 24.04 SSH Server 修改默认端口重启无效 https://bugs.launchpad.net/ubuntu/source/openssh/bug/2069041 sudo vim /etc/ssh/sshd_config sudo systemctl daem…

在windows下利用安装docker加vscode调试OceanBase,

文章目录 一、安装WSL二、安装docker三、 OceanBase安装 -- 运行镜像&#xff0c;配置VScode四、 OceanBase安装 -- 将获取到的文件与docker容器 映射连接 – 参考官方文档 docker安装 在windows上通过docker配置环境并利用vscode调试代码 一、安装WSL 1.可以在任务管理器中&…

⌈ 传知代码 ⌋ 农作物病害分类(Web端实现)

&#x1f49b;前情提要&#x1f49b; 本文是传知代码平台中的相关前沿知识与技术的分享~ 接下来我们即将进入一个全新的空间&#xff0c;对技术有一个全新的视角~ 本文所涉及所有资源均在传知代码平台可获取 以下的内容一定会让你对AI 赋能时代有一个颠覆性的认识哦&#x…

我谈椒盐噪声的统计模型

在成像系统发展长河的早期&#xff0c;椒盐噪声曾经不可避免&#xff0c;但是如今&#xff0c;即使在专用成像设备中&#xff08;如遥感、医学&#xff09;&#xff0c;椒盐噪声也属罕见了。所以&#xff0c;现在在图像处理领域&#xff0c;研究椒盐噪声的去除没有多少实际意义…

kafka 如何减少数据丢失?

大家好&#xff0c;我是锋哥。今天分享关于【kafka 如何减少数据丢失?】面试题&#xff1f;希望对大家有帮助&#xff1b; kafka 如何减少数据丢失? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 Apache Kafka 是一个高吞吐量的分布式消息队列&#xff0c;广泛用…

R实验——logistic回归、LDA、QDAKNN

数据集介绍&#xff1a; mpg&#xff0c;miles per gallon即油耗&#xff0c;这个数据集来自卡内基梅隆大学维护的StatLib库。1983年美国统计协会博览会使用了该数据集。这个数据集是对StatLib库中提供的数据集稍加修改的版本。根据Ross Quinlan(1993)在预测属性“mpg”中的使…

python-PyQt项目实战案例:制作一个视频播放器

文章目录 1. 关键问题描述2. 通过OpenCV读取视频/打开摄像头抓取视频3. 通过PyQt 中的 QTimer定时器实现视频播放4. PyQt 视频播放器实现代码参考文献 1. 关键问题描述 在前面的文章中已经分享了pyqt制作图像处理工具的文章&#xff0c;也知道pyqt通过使用label控件显示图像的…

AI视听新体验!浙大阿里提出视频到音乐生成模型MuVi:可解决语义对齐和节奏同步问题

MuVi旨在解决视频到音乐生成(V2M)中的语义对齐和节奏同步问题。 MuVi通过专门设计的视觉适配器分析视频内容,以提取上下文 和时间相关的特征,这些特征用于生成与视频的情感、主题及其节奏和节拍相匹配的音乐。MuVi在音频质量和时间同步方面表现优于现有基线方法,并展示了其在风…

安装nginx实现多ip访问多网站

一.首先安装nginx [rootserver nginx]# systemctl stop firewalld 关防火墙 [rootserver nginx]# setenforce 0 关selinux [rootserver nginx]# mount /dev/sr0 /mnt 挂载点 [rootserver nginx]# dnf install nginx -y 安装nginx二&#xff0c;添加地址 [rootserver…

Electron入门笔记

Electron入门笔记 ElectronElectron 是什么Electron流程模型创建第一个Electron项目配置自动重启主进程和渲染进程通信打包应用 Electron Electron 是什么 跨平台的桌面应用开发框架使用 JavaScript、HTML 和 CSS 构建桌面应用程序的框架。 嵌入 Chromium和 Node.js Electro…

不使用扩展,win10下网页长截图

安卓手机&#xff0c;各大厂商都会有自带的长截图工具&#xff0c; 用起来很方便&#xff0c; 反而是windows桌面版网页长截图&#xff0c; 偶尔会用下&#xff0c;用得不多&#xff0c; 用一次后下次用又忘记了&#xff0c; 今天正好要用到&#xff0c; 特记录下方便以后查阅…