Vue.js组件开发指南
Vue.js组件开发指南
Vue.js 是一个渐进式的 JavaScript 框架,用于构建用户界面。它的核心是基于组件的开发模式。通过将页面分解为多个独立的、可复用的组件,开发者能够更轻松地构建复杂的应用。本文将深入探讨 Vue.js 组件开发的基础知识,并通过代码示例展示如何开发和使用组件。

1. 组件的基本概念
在 Vue.js 中,组件是独立的、可复用的 Vue 实例。每个组件包含自己的逻辑、模板、样式,并且可以通过 props 和事件与其他组件进行交互。组件可以像HTML标签一样使用,从而使得开发者能够通过模块化的方式构建页面。
1.1 组件的基本结构
Vue.js 组件的基本结构通常包括三部分:
- template: 定义了组件的HTML结构。
- script: 定义了组件的逻辑,如数据、方法和生命周期钩子。
- style: 定义了组件的样式,通常是局部作用域的样式。
<template><div class="my-component"><h1>{{ title }}</h1><p>{{ message }}</p></div>
</template><script>
export default {name: 'MyComponent',data() {return {title: 'Hello Vue!',message: 'This is a basic Vue component'}}
}
</script><style scoped>
.my-component {text-align: center;
}
</style>
1.2 注册组件
在 Vue.js 中,组件可以通过两种方式进行注册:
- 局部注册:仅在某个父组件中使用子组件。
- 全局注册:在整个应用程序中都能使用该组件。
局部注册
局部注册意味着组件只能在声明它的父组件中使用。注册方式如下:
<template><div><my-component></my-component></div>
</template><script>
import MyComponent from './MyComponent.vue';export default {components: {MyComponent}
}
</script>
全局注册
全局注册意味着组件在应用的任何地方都可以使用。通常在应用的入口文件(如 main.js)中注册:
import Vue from 'vue';
import MyComponent from './components/MyComponent.vue';Vue.component('my-component', MyComponent);new Vue({render: h => h(App),
}).$mount('#app');

2. 组件之间的通信
Vue.js 提供了多种方式来实现组件之间的通信。最常用的方式是通过 props 和 events。
2.1 使用 props 向子组件传递数据
props 是一种将数据从父组件传递到子组件的机制。在子组件中定义 props,然后在父组件中传递数据。
子组件:
<template><div><h1>{{ title }}</h1></div>
</template><script>
export default {props: {title: {type: String,required: true}}
}
</script>
父组件:
<template><div><child-component :title="'Hello from Parent'"></child-component></div>
</template><script>
import ChildComponent from './ChildComponent.vue';export default {components: {ChildComponent}
}
</script>
2.2 使用事件向父组件发送消息
当子组件需要与父组件通信时,通常使用事件。Vue.js 提供了 $emit 方法,子组件可以通过它向父组件发送自定义事件,父组件可以通过 v-on 监听该事件。
子组件:
<template><button @click="sendMessage">Click me</button>
</template><script>
export default {methods: {sendMessage() {this.$emit('message', 'Hello from Child');}}
}
</script>
父组件:
<template><div><child-component @message="handleMessage"></child-component><p>{{ message }}</p></div>
</template><script>
import ChildComponent from './ChildComponent.vue';export default {components: {ChildComponent},data() {return {message: ''}},methods: {handleMessage(payload) {this.message = payload;}}
}
</script>
2.3 使用插槽传递内容
Vue 提供了一种机制,允许父组件向子组件传递嵌套内容,这就是 插槽 (Slots)。通过插槽,父组件可以将 HTML 代码块传递给子组件进行渲染。
子组件:
<template><div><slot></slot></div>
</template>
父组件:
<template><div><child-component><p>This is passed from the parent component</p></child-component></div>
</template><script>
import ChildComponent from './ChildComponent.vue';export default {components: {ChildComponent}
}
</script>
Vue 还支持 具名插槽 和 作用域插槽,用于更复杂的内容传递。

