写在开头:Vue.js 是一个流行的前端框架,广泛应用于构建用户界面和单页应用(SPA)。然而,需要注意的是,Vue2 已经于 2023 年底 正式停止维护。这意味着官方团队将不再为 Vue2 提供功能更新和安全补丁。

尽管如此,Vue2 在业界仍然具有广泛的影响力和使用场景。许多现有的项目仍然基于 Vue2 构建,学习 Vue2 不仅能够帮助我们理解和维护这些遗留项目,还能为我们后续学习 Vue3 打下坚实的基础。Vue3 虽然引入了许多新特性和性能优化,但其核心理念与 Vue2 一脉相承。因此,掌握 Vue2 的基础知识对于顺利过渡到 Vue3 至关重要。

一、引言:为什么组件化开发是Vue的核心?

在Vue.js中,组件化开发是构建大型应用的核心思想。通过组件,我们可以将一个复杂的页面拆分成独立、可复用的模块。例如,一个电商网站的页面可以拆分为商品卡片组件、购物车组件、搜索栏组件等,每个组件负责特定的功能。这种开发模式不仅提高了代码复用率,还让协作开发和后期维护更加高效。

如果你还没有阅读我的第一课时内容,建议先回顾 《Vue2 框架入门第一课:基础概念与环境搭建》。接下来,让我们正式进入 Vue2 组件的世界!

本课时将深入讲解Vue2组件的结构和模板语法,并通过完整示例帮助你彻底掌握这些核心概念。


二、Vue2组件结构详解

(一)组件的三大核心部分

1. template:组件的骨架

  • 作用:定义HTML结构,支持Vue的模板语法(如插值、指令)。

  • 限制:必须有且仅有一个根元素(如外层<div>包裹)。

  • 原理:Vue会将模板编译为虚拟DOM,实现高效的DOM更新。

  • 示例:

 <template>
<div class="container">
<h1>{{ title }}</h1>
</div>
</template>

2. script:组件的逻辑

  • 数据驱动:通过data()函数返回响应式数据(必须是函数,避免组件复用时的数据污染)。

  • 方法定义:在methods中定义事件处理函数。

  • 生命周期钩子:如created()、mounted(),用于在特定阶段执行逻辑。

  • 示例:

<script>
export default {
data() {
return { title: "Hello Vue2!" };
},
methods: {
updateTitle() {
this.title = "数据已更新!";
}
},
mounted() {
console.log("组件已挂载!");
}
};
</script>

3. style:组件的样式

  • 作用域控制:使用scoped属性让样式仅作用于当前组件(原理是为元素添加data-v-xxx属性选择器)。

  • 预处理器支持:可搭配<style lang="scss">使用Sass/Less。

  • 示例:

<style scoped>
.container {
padding: 20px;
background: #f0f0f0;
}
</style>

(二)组件注册的两种方式

1. 全局注册

  • 适用场景:高频复用的基础组件(如按钮、输入框)。

  • 注册方法:

// main.js
import MyButton from './components/MyButton.vue';
Vue.component('MyButton', MyButton);
  • 缺点:全局注册的组件会增大初始包体积。

2. 局部注册

  • 适用场景:仅在特定父组件中使用的组件。

  • 注册方法:

// ParentComponent.vue
import ChildComponent from './ChildComponent.vue';
export default {
components: { ChildComponent }
};

三、Vue2模板语法深度解析

(一)插值表达式:{{ }}的奥秘

  • 基础用法:<p>{{ message }}</p>

  • 表达式支持:可写简单表达式,如{{ count + 1 }}

  • 安全限制:自动转义HTML内容,防止XSS攻击。如需原始HTML,需使用v-html指令。

(二)指令:Vue模板的灵魂

1. 数据绑定

  • v-bind:动态绑定属性,可简写为:
<img :src="data:imageUrl" :alt="imgAlt">

2. 事件监听

  • v-on:监听DOM事件,可简写为@
<button @click="handleClick">点击</button>

3. 条件渲染

  • v-if vs v-show:

  • v-if:直接销毁/创建元素,适合切换频率低的场景。

  • v-show:通过CSS的display控制显示,适合频繁切换。

