从零基础到最佳实践:Vue.js 系列(2/10):《模板语法与数据绑定》

news2025/5/25 11:59:07

Vue.js 模板语法与数据绑定:从基础到实践

  • 关键点
    • Vue.js 的模板语法使用 HTML 结合特殊指令(如 v-bindv-on),实现动态界面。
    • 插值({{ }})显示数据,指令控制 DOM 行为,双向绑定简化表单交互。
    • 条件渲染(v-if/v-show)和列表渲染(v-for)是构建动态 UI 的核心工具。
    • 截至 2025 年 5 月,Vue 3 的 Composition API 和 defineModel() 增强了开发体验。
什么是模板语法?

Vue.js 的模板语法基于 HTML,允许开发者通过简单的语法将数据绑定到界面。使用双大括号 {{ }} 显示数据,指令(如 v-bind)动态更新 DOM 属性,事件处理(v-on)响应用户操作。

数据绑定如何工作?

数据绑定让界面与数据保持同步。v-model 实现双向绑定,适合表单输入;v-ifv-for 分别控制条件显示和列表渲染。这些功能让开发者无需手动操作 DOM。

实际应用

这些技术可用于搜索框、动态列表、切换显示等场景。例如,显示用户列表或实时更新输入内容。

下一步

通过本文,你将学会使用 Vue.js 的模板语法和数据绑定,构建交互式界面。后续文章将深入探讨组件开发。


欢迎继续我们的 Vue.js 学习之旅!在上一篇文章中,我们搭建了开发环境并了解了 Vue.js 的 MVVM 模式和响应式原理。本文是系列的第二篇,将聚焦于 模板语法与数据绑定,这是 Vue.js 构建动态用户界面的核心。通过插值、指令、事件处理、条件渲染、列表渲染和双向绑定,你将学会如何让界面随数据变化而更新。我们将以轻松、易懂的语言,结合详细的代码示例和实际应用场景,带你从零基础迈向熟练开发者。基于 2025 年 5 月的 Vue 3(版本 3.5.13),本文使用 Composition API 和最新特性(如 defineModel())。

1. 模板语法简介

Vue.js 的模板语法基于标准 HTML,结合特殊的指令和插值语法,让开发者可以声明式地将数据绑定到 DOM。模板会被编译为高效的 JavaScript 代码,与 Vue 的响应式系统结合,实现数据变化时自动更新界面。

核心特性

  • 插值:使用 {{ }} 显示数据。
  • 指令:以 v- 开头的属性,如 v-bindv-on,控制 DOM 行为。
  • 响应式:数据变化触发视图更新,无需手动操作 DOM。
2. 插值(Interpolation)

插值是 Vue.js 中最简单的数据绑定方式,用于在模板中显示文本内容。最常用的方法是 Mustache 语法(双大括号 {{ }})。

<template>
  <div>
    <p>欢迎,{{ userName }}!</p>
    <button @click="changeName">更改名字</button>
  </div>
</template>

<script setup>
import { ref } from 'vue';

const userName = ref('张伟');

function changeName() {
  userName.value = '李娜';
}
</script>

说明

  • {{ userName }} 显示 userName 的值(初始为“张伟”)。
  • 点击按钮调用 changeName,更新 userName,界面自动显示“李娜”。
  • 插值适用于文本内容,不能用于 HTML 属性(需用 v-bind)。

实际应用

  • 显示用户个人信息,如用户名或欢迎消息。
  • 动态更新通知或状态文本。

注意

  • 插值内容会被转义,防止 XSS 攻击。若需渲染 HTML,使用 v-html(仅限可信内容)。
3. 指令(Directives)

指令是 Vue.js 模板中的特殊属性,以 v- 开头,用于动态控制 DOM 行为。常见指令包括:

  • v-bind:绑定 HTML 属性。
  • v-on:监听事件。
  • v-if/v-show:条件渲染。
  • v-for:列表渲染。
  • v-model:双向绑定。

