写在开头: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-forv-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. 理解Java FutureTask

    FutureTask实现的功能 它的功能就像他继承的接口一样:Runnable与Future.他实现了一套机制将两者连接起来. Runnable主要方法是run(),用于执行一些程序. Future主 ...

  2. 使用mvn 将 pom文件推送到私服

    1.业务场景 现在我有一个 *.pom文件 需要上传到私服. 比如 spring-cloud-dependencies-2021.0.9.pom 这个时候可以使用命令将这个文件传到私服. 2.上传脚本 ...

  3. Net中手写 事件总线 发布订阅消息

    Net 手写 事件总线 发布订阅消息 前言 今晚打老虎 事件总线是对发布-订阅模式的一种实现.它是一种集中式事件处理机制,允许不同的组件之间进行彼此通信而又不需要相互依赖,达到一种解耦的目的.(项目的 ...

  4. 使用Flex布局的几个小技巧

    前情 Flex 是 Flexible Box 的缩写,意为"弹性布局",用来为盒状模型提供最大的灵活性,任何一个容器都可以指定为 Flex 布局,如果说目前我开发中离不开的布局方式 ...

  5. js 吸顶以及一些获取文档高度等小方法

    1.返回html文档元素document.documentElement 2.文档的高度document.body.clientHeight 3.html文档可视高度==页面可见区域的高度docume ...

  6. Advanced .NET Remoting: 第 8 章 创建连接器

    第 8 章 创建连接器 上一章向您展示了各种类型的连接器,以及它们对于请求的同步和异步处理过程.到目前为止,我一直忽略的一个最为重要的步骤是:初始化连接器和连接器链.连接器通常既不是直接待代码中创建, ...

  7. Docker 使用 buildx 构建多种系统架构支持的镜像

    在 Docker 19.03+ 版本中可以使用 docker buildx build 命令使用 BuildKit 构建镜像.该命令支持 --platform 参数可以同时构建支持多种系统架构的 Do ...

  8. 【shell】远程执行shell|多节点并行执行shell|远程执行注意

    目录 前提条件 shell远程执行 多节点上并行执行命令的三种方法 方法1 使用bash执行命令 方法2 使用clustershell执行命令--还能收集结果 方法3 使用pdsh 执行命令 远程执行 ...

  9. shell中 ${}, ##, %%, :-,:+, ? 的使用

    假设我们定义了一个变量为:file=/dir1/dir2/dir3/my.file.txt 可以用${}分别替换得到不同的值:${file#*/} 删掉第一个/及其左边的字符串:dir1/dir2/d ...

  10. Qt/C++音视频开发48-推流到rtsp服务器

    一.前言 之前已经打通了rtmp的推流,理论上按照同样的代码,只要将rtmp推流地址换成rtsp推流地址,然后格式将flv换成rtsp就行,无奈直接遇到协议不支持的错误提示,网上说要换成rtp,换了也 ...