4. 列表渲染

  • v-for必须搭配:key:
<li v-for="item in items" :key="item.id">{{ item.name }}</li>

为什么需要key? 帮助Vue高效更新虚拟DOM,避免元素错位

四、实战示例:一个完整的待办事项组件

<template>
<div class="todo-list">
<input
v-model="newTodo"
@keyup.enter="addTodo"
placeholder="输入任务后按回车"
>
<ul>
<li v-for="todo in todos" :key="todo.id">
{{ todo.text }}
<button @click="removeTodo(todo.id)">×</button>
</li>
</ul>
<p v-if="todos.length === 0">暂无任务,快去添加吧!</p>
</div>
</template> <script>
export default {
data() {
return {
newTodo: '',
todos: [
{ id: 1, text: '学习Vue2组件' },
{ id: 2, text: '写一篇技术博客' }
]
};
},
methods: {
addTodo() {
if (this.newTodo.trim()) {
this.todos.push({
id: Date.now(),
text: this.newTodo
});
this.newTodo = '';
}
},
removeTodo(id) {
this.todos = this.todos.filter(todo => todo.id !== id);
}
}
};
</script> <style scoped>
.todo-list {
max-width: 400px;
margin: 20px auto;
}
li {
display: flex;
justify-content: space-between;
padding: 8px;
border-bottom: 1px solid #eee;
}
</style>

功能解析:

  1. 使用v-model实现输入框双向绑定

  2. @keyup.enter监听回车事件

  3. v-for渲染列表,:key绑定唯一ID

  4. v-if控制空状态提示

五、避坑指南:常见问题与解决方案

1. 为什么data必须是函数?

避免多个组件实例共享同一数据对象,导致状态污染。

2. v-for和v-if同时使用时的优先级问题

v-for优先级更高,建议先用计算属性过滤数据。

3. 样式冲突问题

使用scoped属性或CSS Modules隔离样式。

六、总结

通过本文的学习,你已掌握:

  • 组件的三大核心结构

  • 模板语法中的关键指令

  • 组件注册的最佳实践

  • 实际开发中的常见避坑技巧

在后续课程中,我们将结合Vuex状态管理和Vue Router路由,打造更复杂的应用。建议读者动手实现示例代码,并尝试扩展功能(如添加任务完成状态)。

写在最后

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

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

《Vue2 框架第二课:组件结构与模板语法详解》的更多相关文章

  1. 简单物联网:外网访问内网路由器下树莓派Flask服务器

    最近做一个小东西,大概过程就是想在教室,宿舍控制实验室的一些设备. 已经在树莓上搭了一个轻量的flask服务器,在实验室的路由器下,任何设备都是可以访问的:但是有一些限制条件,比如我想在宿舍控制我种花 ...

  2. 利用ssh反向代理以及autossh实现从外网连接内网服务器

    前言 最近遇到这样一个问题,我在实验室架设了一台服务器,给师弟或者小伙伴练习Linux用,然后平时在实验室这边直接连接是没有问题的,都是内网嘛.但是回到宿舍问题出来了,使用校园网的童鞋还是能连接上,使 ...

  3. 外网访问内网Docker容器

    外网访问内网Docker容器 本地安装了Docker容器,只能在局域网内访问,怎样从外网也能访问本地Docker容器? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Docker容器 ...

  4. 外网访问内网SpringBoot

    外网访问内网SpringBoot 本地安装了SpringBoot,只能在局域网内访问,怎样从外网也能访问本地SpringBoot? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装Java 1 ...

  5. 外网访问内网Elasticsearch WEB

    外网访问内网Elasticsearch WEB 本地安装了Elasticsearch,只能在局域网内访问其WEB,怎样从外网也能访问本地Elasticsearch? 本文将介绍具体的实现步骤. 1. ...

  6. 怎样从外网访问内网Rails

    外网访问内网Rails 本地安装了Rails,只能在局域网内访问,怎样从外网也能访问本地Rails? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Rails 默认安装的Rails端口 ...

  7. 怎样从外网访问内网Memcached数据库

    外网访问内网Memcached数据库 本地安装了Memcached数据库,只能在局域网内访问,怎样从外网也能访问本地Memcached数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装 ...

  8. 怎样从外网访问内网CouchDB数据库

    外网访问内网CouchDB数据库 本地安装了CouchDB数据库,只能在局域网内访问,怎样从外网也能访问本地CouchDB数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Cou ...

  9. 怎样从外网访问内网DB2数据库

    外网访问内网DB2数据库 本地安装了DB2数据库,只能在局域网内访问,怎样从外网也能访问本地DB2数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动DB2数据库 默认安装的DB2 ...

  10. 怎样从外网访问内网OpenLDAP数据库

    外网访问内网OpenLDAP数据库 本地安装了OpenLDAP数据库,只能在局域网内访问,怎样从外网也能访问本地OpenLDAP数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动 ...