示例(绑定属性):

<template>
  <div>
    <img :src="imageUrl" alt="风景">
    <p :class="{ active: isActive }">动态样式</p>
  </div>
</template>

<script setup>
import { ref } from 'vue';

const imageUrl = ref('https://example.com/image.jpg');
const isActive = ref(true);
</script>

<style scoped>
.active {
  color: blue;
}
</style>

说明

  • :src="imageUrl"v-bind:src 的简写,动态绑定图片 URL。
  • :class="{ active: isActive }" 根据 isActive 动态应用 CSS 类。
  • 指令支持动态参数,如 :attr="value"

实际应用

  • 动态设置图片、链接或样式。
  • 根据用户状态切换 UI 元素。
4. 事件处理(v-on)

v-on 指令用于监听 DOM 事件,如点击、输入或鼠标移动。它的简写是 @

示例

<template>
  <div>
    <p>点击次数:{{ count }}</p>
    <button @click="increment">点击我</button>
  </div>
</template>

<script setup>
import { ref } from 'vue';

const count = ref(0);

function increment() {
  count.value++;
}
</script>

说明

  • @click="increment" 绑定点击事件,调用 increment 函数。
  • 每次点击,count 增加,界面自动更新。

动态事件
支持动态事件名,如 @[eventName]="handler",适用于根据条件切换事件类型。

实际应用

  • 实现按钮点击计数器。
  • 触发表单提交或导航。
5. 条件渲染(v-if / v-show)

条件渲染控制元素是否显示,Vue.js 提供 v-ifv-show 两种方式:

  • v-if:根据条件添加或移除 DOM 元素,适合不频繁切换的场景。
  • v-show:通过 CSS display 属性切换显示,适合频繁切换的场景。

示例

<template>
  <div>
    <p v-if="isLoggedIn">欢迎回来!</p>
    <p v-else>请登录</p>
    <p v-show="showDetails">详细信息</p>
    <button @click="toggleLogin">切换登录状态</button>
    <button @click="toggleDetails">切换详细信息</button>
  </div>
</template>

<script setup>
import { ref } from 'vue';

const isLoggedIn = ref(false);
const showDetails = ref(true);

function toggleLogin() {
  isLoggedIn.value = !isLoggedIn.value;
}

function toggleDetails() {
  showDetails.value = !showDetails.value;
}
</script>

说明

  • v-if="isLoggedIn" 根据 isLoggedIn 显示不同内容。
  • v-show="showDetails" 切换 display 属性,元素始终存在于 DOM。

实际应用

  • 显示登录/未登录状态。
  • 切换详细信息面板。

v-if vs v-show

特性v-ifv-show
渲染方式添加/移除 DOM 元素切换 CSS display 属性
性能初始渲染慢,切换开销大初始渲染快,切换开销小
适用场景不频繁切换频繁切换
6. 列表渲染(v-for)

v-for 指令用于基于数组或对象渲染列表,是构建动态 UI 的核心工具。

示例(数组渲染):

<template>
  <ul>
    <li v-for="item in items" :key="item.id">{{ item.name }}</li>
  </ul>
</template>

<script setup>
import { ref } from 'vue';

const items = ref([
  { id: 1, name: '苹果' },
  { id: 2, name: '香蕉' },
  { id: 3, name: '樱桃' }
]);
</script>

说明

  • v-for="item in items" 遍历 items 数组,item 是每个元素的别名。
  • :key="item.id" 提供唯一标识,帮助 Vue 优化渲染。

对象渲染

<template>
  <ul>
    <li v-for="(value, key, index) in user" :key="index">
      {{ index }}. {{ key }}: {{ value }}
    </li>
  </ul>
</template>

<script setup>
import { reactive } from 'vue';

const user = reactive({
  name: '张伟',
  age: 30,
  city: '上海'
});
</script>