3. 组件生命周期
Vue.js 组件有一系列的生命周期钩子,这些钩子函数可以让开发者在组件的不同阶段执行特定逻辑。
3.1 生命周期钩子
常见的生命周期钩子有:
created: 组件实例刚刚创建完成时调用。mounted: 组件被挂载到 DOM 后调用。updated: 组件更新时调用。destroyed: 组件销毁时调用。
<template><div><p>{{ message }}</p></div>
</template><script>
export default {data() {return {message: 'Hello Vue!'}},created() {console.log('Component created');},mounted() {console.log('Component mounted');},updated() {console.log('Component updated');},destroyed() {console.log('Component destroyed');}
}
</script>

4. 组件的复用性和动态组件
4.1 动态组件
Vue 提供了一个 <component> 标签,允许动态切换组件。通过绑定 is 属性,可以根据条件渲染不同的组件。
<template><div><button @click="currentComponent = 'compA'">Load A</button><button @click="currentComponent = 'compB'">Load B</button><component :is="currentComponent"></component></div>
</template><script>
import CompA from './CompA.vue';
import CompB from './CompB.vue';export default {data() {return {currentComponent: 'compA'}},components: {compA: CompA,compB: CompB}
}
</script>

5. 实践示例:TodoList 组件
接下来,我们将开发一个简单的 TodoList 组件,演示组件开发的整个流程。
TodoItem.vue
<template><li :class="{ completed: todo.completed }"><input type="checkbox" v-model="todo.completed" /><span>{{ todo.text }}</span><button @click="$emit('remove')">Remove</button></li>
</template><script>
export default {props: {todo: Object}
}
</script><style scoped>
.completed {text-decoration: line-through;
}
</style>
TodoList.vue
<template><div><h1>Todo List</h1><input v-model="newTodo" @keyup.enter="addTodo" placeholder="Add a todo" /><ul><todo-item v-for="(todo, index) in todos" :key="index" :todo="todo" @remove="removeTodo(index)" /></ul></div>
</template><script>
import TodoItem from './TodoItem.vue';export default {components: {TodoItem},data() {return {newTodo: '',todos: []}},methods: {addTodo() {if (this.newTodo.trim()) {this.todos.push({ text: this.newTodo, completed: false });this.newTodo = '';}},removeTodo(index) {this.todos.splice(index, 1);}}
}
</script><style scoped>
ul {list-style-type: none;padding: 0;
}
</style>

6. 结论
Vue.js 的组件开发模式为构建复杂的应用提供了良好的结构和复用性。通过组件化开发,可以将复杂的用户界面分解
为易于管理的、独立的模块。在实际项目中,合理的组件划分和数据通信方式是确保项目稳定性和可维护性的关键。