随机推荐

  1. 深入理解 Task.Delay 的定时精度及其影响因素

    1. 原因 在日常开发中,Task.Delay 是一个常用的异步延迟方法.然而,Task.Delay 的定时并不总是非常准确.例如: 系统负载 Task.Delay 的定时精度可能会受到系统负载的影响 ...

  2. hello鸿蒙

    1. 前言 鸿蒙是一款由华为推出的全生态操作系统(探索 | 华为开发者联盟),最近几年发展势头非常强劲,现在开始,让我们来一起认识他吧. 本文针对鸿蒙基本的开发内容做一次概览性的串联. 咱们学习一款新 ...

  3. 零基础学习人工智能—Python—Pytorch学习(十二)

    前言 本文介绍使用神经网络进行实战. 使用的代码是<零基础学习人工智能-Python-Pytorch学习(九)>里的代码. 代码实现 mudule定义 首先我们自定义一个module,创建 ...

  4. GienTech动态|入选软件和信息技术服务竞争力百强;参展世界计算大会、网络安全博览会

    ​ ​ ---- GienTech动态 ---- 中电金信参展广东省网络安全博览会.世界计算机大会 ​ ​ 近期,中电金信跟随中国电子参展2023年广东省网络安全博览会(下简称"博览会&qu ...

  5. 构建模块化 CLI:Lerna + Commander 打造灵活的基础脚手架

    在现代软件开发中,创建 定制化的命令行工具(CLI) 已成为满足公司业务需求的关键一环.这类工具可以辅助执行诸如代码检查.项目初始化等任务.为了提高开发效率并简化维护过程,我们将功能模块化,并通过多个 ...

  6. manim边学边做--移动动画

    在Manim中,其实直线移动的动画非常简单,每个Mobject对象都有animate属性, 通过obj.animate.shift()或者obj.animate.move_to()很容易将对象从一个位 ...

  7. Spring Validation 校验

    概述 在 Web 应用中,客户端提交数据之前都会进行数据的校验,比如用户注册时填写的邮箱地址是否符合规范.用户名长度的限制等等,不过这并不意味着服务端的代码可以免去数据验证的工作,用户也可能使用 HT ...

  8. Qt/C++音视频开发58-逐帧播放/上一帧下一帧/切换播放进度/实时解码

    一.前言 逐帧播放是近期增加的功能,之前也一直思考过这个功能该如何实现,对于mdk/qtav等内核组件,可以直接用该组件提供的接口实现即可,而对于ffmpeg,需要自己处理,如果有缓存的数据的话,可以 ...

  9. 主打一个“小巧灵动”:Vite + Svelte

    作者:来自 vivo 互联网大前端团队-  Wei Xing 在研发小型项目时,传统的 Vue.React 显得太"笨重".本文主要针对开发小型项目的场景,谈谈 Vite+Svel ...

  10. MIPI/LVDS/PCIE/HDMI 设计规范

      参考链接: 1.MIPI/LVDS/PCIE/HDMI 2.接口简介(HDMI .eDP/DP.LVDS.VGA.YPbPr.DVI.MHL.MIPI-DSI.VbyOneHS) 3.干货 | 带 ...