说明

  • v-for="(value, key, index) in user" 遍历对象属性,value 是值,key 是属性名,index 是索引。
  • 顺序基于 Object.keys(),可能因 JavaScript 引擎而异。

实际应用

  • 显示商品列表或用户表格。
  • 渲染嵌套菜单或树形结构。

注意

  • 始终提供 :key,优先使用唯一 ID,避免使用索引。
  • 不要在同一元素上同时使用 v-ifv-for,优先级为 v-if > v-for
7. 双向绑定(v-model)

v-model 提供双向数据绑定,适合表单输入场景,自动同步输入值和数据。

示例(表单输入):

<template>
  <div>
    <input v-model="searchText" placeholder="输入搜索内容">
    <p>搜索内容:{{ searchText }}</p>
  </div>
</template>

<script setup>
import { ref } from 'vue';

const searchText = ref('');
</script>

说明

  • v-model="searchText" 将输入框的值与 searchText 绑定。
  • 用户输入会更新 searchText,反之亦然。

组件双向绑定(Vue 3.4+):

<template>
  <input v-model="model" placeholder="自定义输入">
</template>

<script setup>
import { defineModel } from 'vue';

const model = defineModel();
</script>
<template>
  <div>
    <CustomInput v-model="inputValue" />
    <p>输入值:{{ inputValue }}</p>
  </div>
</template>

<script setup>
import { ref } from 'vue';
import CustomInput from './CustomInput.vue';

const inputValue = ref('Hello');
</script>

说明

  • defineModel() 创建一个 ref,与父组件的 v-model 同步。
  • 适用于自定义表单组件,如输入框或选择器。

实际应用

  • 实时搜索框,输入时动态过滤列表。
  • 表单编辑,同步用户输入到数据模型。
8. 实际应用场景

以下是模板语法和数据绑定的实际应用:

  • 搜索框:使用 v-model 绑定输入,结合 v-for 动态显示过滤结果。
  • 动态导航:用 v-ifv-show 根据用户权限显示菜单。
  • 商品列表:用 v-for 渲染商品,结合 v-bind 动态设置图片和价格。
  • 交互按钮:用 v-on 响应用户点击,更新界面状态。
9. 最佳实践
实践描述
使用简写语法使用 : 代替 v-bind@ 代替 v-on,提高代码简洁性。
提供唯一 keyv-for 中始终使用 :key,优先使用唯一 ID。
选择合适的条件渲染频繁切换用 v-show,不频繁用 v-if
避免 XSS 风险仅对可信内容使用 v-html,避免用户输入直接渲染。
优化双向绑定在组件中使用 defineModel()(Vue 3.4+)简化 v-model 实现。
10. 2025 年趋势

截至 2025 年 5 月,Vue 3 是主流框架,Composition API 成为首选开发方式。defineModel()(Vue 3.4+)简化了组件双向绑定,Vite 逐渐取代 Vue CLI 成为主流构建工具。模板语法和数据绑定仍是 Vue.js 的核心,广泛应用于动态 UI 开发。

11. 总结

本文详细介绍了 Vue.js 的模板语法和数据绑定,包括插值、指令、事件处理、条件渲染、列表渲染和双向绑定。通过这些技术,你可以轻松构建交互式界面。下一篇文章将探讨组件开发,包括定义、注册和通信,带你迈向模块化开发。

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

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

相关文章

iOS 使用 - 设置 来电震动/关闭震动

来电震动是一个很直观的老功能。但到了iOS 18&#xff0c;苹果却把震动功能的开关藏得越来越深&#xff0c;甚至分散在不同的菜单里&#xff0c;让用户难以找到。这里记录分享设置方法&#xff1a; 1. 震动开关的路径 设置 → 通用 → 辅助功能 → 触控 → 震动 2. 来电震动…

[C语言初阶]扫雷小游戏

