写在开头: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. Codeforces Round 797 (Div

    Codeforces Round 797 (Div. 3) Price Maximization 给定\(n\)个商品(n为偶数),每个商品的重量为\(a_i\),你需要将其两两打包,打包的成本为\( ...

  2. 待遇任务执行器(dy-task-actuator-simple)文档

    待遇任务执行器(dy-task-actuator-simple)文档 简介 简称 dtas 吧.这是一个尚在起步但无需太多功能的执行器. 心血来潮,做了一个任务执行器,倒不是一定要重复造轮子,而是没有 ...

  3. 2024年1月Java项目开发指南17:自动接口文档配置

    Knife4j 文档 :https://doc.xiaominfo.com/ 有能力的建议自己去看文档配置,本文仅做参考,因为官方文档会更新,本文不会,以后说不定本文就过时了. ok,我们继续.虽然本 ...

  4. 【报错解决】【Vue】与后端交互时,http与https跨域问题

    问题 xhr.js:220 Mixed Content: The page at 'https://xxx' was loaded over HTTPS, but requested an insec ...

  5. 开源即时通讯IM框架MobileIMSDK的微信小程序端技术概览

    一.基本介绍 MobileIMSDK - 微信小程序端是一套基于微信原生 WebSocket 的即时通讯库: 1)超轻量级.无任何第 3 方库依赖(开箱即用): 2)纯 JS 编写.ES6 语法.高度 ...

  6. 基于Redis有序集合实现滑动窗口限流

    滑动窗口算法是一种基于时间窗口的限流算法,它将时间划分为若干个固定大小的窗口,每个窗口内记录了该时间段内的请求次数.通过动态地滑动窗口,可以动态调整限流的速率,以应对不同的流量变化. 整个限流可以概括 ...

  7. ArrayList源码解析-JDK18

    引言 ArrayList在JDK1.7和1.8中的差距并不大,主要差距以下几个方面: JDK1.7 在JDK1.7中,使用ArrayList list = new ArrayList()创建List集 ...

  8. windows平台下,web与app交互方式探索

    前言 web与app孰优孰劣暂且不争论,也许一方永远代替不了另一方.一个系统有可能同时包含web和app:web和app紧密配合下,才能给用户更好的体验.web如何将信息传达给app?这就是本文要探索 ...

  9. WPF 查找大小相同文件/图片

    假设文件大小一样就表示文件一模一样,是重复文件 using System; using System.Collections.Generic; using System.Linq; using Sys ...

  10. .net core 用 identitymodel 请求token。

    identitymodel  也有在Nuget里搜索和安装. identitymodel 扩展了HttpClient的一些方法用于token请求. 例如:client.RequestTokenAsyn ...