相关文章:
Vue.js组件开发指南
Vue.js组件开发指南 Vue.js 是一个渐进式的 JavaScript 框架,用于构建用户界面。它的核心是基于组件的开发模式。通过将页面分解为多个独立的、可复用的组件,开发者能够更轻松地构建复杂的应用。本文将深入探讨 Vue.js 组件开发的基础知识,并…...
【流计算】流计算概论
前言 作者在之前写过一个大数据的专栏,包含GFS、BigTable、MapReduce、HDFS、Hadoop、LSM树、HBase、Spark,专栏地址: https://blog.csdn.net/joker_zjn/category_12631789.html?fromshareblogcolumn&sharetypeblogcolumn&sharerI…...
20230819盘锦锦州葫芦岛自驾
2023年08月19日,上午带娃和老人驾车前往朝阳,逛凤凰山,中午吃了免费的素面味道不错。下午开车去鸟化石公园单独买儿童票43元。晚上驾车到盘锦,住红海滩民宿95元。 2023年08月20日,逛盘锦红海滩一天,有稻田画…...
Unity 与虚幻引擎对比:两大游戏开发引擎的优劣分析
在游戏开发领域,Unity 和虚幻引擎(Unreal Engine)是两款最为知名且广泛使用的引擎。它们各有特点,适合不同类型的开发者和项目。在这篇博客中,我们将深入探讨这两大引擎的核心功能、适用场景、优缺点,以及如…...
UDS_4_传输存储的数据功能单元
目录 一. DTC 二. 0x14服务 三. 0x19服务 3.1 0x19服务 3.2 0x01子功能 3.3 0x02子功能 3.4 0x04子功能 3.5 0x06子功能 3.6 0x0A子功能 一. DTC 》DTC-Diagnostic Trouble Code J1939-73 DTCFormat DTC SPN FMI CM OC 8-1位 8-1位 8-6位 5-1位 8位 7-1位 字节1 字节…...
第二百五十八节 JPA教程 - JPA查询选择两个实体示例
JPA教程 - JPA查询选择两个实体示例 以下JPQL从两个实体中选择。 List l em.createQuery("SELECT d, m FROM Department d, Professor m WHERE d m.department").getResultList();例子 以下代码来自Professor.java。 package cn.w3cschool.common;import java.…...
数据库三级模式结构
三级模式结构 1. 外模式(External Schema)——“用户看到的楼层”2. 概念模式(Conceptual Schema)——“图书馆的核心”3. 内模式(Internal Schema)——“图书馆的地下室”举例1. 概念模式的例子2. 外模式的…...
【小程序websocket最佳实践,有心跳和断线重连】
小程序websocket最佳实践,有心跳和断线重连 封装了WebSocketHandler类,用于管理websocket链接,保证链接的稳定和可靠,该类主要适用于小程序,但其设计思想和方法也适用于其他平台。 export default class WebSocketHa…...
自然资源部最新Nature正刊!!!
2024年8月21日,国际顶级期刊《Nature》发表了自然资源部第二海洋研究所李家彪院士为通讯作者,张涛为第一作者的论文“超慢速扩张加克洋中脊的高变化岩浆增生”。这一成果颠覆了国际海洋学术界半个多世纪以来一直认为的超慢速扩张洋中脊岩浆供给极度贫瘠的…...
git分支-创建、合并、删除
Git会将每次提交串成一条时间线,这条时间线就是一个分支。在最初,只有一个master分支 在目录下创建项目 对目录进行输入 项目被修改 创建dev分支 合并分支 删除dev分支...
Python:Spoonfed - (2-10) 激励选择脚本(搬砖)
https://www.patreon.com/posts/python-spoonfed-31572219 2019年11月15日 利用上一课的选择函数,我们现在可以拼凑出一些脚本(有一些事情我们还没有解释,但应该很容易理解)。以下代码将允许您选择当前所选对象的父对象、顶级对…...
VS Code Python 文件导入提示 xxx Module 不存在解决方式
VS Code Python 文件导入提示 xxx Module 不存在解决方式 引言正文如何打开 setting.json 文件引言 之前在 https://blog.csdn.net/u011699626/article/details/142612579?spm=1001.2014.3001.5501 一文中我们介绍了如何配置 VS code 中 Jupyter Notebook 的文件导入环境,这…...
Android中的Activity与Fragment:深入解析与应用场景
在Android应用开发中,Activity和Fragment是两个核心概念,它们各自扮演着不同的角色,共同构成了用户界面的基础。理解并熟练掌握这两个组件的使用,对于开发高效、灵活且用户友好的Android应用至关重要。本文将深入解析Activity与Fr…...
Flux【lora模型】【真人模型】:极致逼真,小红书真实风格|旅游拍照|景点打卡
大家好我是安琪!!! 今天和大家推荐一款基于Flux训练的真人写实的lora模型:Flux_小红书真实风格丨日常照片丨极致逼真。一看这个模型的命名,就可以猜测出以小红书日常真实拍摄的照片为数据集训练而来,该模型…...
python基础语法--顺序结构
Python中的顺序结构主要包括流程控制语句,如 if、while 和 for 语句。这些语句允许你在程序中定义不同的执行路径,从而根据条件或循环次数来改变代码的执行流程。下面详细介绍这些语句的使用方法和示例。 if 语句 if 语句用于根据某个条件来决定是否执…...
软件游戏运行缺少vcruntime140.dll怎么办?总结四种有效简单方法
1. 文件基本信息 1.1 定义与作用 vcruntime140.dll是Microsoft Visual C 2015 Redistributable Package的一部分,它包含了C运行时库,用于支持使用Visual C开发的Windows应用程序。这个动态链接库(DLL)文件提供了程序执行时所需的…...
(undone) 阅读 MapReduce 论文笔记
参考:https://pdos.csail.mit.edu/6.824/papers/mapreduce.pdf 摘要:简单介绍了 MapReduce 是在大型分布式系统上工作的 Introduction 的内容总结: 1.介绍背景:为什么我们需要分布式系统?MapReduce 的意义是哪些 2.简…...
sql注入工具升级:自动化时间盲注、布尔盲注
项目地址:https://github.com/iamnotamaster/sql-injecter 给我之前写的sql注入脚本进行了一些升级,此文章就是对升级内容的分析,升级内容如下: 使用占位符foo来填充payload里需要经常修改的部分 自动判断循环 支持爆破和二分查…...
字节C++抖音直播一面-面经总结
1、Python和C的区别,Python的程序执行过程是怎样的?C和C呢? 解释型-编译型 不用分号-用分号 自动垃圾回收-delete 相对较慢-执行速度快 丰富的库-标注模板库 .py-解释器-字节码-PVM-输出结果 c-c with class malloc-new 标准库-STL 不重载-函数重载和…...
浅谈stm32的GPIO引脚配置模式
STM32的GPIO(通用输入输出)引脚可以被配置为多种模式,以适应不同的应用场景。下面介绍一些一些常见的STM32 GPIO引脚模式: 模拟输入模式(Analog Input Mode):在这种模式下,GPIO引脚被…...
智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql
智慧工地管理云平台系统,智慧工地全套源码,java版智慧工地源码,支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求,提供“平台网络终端”的整体解决方案,提供劳务管理、视频管理、智能监测、绿色施工、安全管…...
渲染学进阶内容——模型
最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...
【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表
1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...
MySQL 8.0 OCP 英文题库解析(十三)
Oracle 为庆祝 MySQL 30 周年,截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始,将英文题库免费公布出来,并进行解析,帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...
3403. 从盒子中找出字典序最大的字符串 I
3403. 从盒子中找出字典序最大的字符串 I 题目链接:3403. 从盒子中找出字典序最大的字符串 I 代码如下: class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...
SpringCloudGateway 自定义局部过滤器
场景: 将所有请求转化为同一路径请求(方便穿网配置)在请求头内标识原来路径,然后在将请求分发给不同服务 AllToOneGatewayFilterFactory import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; impor…...
大数据学习(132)-HIve数据分析
🍋🍋大数据学习🍋🍋 🔥系列专栏: 👑哲学语录: 用力所能及,改变世界。 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言Ǵ…...
优选算法第十二讲:队列 + 宽搜 优先级队列
优选算法第十二讲:队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...
Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析
Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析 一、第一轮提问(基础概念问题) 1. 请解释Spring框架的核心容器是什么?它在Spring中起到什么作用? Spring框架的核心容器是IoC容器&#…...
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join 1、依赖1.1、依赖版本1.2、pom.xml 2、代码2.1、SqlSession 构造器2.2、MybatisPlus代码生成器2.3、获取 config.yml 配置2.3.1、config.yml2.3.2、项目配置类 2.4、ftl 模板2.4.1、…...
