当前位置: 首页 > news >正文

Vue3 基础语法全解析:从入门到实战的核心指南

对于前端开发者来说,Vue3 凭借更优的性能、更灵活的组合式 API 成为主流框架之一。而掌握其基础语法,是搭建高效 Vue 应用的第一步。本文将系统梳理 Vue3 核心基础语法,结合实用案例,帮你快速上手

一、模板语法:数据与 DOM 的桥梁

模板语法是 Vue3 中连接响应式数据与页面 DOM 的核心方式,主要包含三类常用操作:

1. 文本插值

通过双大括号实现数据渲染,支持直接写JavaScript表达式(但仅限单个表达式,不能写语句)

<!-- 基础数据渲染 -->
<div>{{ message }}</div>
<div>姓名:{{ name }}</div><!-- JavaScript 表达式支持 -->
<div>{{ number + 1 }}</div> <!-- 运算 -->
<div>{{ ok ? 'YES' : 'NO' }}</div> <!-- 三元判断 -->
<div>{{ message.split('').reverse().join('') }}</div> <!-- 方法调用 -->

2. 原始 HTML 渲染

若需要渲染包含 HTML 标签的字符串(如后端返回的富文本),需用 v-html 指令,避免 XSS 风险(确保内容来源可信)

<div v-html="rawHtml"></div>

3.属性绑定

数据若需渲染到标签属性(如 id、src、disabled),需用 v-bind 指令,简写为 :,这是区别于文本插值的关键场景

<!-- 完整语法与简写 -->
<div v-bind:id="dynamicId"></div>
<div :id="dynamicId"></div> <!-- 推荐简写 --><!-- 实用案例:图片 src 绑定 -->
<!-- 方式1:组件内直接导入本地图片 -->
<img src="../assets/img/山水.jpg" alt=""><!-- 方式2:JS 中动态导入(更灵活,支持条件切换) -->
<script setup>
import imgurl2 from "@/assets/img/山水.jpg"; // 别名路径
import imgurl3 from "../assets/img/山水.jpg"; // 相对路径
const imgurl1 = "https://ts1.tc.mm.bing.net/th/id/R-C..."; // 网络图片
</script>
<img :src="imgurl1" alt="">
<img :src="imgurl2" alt="">

使用技巧:数据在标签“中间”使用差值({{ }}),在标签“属性”中绑定(:属性名)

二、Class 与 Style 绑定:动态样式控制

Vue3 支持通过指令动态切换 CSS 类和内联样式,灵活应对页面交互场景

1.Class绑定

(1)对象语法:根据条件切换类名

适合单个或多个类的 “开关式” 控制,键为类名,值为布尔值(true 生效,false 失效)

<!-- 直接写对象 -->
<div :class="{ active: isActive, 'text-danger': hasError }"></div><!-- 绑定计算属性(更简洁,适合复杂逻辑) -->
<script setup>
import { ref, computed } from "vue";
const isActive = ref(true);
const hasError = ref(false);
const classObject = computed(() => ({active: isActive.value,"text-danger": hasError.value
}));
</script>
<div :class="classObject"></div>

(2)数组语法,批量绑定类名

适合直接指定多个固定类名,或混合条件判断

<!-- 固定多个类 -->
<div :class="[activeClass, errorClass]"></div><!-- 数组中嵌套对象(条件+固定) -->
<div :class="[{ active: isActive }, errorClass]"></div><!-- 三元表达式(二选一) -->
<div :class="[isActive ? activeClass : '', errorClass]"></div>

2.Style绑定

直接通过数据控制内联样式,语法与 Class 绑定类似

<!-- 直接写样式对象 -->
<div :style="{ color: activeColor, fontSize: fontSize + 'px' }"></div><!-- 绑定样式对象(推荐,更清晰) -->
<script setup>
const styleObject = ref({color: "red",fontSize: "16px"
});
</script>
<div :style="styleObject"></div><!-- 数组语法:合并多个样式对象 -->
<div :style="[baseStyles, overridingStyles]"></div>

三、条件渲染:按需展示DOM

根据数据条件决定是否渲染元素,核心指令为 v-if 系列和 v-show

1. v-if / v-else-if / v-else

真正的条件渲染:满足条件时渲染元素,不满足时销毁元素(DOM 中不存在),支持多分支判断

<!-- 多分支示例 -->
<div v-if="type === 'A'">A</div>
<div v-else-if="type === 'B'">B</div>
<div v-else>Not A/B</div><!-- 模板包装:渲染多个元素但不额外生成父标签 -->
<template v-if="ok"><h1>Title</h1><p>Paragraph 1</p><p>Paragraph 2</p>
</template>

2.v-show

简单的显示隐藏:始终渲染元素,仅通过切换 CSS 的 display 属性控制显示(DOM 中始终存在)

<h1 v-show="ok">Hello!</h1>

3. 核心区别:v-if vs v-show