目录 一、原理及问题分析二、代码实现2.1 分文件结构设计2.2 棋盘初始化与打印2.3 布置雷与排查雷2.4 游戏主流程实现 三、后期优化方向 在上一篇文章中&#xff0c;我们实现了我们的第二个游戏——三子棋小游戏。这次我们继续结合我们之前所学的所有内容&#xff0c;制作出我们…

谷歌medgemma-27b-text-it医疗大模型论文速读:多语言大型语言模型医学问答基准测试MedExpQA

《MedExpQA: 多语言大型语言模型医学问答基准测试》论文解析 一、引言 论文开篇指出大型语言模型&#xff08;LLMs&#xff09;在医学领域的巨大潜力&#xff0c;尤其是在医学问答&#xff08;QA&#xff09;方面。尽管LLMs在医学执照考试等场景中取得了令人瞩目的成绩&#…

DeepSeek+白果AI论文:开启答辩PPT生成的「智能双引擎」时代

2025学术答辩革新&#xff1a;DeepSeek与白果AI论文的黄金协同方案 白果Ai论文&#xff0c;论文写作神器~ https://www.baiguoai.com/ 在学术答辩的「战场」上&#xff0c;「选题创新不足」「数据可视化低效」「PPT逻辑断裂」等痛点长期困扰研究者。DeepSeek与白果AI论文的深…

SDC命令详解:使用set_logic_dc命令进行约束

相关阅读 SDC命令详解https://blog.csdn.net/weixin_45791458/category_12931432.html?spm1001.2014.3001.5482 set_logic_dc命令可以将当前设计中的输入端口为不关心&#xff08;设置端口的driven_by_dont_care属性为true&#xff09;&#xff0c;该端口在综合是可以被认为是…

小程序涉及提供提供文本深度合成技术,请补充选择:深度合成-AI问答类目

一、问题描述 最近新项目AI咨询小程序审核上线&#xff0c;按照之前小程序的流程&#xff0c;之前审核&#xff0c;提示审核不通过&#xff0c;审核不通过的原因&#xff1a;小程序涉及提供提供文本深度合成技术 (如: AI问答) 等相关服务&#xff0c;请补充选择&#xff1a;深…

基于亚博K210开发板——lvgl 图形化实验

开发板 亚博K210开发板 实验目的 本次测试主要学习 K210 图形化操作界面的功能。 实验元件 LCD 显示屏、FT6236 触摸板 lvgl 图形化库简介 LVGL&#xff08;轻度综合图形界面库&#xff09;是一个免费开源图形库&#xff0c;具有使用方便&#xff0c;画面美观&#xff…

LABVIEW 通过节点属性动态改变数值显示控件的方法

在 LabVIEW 里&#xff0c;能够借助属性节点来改变数值输入控件的禁用状态。下面为你介绍具体的操作步骤&#xff1a; 1. 创建或开启前面板 要先创建一个数值输入控件&#xff0c;操作方法是&#xff1a;点击 "控件" 选板&#xff0c;接着选择 "新式→数值→数…

信息安全管理与评估2025上海卷

上海市“星光计划”第十一届职业院校技能大赛 &#xff08;高职组&#xff09; “信息安全管理与评估”赛项 任务书 一、 赛项时间共计4小时。二、 赛项信息 竞赛阶段 任务阶段 竞赛任务 竞赛时间 分值 第一阶段 平台搭建与安全设备 配置防护 任务1 网络平台搭建 2…

Linux目录介绍+Redis部署(小白篇)

目录 &#x1f451;Linux基础✨【目录】 &#x1f451;Redis 安装1.下载压缩包2.解压3.安装编译环境4.安装到本地5.设置开机自启 &#x1f451;Linux 自启服务 &#x1f451;Linux基础 虽然在大二的时候学过Linux&#xff0c;但是很多基础知识都忘了&#xff0c;想再次从基础捡…

Python 基础语法速查手册:从入门到精通

