写在开头: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. WPF下,控件未响应鼠标属性触发器

    WPF下,控件未响应鼠标属性触发器 记一次自定义控件调试 问题现象 问题分析 解决方式 记一次自定义控件调试 使用WPF写了个自定义控件,其中有个Button按钮,重写了样式模板 <Button ...

  2. openEuler欧拉系统重置root密码

    步骤: 系统启动时,出现如下页面,按e进入内核编辑模式 进入如下页面 按下光标后,找到linux开头这一行,修改ro为rw,并在行尾添加init=/bin/sh,修改后效果如下,在crtl+x保存后开 ...

  3. 【Amadeus原创】IPAD忘记密码重置恢复出厂设置

    打开iTunes,确保您的 iPad 没有连接到电脑. 按住顶部按钮,直到出现关机滑块.拖移这个滑块以将 iPad 关机. 在按住主屏幕按钮的同时,将 iPad 连接到电脑.继续按住主屏幕按钮,直到看 ...

  4. 【C#】【ffmpeg】外部调用线程执行ffmepg读取返回的信息乱码问题

    起因 C#使用FFmpeg获取电脑音视频可以用设备,当返回内容包含中文时,出现乱码问题 解决方案 ffmpeg本身的输出都是使用的错误输出,所以设置的是StandardErrorEncoding,如果 ...

  5. shell 读取文件内容到数组

    在 shell 脚本中,可以使用下面的语法来读取文件内容并将其存储到数组中:   bash 复制代码 array=() while read line; do array+=("$line& ...

  6. Qt开源作品39-日志输出增强版V2022

    一.前言 之前已经开源过基础版本,近期根据客户需求和自己的项目需求,提炼出通用需求部分,对整个日志重定向输出类重新规划和重写代码. 用Qt这个一站式超大型GUI超市做开发已经十二年了,陆陆续续开发过至 ...

  7. [转]Visual Studio调试模式下添加命令行参数的方法

    在VS中向命令行添加参数,即向main()函数传递参数的方法: 右键单击:添加参数的工程-->属性-->配置属性-->调试,在右侧"命令参数"栏输入要添加的参数, ...

  8. [转]CSS、LESS和SASS(SCSS)的区别以及Ruby Sass、LibSass、Node Sass、Dart Sass之间的关系

    随着前端开发的不断发展,CSS也逐渐延伸出了很多新的语言,less和Sass就是其中两种,下面我们就一起来看看它们到底有何区别. SASS和LESS SASS(英文全称:Syntactically A ...

  9. [转]spring-framework-x.x.x.RELEASE-dist下载教程

    原文链接: spring-framework-x.x.x.RELEASE-dist下载教程

  10. 开源轻量级 IM 框架 MobileIMSDK 的Uniapp客户端库已发布

    一.基本介绍 MobileIMSDK-Uniapp端是一套基于Uniapp跨端框架的即时通讯库: 1)超轻量级.无任何第3方库依赖(开箱即用): 2)纯JS编写.ES6语法.高度提炼,简单易用: 3) ...