一、Vue3 组件结构详解

1.1 单文件组件(SFC)架构

Vue3采用.vue单文件组件模式,一个典型组件包含三个区块:

<template>
<!-- 组件的HTML模板 -->
</template> <script setup>
// 组件的JavaScript逻辑(推荐使用Composition API)
</script> <style scoped>
/* 组件的CSS样式(scoped表示样式隔离) */
</style>

各区块作用说明:

  • <template>:定义组件视图层,支持所有HTML语法+Vue指令扩展

  • <script setup>:使用setup语法糖简化响应式变量声明(替代Vue2的Options API)

  • <style scoped>:添加scoped属性后,样式仅作用于当前组件(通过自动添加data-v-*属性实现)

1.2 组件导出与组合式API

通过<script setup>语法糖,无需显式导出组件对象:

<script setup>
import { ref } from 'vue' // 响应式数据声明
const count = ref(0)
// 方法定义
const increment = () => count.value++
</script>

组合式API优势:

  1. 更好的逻辑复用(通过自定义Hook)

  2. 更灵活的逻辑组织(按功能而非选项类型拆分)

  3. 更好的TypeScript支持

二、Vue3 模板语法深度解析

2.1 数据绑定核心语法

(1)文本插值:{{ }}

<p>Message: {{ message }}</p>
  • 支持JavaScript表达式:{{ message.split('').reverse().join('') }}

  • 自动响应式更新(数据变化时视图同步更新)

