《Vue2 框架第二课:组件结构与模板语法详解》
写在开头: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-ifvsv-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>
功能解析:
使用
v-model实现输入框双向绑定@keyup.enter监听回车事件v-for渲染列表,:key绑定唯一IDv-if控制空状态提示
五、避坑指南:常见问题与解决方案
1. 为什么data必须是函数?
避免多个组件实例共享同一数据对象,导致状态污染。
2. v-for和v-if同时使用时的优先级问题
v-for优先级更高,建议先用计算属性过滤数据。
3. 样式冲突问题
使用scoped属性或CSS Modules隔离样式。
六、总结
通过本文的学习,你已掌握:
组件的三大核心结构
模板语法中的关键指令
组件注册的最佳实践
实际开发中的常见避坑技巧
在后续课程中,我们将结合Vuex状态管理和Vue Router路由,打造更复杂的应用。建议读者动手实现示例代码,并尝试扩展功能(如添加任务完成状态)。
写在最后
哈喽!大家好呀,我是 Code_Cracke,一名热爱编程的小伙伴。在这里,我将分享一些实用的开发技巧和经验心得。如果你也对编程充满热情,欢迎关注并一起交流学习!如果你对这篇文章有任何疑问、建议或者独特的见解,欢迎在评论区留言。无论是探讨技术细节,还是分享项目经验,都能让我们共同进步。
《Vue2 框架第二课:组件结构与模板语法详解》的更多相关文章
- 简单物联网:外网访问内网路由器下树莓派Flask服务器
最近做一个小东西,大概过程就是想在教室,宿舍控制实验室的一些设备. 已经在树莓上搭了一个轻量的flask服务器,在实验室的路由器下,任何设备都是可以访问的:但是有一些限制条件,比如我想在宿舍控制我种花 ...
- 利用ssh反向代理以及autossh实现从外网连接内网服务器
前言 最近遇到这样一个问题,我在实验室架设了一台服务器,给师弟或者小伙伴练习Linux用,然后平时在实验室这边直接连接是没有问题的,都是内网嘛.但是回到宿舍问题出来了,使用校园网的童鞋还是能连接上,使 ...
- 外网访问内网Docker容器
外网访问内网Docker容器 本地安装了Docker容器,只能在局域网内访问,怎样从外网也能访问本地Docker容器? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Docker容器 ...
- 外网访问内网SpringBoot
外网访问内网SpringBoot 本地安装了SpringBoot,只能在局域网内访问,怎样从外网也能访问本地SpringBoot? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装Java 1 ...
- 外网访问内网Elasticsearch WEB
外网访问内网Elasticsearch WEB 本地安装了Elasticsearch,只能在局域网内访问其WEB,怎样从外网也能访问本地Elasticsearch? 本文将介绍具体的实现步骤. 1. ...
- 怎样从外网访问内网Rails
外网访问内网Rails 本地安装了Rails,只能在局域网内访问,怎样从外网也能访问本地Rails? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Rails 默认安装的Rails端口 ...
- 怎样从外网访问内网Memcached数据库
外网访问内网Memcached数据库 本地安装了Memcached数据库,只能在局域网内访问,怎样从外网也能访问本地Memcached数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装 ...
- 怎样从外网访问内网CouchDB数据库
外网访问内网CouchDB数据库 本地安装了CouchDB数据库,只能在局域网内访问,怎样从外网也能访问本地CouchDB数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Cou ...
- 怎样从外网访问内网DB2数据库
外网访问内网DB2数据库 本地安装了DB2数据库,只能在局域网内访问,怎样从外网也能访问本地DB2数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动DB2数据库 默认安装的DB2 ...
- 怎样从外网访问内网OpenLDAP数据库
外网访问内网OpenLDAP数据库 本地安装了OpenLDAP数据库,只能在局域网内访问,怎样从外网也能访问本地OpenLDAP数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动 ...
随机推荐
- iOS自动化打包输出工具
自动化打包输出工具 做开发的小伙伴有时候会接到自动化打包的需求,公司一般是要求根据一个配置文件来实现自动化配置iOS项目,比如往Xcode工程添加或修改代码.添加Framework.library.S ...
- 真正“搞”懂HTTPS协议19之HTTPS优化
这是本系列的最后一篇了,其实本篇的内容也跟前两篇TLS的握手和优化有关系.其实HTTPS的核心就是TLS的明文握手连接,前两篇我们花了很大的篇幅来聊这些,另外一个就是在TLS握手完成后的密文传输部分了 ...
- 如果XXL-JOB执行器在执行某任务中被重启了,重启后该任务能够被自动弥补调度吗
开心一刻 上午,走路不小心踩了钉子,去打了破伤风 下午,又特么踩到了钉子,我问医生 我:还需要打针吗 医生:你有那钱还是看看眼睛吧 基础回顾 项目基于 xxl-job 2.1.0 实现的分布式调度,所 ...
- Shiro安全框架【认证】+【授权】
1.Shiro的核心架构 Subject:程序主体 Security Manager:安全管理器 Authentication:做认证 Authorizer:做授权 Session Manager:会 ...
- OpenLens 6.3.0 无法查案日志和进入 Pod Shell 解决方法
原因 OpenLens 6.3.0开始移除了Pod的查看日志和进入Pod Shell按钮,无法查看日志和进入Pod操作. 解决办法 OpenLens 6.3.0开始这两个功能以插件形式提供,需下载op ...
- conda虚拟环境中设置环境变量
引言 使用conda创建虚拟环境就是为了方便管理,各个环境之间的模块是独立的.有时候我们在做项目的时候需要设置一下环境变量才方便实用,但是不想影响到其他的虚拟环境,因此不能再系统的环境变量里面设置. ...
- Qt音视频开发01-共享解码线程(耗时一年/性能凶残/至臻完美)
一.前言 大概在8年前就开始用ffmpeg做视频解码的显示,第一个版本就100行代码左右,功能极其简单,就是开个线程解码视频流转成图片发给主界面绘制.时间过得真快,从当初的一胎到现在二胎都上学了三胎计 ...
- Qt编写地图综合应用56-实时动态轨迹
一.前言 实时动态轨迹经历过很多个版本的迭代,此功能最初是一个客户定制的,主要是需要在地图上动态显示GPS的运动轨迹,有个应用场景就是一个带有监控的车子,实时在运动中,后台可以接收到经纬度信息,需要绘 ...
- [转]基于vue-router的matched实现面包屑功能
原文链接:基于vue-router的matched实现面包屑功能
- Dotnetbar自定义DateTimeInput(时间)控件的显示格式,使其同时显示日期和时间
DateTimeInput控件已有的几种格式可以在Format属性中选择: 但这几种格式仍无法满足我的要求怎么办? 例如想将显示格式定为类似这样的格式:2010-06-11 20:02:52,两步搞定 ...