Python 作为最受欢迎的编程语言之一&#xff0c;以其简洁易读的语法和强大的功能吸引了大量开发者。本文全面汇总 Python 基础语法知识&#xff0c;帮助初学者快速掌握核心概念&#xff0c;并为后续深入学习打下坚实基础。 1. Python 基础语法结构 1.1 代码结构与缩进规则 Py…

论文阅读笔记——Emerging Properties in Unified Multimodal Pretraining

BAGEL 论文 商业闭源系统与学术/开源模型的差距很大&#xff0c;BAGEL 旨在通过开源统一架构大规模交错数据主要解决&#xff1a; 架构割裂&#xff1a;理解/生成分属两条网络&#xff0c;信息被压缩在少量条件 token 中&#xff0c;长上下文推理受限。数据贫乏&#xff1a;主…

JAVA批量发送邮件(含excel内容)

EmailSenderHtmlV1 是读取配置文件《批量发送邮件.xlsx》&#xff0c;配置sheet获取 发件人邮箱 邮箱账号 口令&#xff0c;发送excel数据sheet获取收件人邮箱 抄送人邮箱 邮件标题 第N行开始(N>1,N0默认表头) 第M行结束(M>1,M0默认表头) 附件文件夹…

Linux(Ubuntu)新建文件权限继承问题

当你在一个工作目权限为777的文件下&#xff0c;新建一个文件的时候&#xff0c;就有可能发生&#xff0c;新建的这个文件&#xff0c;权限和其他文件&#xff0c;或者工作目录不一致的问题&#xff0c;我们不可能每次新建一个文件&#xff0c;就要 sudo chmod -R 777 /PATH 所…

Java中的String的常用方法用法总结

1.1 String &#xff08;1&#xff09;声明 &#xff08;2&#xff09;字符串常量 存储字符串数据的容器&#xff1a;private final char value[] 字符串常量都存储在字符串常量池&#xff08;StringTable&#xff09;中 字符串常量池不允许存放两个相同的字符串常量 &#xff…

QGIS如何打开 ARCGIS的mxd工程文件

“SLYR”是一款由著名开源组织“北路开源”开发的一套QGIS兼容和转换ARCGIS样式、工程、设置信息的插件&#xff01;其主要功能为&#xff1a; 最近项目需要&#xff0c;我使用了一些功能&#xff0c;发现其对中文环境及中文信息支持不太好&#xff0c;还有一些其它BUG&#xf…

基于微信小程序的智能问卷调查系统设计与实现(源码+定制+解答)基于微信生态的问卷管理与数据分析系统设计

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ等平台…

React 如何封装一个可复用的 Ant Design 组件

文章目录 前言一、为什么需要封装组件&#xff1f;二、 仿antd组件的Button按钮三、封装一个可复用的表格组件 (实战)1. 明确需求2. 设计组件 API3. 实现组件代码4. 使用组件 三、封装组件的最佳实践四、进阶优化 总结 前言 作为一名前端开发工程师&#xff0c;在日常项目中&a…

Canvas SVG BpmnJS编辑器中Canvas与SVG职能详解

Canvas详解与常见API 一、Canvas基础 核心特性 • 像素级绘图&#xff1a;Canvas是基于位图的绘图技术&#xff0c;通过JavaScript操作像素实现图形渲染&#xff0c;适合动态、高性能场景&#xff08;如游戏、数据可视化&#xff09;。 • 即时模式&#xff1a;每次绘制需手动…

dify多实例部署,一台机器部署多个dify实例

dify多实例部署 目的 实现在一台机器上&#xff0c;部署多个dify的实例。比如一个部署1.2版本&#xff0c;一个部署1.3版本。废话没有&#xff0c;直接上干货。 前提 你的电脑已经部署了一个dify实例&#xff0c;并成功运行。比如已经部署成功0.15.3版本。 步骤如下&#…