(2)属性绑定:v-bind(简写:

<img :src="dynamicSrc" :alt="imgAlt">
<a :href="url">Link</a>

2.2 常用指令大全

指令 用途 示例
v-if 条件渲染 <div v-if="show">显示内容</div>
v-for 列表渲染 <li v-for="item in items" :key="item.id">{{ item.text }}</li>
v-on 事件监听 <button @click="submit">提交</button>
v-model 双向绑定 <input v-model="username">
v-show 显示/隐藏 <div v-show="isVisible">内容</div>

关键区别说明:

  • v-if vs v-show:前者直接移除DOM元素,后者通过display:none控制

  • v-for必须配合:key使用,用于高效DOM更新

2.3动态样式绑定技巧

<!-- 对象语法 -->
<div :class="{ active: isActive, 'text-danger': hasError }"></div> <!-- 数组语法 -->
<div :class="[activeClass, errorClass]"></div> <!-- 内联样式 -->
<div :style="{ color: activeColor, fontSize: fontSize + 'px' }"></div>

三、实战示例:TodoList组件开发

<template>
<div class="todo-container">
<h2>{{ title }}</h2>
<input v-model="newTodo" @keyup.enter="addTodo">
<ul>
<li v-for="(todo, index) in todos" :key="todo.id">
<span :class="{ completed: todo.done }">{{ todo.text }}</span>
<button @click="toggleTodo(index)">✓</button>
</li>
</ul>
</div>
</template> <script setup>
import { ref } from 'vue' const title = ref('Vue3 Todo List')
const newTodo = ref('')
const todos = ref([
{ id: 1, text: 'Learn Vue3', done: false },
{ id: 2, text: 'Build Project', done: true }
]) const addTodo = () => {
if (newTodo.value.trim()) {
todos.value.push({
id: Date.now(),
text: newTodo.value,
done: false
})
newTodo.value = ''
}
} const toggleTodo = (index) => {
todos.value[index].done = !todos.value[index].done
}
</script> <style scoped>
.todo-container {
max-width: 400px;
margin: 20px auto;
}
.completed {
text-decoration: line-through;
color: #666;
}
</style>

代码解析流程图:

四、最佳实践与常见问题

4.1 组件设计原则

  • 单一职责原则:每个组件只做一件事

  • 合理拆分:当组件超过200行代码时考虑拆分

  • props验证:使用TypeScript或defineProps进行类型校验

4.2 常见错误排查

<!-- 错误示例:直接修改props -->
<button @click="props.count++">Increase</button> <!-- 正确做法:通过emit事件 -->
<button @click="$emit('update-count')">Increase</button>

五、总结

通过本篇章,我们对 Vue3 的组件结构和模板语法有了更清晰的认识。熟练掌握这些基础知识,将为我们后续构建复杂的 Vue3 应用打下坚实的基础。

在接下来的文章中,我们将进一步深入学习 Vue3 的更多高级特性和功能,例如 Composition API、响应式系统、路由管理等。敬请期待!

写在最后

哈喽!大家好呀,我是 Code_Cracke,一名热爱编程的小伙伴。在这里,我将分享一些实用的开发技巧和经验心得。如果你也对编程充满热情,欢迎关注并一起交流学习!

如果你对这篇文章有任何疑问、建议或者独特的见解,欢迎在评论区留言。无论是探讨技术细节,还是分享项目经验,都能让我们共同进步。

深入浅出 Vue3:组件与模板基础全解析的更多相关文章

  1. Spark基础全解析

    我的个人博客:https://www.luozhiyun.com/ 为什么需要Spark? MapReduce的缺陷 第一,MapReduce模型的抽象层次低,大量的底层逻辑都需要开发者手工完成. 第 ...

  2. 用 php 实现一个视图组件和模板引擎——基础

    只要不是做后端接口开发和一些作为守护进程之类的服务器脚本,大多数时候都是在和浏览器打交道,因此合理组织并展现 html 标签是最为常见的工作.一般大家使用框架时,都会自带有一套视图组件和模板引擎. 我 ...

  3. C# 嵌入dll 动软代码生成器基础使用 系统缓存全解析 .NET开发中的事务处理大比拼 C#之数据类型学习 【基于EF Core的Code First模式的DotNetCore快速开发框架】完成对DB First代码生成的支持 基于EF Core的Code First模式的DotNetCore快速开发框架 【懒人有道】在asp.net core中实现程序集注入

    C# 嵌入dll   在很多时候我们在生成C#exe文件时,如果在工程里调用了dll文件时,那么如果不加以处理的话在生成的exe文件运行时需要连同这个dll一起转移,相比于一个单独干净的exe,这种形 ...

  4. Gson全解析(上)-Gson基础

    前言 最近在研究Retrofit中使用的Gson的时候,发现对Gson的一些深层次的概念和使用比较模糊,所以这里做一个知识点的归纳整理. Gson(又称Google Gson)是Google公司发布的 ...

  5. vue3的学习笔记:MVC、Vue3概要、模板、数据绑定、用Vue3 + element ui、react框架实现购物车案例

    一.前端MVC概要 1.1.库与框架的区别 框架是一个软件的半成品,在全局范围内给了大的约束.库是工具,在单点上给我们提供功能.框架是依赖库的.Vue是框架而jQuery则是库. 1.2.MVC(Mo ...

  6. Vite+TS带你搭建一个属于自己的Vue3组件库

    theme: nico 前言 随着前端技术的发展,业界涌现出了许多的UI组件库.例如我们熟知的ElementUI,Vant,AntDesign等等.但是作为一个前端开发者,你知道一个UI组件库是如何被 ...

  7. 【转载】Fragment 全解析(1):那些年踩过的坑

    http://www.jianshu.com/p/d9143a92ad94 Fragment系列文章:1.Fragment全解析系列(一):那些年踩过的坑2.Fragment全解析系列(二):正确的使 ...

  8. Android图片加载框架最全解析(七),实现带进度的Glide图片加载功能

    我们的Glide系列文章终于要进入收尾篇了.从我开始写这个系列的第一篇文章时,我就知道这会是一个很长的系列,只是没有想到竟然会写这么久. 在前面的六篇文章中,我们对Glide的方方面面都进行了学习,包 ...

  9. APPcrawler基础原理解析及使用

    一.背景 一年前,我们一直在用monkey进行Android 的稳定性测试 ,主要目的就是为了测试app 是否会产生Crash,是否会有ANR,页面错误等问题,在monkey测试过程中,实现了脱离Ca ...

  10. XML基础+Java解析XML +几种解析方式的性能比较

    XML基础+Java解析XML 一:XML基础 XML是什么: 可扩展的标记语言 XML能干什么: 描述数据.存储数据.传输(交换)数据. XML与HTML区别: 目的不一样 XML 被设计用来描述数 ...

随机推荐

  1. 【实战问题】-- 并发的时候分布式锁setnx细节

    前面讲解到实战问题]-- 设计礼品领取的架构设计以及多次领取现象解决?,如果出现网络延迟的情况下,多个请求阻塞,那么恶意攻击就可以全部请求领取接口成功,而针对这种做法,我们使用setnx来解决,确保只 ...

  2. Python 学习记录 (4)

    Plotly常见可视化方案:以鸢尾花数据为例 简单介绍: Ploty库也有大量统计可视化方案,并且这些可视化方案具有交互化属性. 主要对鸢尾花数据进行处理与可视化. 所展示的结果为交互界面的截图情况, ...

  3. 使用 SemanticKernel 对接 Ollma

    前面的 2 篇文章已经介绍了 ollama 的基本情况.我们也已经能在本地跟 LLM 进行聊天了.但是如何使用代码跟 LLM 进行交互呢?如果是 C# 选手那自然是使用 SK (SemanticKer ...

  4. CentOS7.8安装k8s

    1, 安装 docker / kubelet # 在 master 节点和 worker 节点都要执行 \# 最后一个参数 1.20.6 用于指定 kubenetes 版本,支持所有 1.20.x 版 ...

  5. 07C++选择结构(1)

    一.基础知识 1.关系运算符 因为我们要对条件进行判断,必然会用到关系运算符: 名称 大于 大于等于 小于 小于等于 等于 不等于 符号 > >= < <= == != 关系表 ...

  6. mybatis-plus逻辑删除不生效的解决办法

    我们在使用mybatis-plus时,一般设备逻辑删除是非常简单的,基本上在yaml等配置文件中做一下配置.然后在字段上注解@TableLogic就可以了.有不清楚的,可以参考https://www. ...

  7. .NET 9 增强 OpenAPI 规范

    在 .NET 9 的更新中,微软增强了原生 OpenAPI.这一变化表明 .NET 正在更加拥抱开放标准,同时让开发者体验更加轻松高效.本文将探讨为何进行这一更改.OpenAPI 的优势,以及如何在 ...

  8. Qt开发经验小技巧101-110

    如果需要在尺寸改变的时候不重绘窗体,则设置属性即可 this->setAttribute(Qt::WA_StaticContents, true); 这样可以避免可以避免对已经显示区域的重新绘制 ...

  9. Qt开源作品6-通用视频控件

    一.前言 在之前做的视频监控系统中,根据不同的用户需要,做了好多种视频监控内核,有ffmpeg内核的,有vlc内核的,有mpv内核的,还有海康sdk内核的,为了做成通用的功能,不同内核很方便的切换,比 ...

  10. Qt音视频开发6-ffmpeg解码处理

    一.前言 采用ffmpeg解码,是所有视频监控开发人员必备的技能,绕不过去的一个玩意,甚至可以说是所有音视频开发人员的必备技能.FFmpeg是一套可以用来记录.转换数字音频.视频,并能将其转化为流的开 ...