① v-if:适合 “不常切换” 的场景(如权限控制、初始化渲染),性能消耗在 “销毁 / 重建”

② v-show:适合 “频繁切换” 的场景(如 tabs 切换、按钮显示隐藏),性能消耗在 “CSS 切换”

四、列表渲染:高效遍历数据

通过 v-for 指令遍历数组、对象等可迭代数据,生成重复 DOM 元素,核心是绑定唯一 key

1. v-for 基本用法

(1)遍历数组

支持获取 “元素” 和 “索引”(索引可选)

<!-- 仅遍历元素 -->
<ul><li v-for="item in items" :key="item.id">{{ item.message }}</li>
</ul><!-- 遍历元素+索引 -->
<ul><li v-for="(item, index) in items" :key="item.id">{{ index }} - {{ item.message }}</li>
</ul>

(2)遍历对象

支持获取 “值”“键名” 和 “索引”(键名和索引可选)

<!-- 仅遍历值 -->
<ul><li v-for="value in object" :key="value">{{ value }}</li>
</ul><!-- 遍历值+键名+索引 -->
<ul><li v-for="(value, name, index) in object" :key="name">{{ index }}. {{ name }}: {{ value }}</li>
</ul>

2. key 的重要性

key 是 Vue 识别列表元素唯一性的标识,必须绑定,且有明确规范:

  • 推荐:用数据的唯一标识(如 id、uuid)作为 key,确保元素身份稳定
  • 不推荐:用索引(index)作为 key,若列表有增删改操作,会导致 DOM 复用错误
<!-- 正确示例 -->
<div v-for="item in items" :key="item.id">{{ item.name }}</div><!-- 错误示例(增删列表时慎用) -->
<div v-for="(item, index) in items" :key="index">{{ item.name }}</div>

五、事件处理:响应用户交互

通过 v-on 指令(简写 @)绑定事件,支持方法调用、内联逻辑,配合修饰符简化操作

1.基本事件监听

<!-- 方法处理器(调用组件内方法) -->
<button @click="greet">Greet</button>
<button v-on:click="greet">Greet</button> <!-- 完整语法 --><!-- 内联事件处理器(直接写逻辑) -->
<button @click="count++">Add 1</button>
<button @click="say('hello')">Say hello</button><!-- 访问原生事件对象 $event -->
<button @click="warn('Form cannot be submitted yet.', $event)">Submit
</button>

2.事件修饰符

通过 “.+ 修饰符” 简化常见操作(如阻止默认行为、阻止冒泡),无需手写 e.preventDefault()

<!-- 阻止默认行为(如表单提交、a标签跳转) -->
<form @submit.prevent="onSubmit"></form><!-- 阻止事件冒泡 -->
<a @click.stop="doThis"></a><!-- 修饰符串联(先阻止冒泡,再阻止默认) -->
<a @click.stop.prevent="doThat"></a><!-- 只触发一次(后续点击无效) -->
<a @click.once="doThis"></a><!-- 只在元素本身触发(排除子元素) -->
<div @click.self="doThat">...</div>

实用场景:阻止表单默认提交的3中方式:

①设置按钮 type="button"(非 submit 类型)

②表单标签加 @submit.prevent="onSubmit"

③方法内写 e.preventDefault()

3.按键修饰符

监听键盘事件时,通过修饰符指定具体按键(如 Enter、Ctrl)

<!-- 按下 Enter 键触发 -->
<input @keyup.enter="submit"><!-- 按下 Ctrl+C 触发 -->
<input @keyup.ctrl.67="copy"> <!-- 67 是 C 的 ASCII 码 --><!-- 按下 Ctrl 点击触发 -->
<div @click.ctrl="doSomething">Do something</div>

4.常用事件类型汇总

事件类别常用事件触发时机
鼠标事件click点击元素
dblclick双击元素
mouseover/mouseout鼠标移入 / 移出
键盘事件keydown/keyup按键按下 / 释放
表单事件input输入框内容变化
change元素值改变且失焦
focus/blur元素获得 / 失去焦点
窗口事件resize浏览器窗口大小变化
scroll页面滚动

六、表单输入绑定:双向数据同步

通过 v-model 指令实现 “表单输入” 与 “响应式数据” 的双向绑定,无需手动监听 input 事件更新数据

1.v-model基础用法

覆盖所有常见表单元素:

<!-- 文本输入(单行) -->
<input v-model="message" placeholder="edit me">
<p>Message is: {{ message }}</p><!-- 多行文本 -->
<textarea v-model="message"></textarea><!-- 单个复选框(绑定布尔值) -->
<input type="checkbox" id="checkbox" v-model="checked">
<label for="checkbox">{{ checked }}</label><!-- 多个复选框(绑定数组,值为 checkbox 的 value) -->
<input type="checkbox" id="jack" value="Jack" v-model="checkedNames">
<input type="checkbox" id="john" value="John" v-model="checkedNames"><!-- 单选按钮(绑定选中的 value) -->
<input type="radio" id="one" value="One" v-model="picked">
<input type="radio" id="two" value="Two" v-model="picked"><!-- 下拉选择框 -->
<select v-model="selected"><option disabled value="">Please select one</option><option>A</option><option>B</option><option>C</option>
</select>

2.v-model修饰符

通过修饰符优化数据同步逻辑:

① .lazy:从 “input 事件同步” 改为 “change 事件同步”(失焦后更新数据)

② .number:自动将输入值转为数字(适合数字输入框)

③ .trim:自动过滤输入值的首尾空白字符

<input v-model.lazy="msg">
<input v-model.number="age" type="number">
<input v-model.trim="msg">

七、组合式API实战示例

将上述语法整合到一个完整的 Vue3 组件中,使用组合式 API(script setup)编写:

<template><div class="demo-container"><!-- 文本插值 --><h1>{{ title }}</h1><!-- Class 绑定 --><div :class="{ active: isActive, error: hasError }" class="status-box">动态样式演示</div><!-- 条件渲染 --><p v-if="showMessage">这是一条条件渲染的消息</p><!-- 列表渲染 --><ul class="item-list"><li v-for="item in items" :key="item.id">{{ item.name }}</li></ul><!-- 事件处理 --><button @click="handleClick" class="btn">点击切换样式</button><!-- 表单绑定 --><input v-model="inputValue" placeholder="输入内容" class="input-demo"><p>你输入的是:{{ inputValue }}</p></div>
</template><script setup>
// 导入 Vue 响应式 API
import { ref, reactive } from "vue";// 响应式数据(基础类型用 ref,引用类型用 reactive)
const title = ref("Vue3 基础语法实战");
const isActive = ref(true);
const hasError = ref(false);
const showMessage = ref(true);
const inputValue = ref("");
const items = reactive([{ id: 1, name: "语法1:模板插值" },{ id: 2, name: "语法2:Class 绑定" },{ id: 3, name: "语法3:列表渲染" }
]);// 事件处理方法
const handleClick = () => {console.log("按钮被点击");isActive.value = !isActive.value; // ref 数据需通过 .value 访问hasError.value = !hasError.value;
};
</script><style scoped>
/* 简单样式(scoped 确保样式仅作用于当前组件) */
.demo-container { padding: 20px; }
.status-box { padding: 10px; margin: 10px 0; }
.active { background: #42b983; color: white; }
.error { border: 1px solid #ff4444; }
.item-list { margin: 10px 0; padding-left: 20px; }
.btn { padding: 8px 16px; background: #2c3e50; color: white; border: none; cursor: pointer; }
.input-demo { margin: 10px 0; padding: 8px; width: 300px; }
</style>
http://www.dtcms.com/a/490776.html

相关文章:

  • 莆田建站服务相馆网站建设费用预算
  • shell编程语言---数组函数
  • 黑马点评学习笔记02(Mabatis—plus)
  • 晶体管的定义,晶体管测量参数和参数测量仪器
  • 网站建设需要报告2345网址导航app
  • Java 设计模式——工厂模式:从原理到实战的系统指南
  • VTK实战:vtkSurfaceReconstructionFilter——从点云到三维表面的重建利器
  • 基于微信小程序的篮球场馆预订系统【2026最新】
  • java基础 之 Hash家族_哈希冲突
  • 算法--双指针二
  • RK3576开发板/核心板应用分享之开源鸿蒙
  • 公司网站页脚外包公司的业务员
  • [crackme]028-ArturDents-CrackMe#3
  • 黑盒测试与白盒测试
  • 为安防装上“智慧大脑”:解密视频融合平台EasyCVR的智能分析技术内核
  • 同一设备多账号登录,如何避免消息推送“串门”?
  • 【Linux】认识Framebuffer
  • 深圳做网站公司有哪些公司英文购物网站模板下载
  • 力扣热题100道之560和位K的子数组
  • Pixel-Perfect Depth with Semantics-Prompted Diffusion Transformers,nips 2025
  • 网站可以换主机吗做外贸网站 用国外空间 还是 国内空间 区别
  • **SLAM技术:探索现代定位与地图构建的新纪元**在现代科技领域,同步定位与地图构建(SLAM)技术已成为机器人导航和自动驾驶等领
  • 环保教育展厅建设方案-VR垃圾分类体验游戏-垃圾分类拍拍乐
  • 网站空间怎么更换莱芜在线论坛最新消息
  • 龙岩做网站哪家好如何绑定网站域名
  • [Linux系统编程——Lesson14.基础IO:系统文件IO]
  • golang的一些技巧
  • 高性能 Go 语言带 TTL 的内存缓存实现:精确过期、自动刷新、并发安全
  • ML.NET机器学习框架基本流程介绍
  • Day32_【 NLP _2.RNN及其变体 _(2) LSTM】