当前位置: 首页 > news >正文

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 提供了多种方式来实现组件之间的通信。最常用的方式是通过 propsevents

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 框架&#xff0c;用于构建用户界面。它的核心是基于组件的开发模式。通过将页面分解为多个独立的、可复用的组件&#xff0c;开发者能够更轻松地构建复杂的应用。本文将深入探讨 Vue.js 组件开发的基础知识&#xff0c;并…...

【流计算】流计算概论

前言 作者在之前写过一个大数据的专栏&#xff0c;包含GFS、BigTable、MapReduce、HDFS、Hadoop、LSM树、HBase、Spark&#xff0c;专栏地址&#xff1a; https://blog.csdn.net/joker_zjn/category_12631789.html?fromshareblogcolumn&sharetypeblogcolumn&sharerI…...

20230819盘锦锦州葫芦岛自驾

2023年08月19日&#xff0c;上午带娃和老人驾车前往朝阳&#xff0c;逛凤凰山&#xff0c;中午吃了免费的素面味道不错。下午开车去鸟化石公园单独买儿童票43元。晚上驾车到盘锦&#xff0c;住红海滩民宿95元。 2023年08月20日&#xff0c;逛盘锦红海滩一天&#xff0c;有稻田画…...

Unity 与虚幻引擎对比:两大游戏开发引擎的优劣分析

在游戏开发领域&#xff0c;Unity 和虚幻引擎&#xff08;Unreal Engine&#xff09;是两款最为知名且广泛使用的引擎。它们各有特点&#xff0c;适合不同类型的开发者和项目。在这篇博客中&#xff0c;我们将深入探讨这两大引擎的核心功能、适用场景、优缺点&#xff0c;以及如…...

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. 外模式&#xff08;External Schema&#xff09;——“用户看到的楼层”2. 概念模式&#xff08;Conceptual Schema&#xff09;——“图书馆的核心”3. 内模式&#xff08;Internal Schema&#xff09;——“图书馆的地下室”举例1. 概念模式的例子2. 外模式的…...

【小程序websocket最佳实践,有心跳和断线重连】

小程序websocket最佳实践&#xff0c;有心跳和断线重连 封装了WebSocketHandler类&#xff0c;用于管理websocket链接&#xff0c;保证链接的稳定和可靠&#xff0c;该类主要适用于小程序&#xff0c;但其设计思想和方法也适用于其他平台。 export default class WebSocketHa…...

自然资源部最新Nature正刊!!!

2024年8月21日&#xff0c;国际顶级期刊《Nature》发表了自然资源部第二海洋研究所李家彪院士为通讯作者&#xff0c;张涛为第一作者的论文“超慢速扩张加克洋中脊的高变化岩浆增生”。这一成果颠覆了国际海洋学术界半个多世纪以来一直认为的超慢速扩张洋中脊岩浆供给极度贫瘠的…...

git分支-创建、合并、删除

Git会将每次提交串成一条时间线&#xff0c;这条时间线就是一个分支。在最初&#xff0c;只有一个master分支 在目录下创建项目 对目录进行输入 项目被修改 创建dev分支 合并分支 删除dev分支...

Python:Spoonfed - (2-10) 激励选择脚本(搬砖)

https://www.patreon.com/posts/python-spoonfed-31572219 2019年11月15日 利用上一课的选择函数&#xff0c;我们现在可以拼凑出一些脚本&#xff08;有一些事情我们还没有解释&#xff0c;但应该很容易理解&#xff09;。以下代码将允许您选择当前所选对象的父对象、顶级对…...

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应用开发中&#xff0c;Activity和Fragment是两个核心概念&#xff0c;它们各自扮演着不同的角色&#xff0c;共同构成了用户界面的基础。理解并熟练掌握这两个组件的使用&#xff0c;对于开发高效、灵活且用户友好的Android应用至关重要。本文将深入解析Activity与Fr…...

Flux【lora模型】【真人模型】:极致逼真,小红书真实风格|旅游拍照|景点打卡

大家好我是安琪&#xff01;&#xff01;&#xff01; 今天和大家推荐一款基于Flux训练的真人写实的lora模型&#xff1a;Flux_小红书真实风格丨日常照片丨极致逼真。一看这个模型的命名&#xff0c;就可以猜测出以小红书日常真实拍摄的照片为数据集训练而来&#xff0c;该模型…...

python基础语法--顺序结构

Python中的顺序结构主要包括流程控制语句&#xff0c;如 if、while 和 for 语句。这些语句允许你在程序中定义不同的执行路径&#xff0c;从而根据条件或循环次数来改变代码的执行流程。下面详细介绍这些语句的使用方法和示例。 if 语句 if 语句用于根据某个条件来决定是否执…...

软件游戏运行缺少vcruntime140.dll怎么办?总结四种有效简单方法

1. 文件基本信息 1.1 定义与作用 vcruntime140.dll是Microsoft Visual C 2015 Redistributable Package的一部分&#xff0c;它包含了C运行时库&#xff0c;用于支持使用Visual C开发的Windows应用程序。这个动态链接库&#xff08;DLL&#xff09;文件提供了程序执行时所需的…...

(undone) 阅读 MapReduce 论文笔记

参考&#xff1a;https://pdos.csail.mit.edu/6.824/papers/mapreduce.pdf 摘要&#xff1a;简单介绍了 MapReduce 是在大型分布式系统上工作的 Introduction 的内容总结&#xff1a; 1.介绍背景&#xff1a;为什么我们需要分布式系统&#xff1f;MapReduce 的意义是哪些 2.简…...

sql注入工具升级:自动化时间盲注、布尔盲注

项目地址&#xff1a;https://github.com/iamnotamaster/sql-injecter 给我之前写的sql注入脚本进行了一些升级&#xff0c;此文章就是对升级内容的分析&#xff0c;升级内容如下&#xff1a; 使用占位符foo来填充payload里需要经常修改的部分 自动判断循环 支持爆破和二分查…...

字节C++抖音直播一面-面经总结

1、Python和C的区别&#xff0c;Python的程序执行过程是怎样的&#xff1f;C和C呢? 解释型-编译型 不用分号-用分号 自动垃圾回收-delete 相对较慢-执行速度快 丰富的库-标注模板库 .py-解释器-字节码-PVM-输出结果 c-c with class malloc-new 标准库-STL 不重载-函数重载和…...

浅谈stm32的GPIO引脚配置模式

STM32的GPIO&#xff08;通用输入输出&#xff09;引脚可以被配置为多种模式&#xff0c;以适应不同的应用场景。下面介绍一些一些常见的STM32 GPIO引脚模式&#xff1a; 模拟输入模式&#xff08;Analog Input Mode&#xff09;&#xff1a;在这种模式下&#xff0c;GPIO引脚被…...

提升开发效率与视觉舒适度:LxgwWenKai字体全场景配置指南

提升开发效率与视觉舒适度&#xff1a;LxgwWenKai字体全场景配置指南 【免费下载链接】LxgwWenKai LxgwWenKai: 这是一个开源的中文字体项目&#xff0c;提供了多种版本的字体文件&#xff0c;适用于不同的使用场景&#xff0c;包括屏幕阅读、轻便版、GB规范字形和TC旧字形版。…...

ElasticSearch查询集群及设置

Elasticsearch查询集群API示例 查看集群状态及监控 参考资料 https://www.elastic.co/guide/en/elasticsearch/reference/6.6/cluster-health.html https://www.elastic.co/guide/en/elasticsearch/reference/6.6/cluster-nodes-stats.html 查看集群状态 健康状态 curl -XGE…...

YOLOv8环境搭好了,然后呢?5个实用脚本带你玩转目标检测(从预测到训练)

YOLOv8环境搭好了&#xff0c;然后呢&#xff1f;5个实用脚本带你玩转目标检测&#xff08;从预测到训练&#xff09; 刚完成YOLOv8环境配置的开发者常会遇到这样的困境&#xff1a;跑通官方demo后&#xff0c;面对自己的实际需求却无从下手。本文将提供五个即用型Python脚本&a…...

数据迁移技术指南:Obsidian跨平台笔记整合解决方案

数据迁移技术指南&#xff1a;Obsidian跨平台笔记整合解决方案 【免费下载链接】obsidian-importer Obsidian Importer lets you import notes from other apps and file formats into your Obsidian vault. 项目地址: https://gitcode.com/gh_mirrors/ob/obsidian-importer …...

从“连连看”到DFA最小化:一个游戏化思路帮你彻底理解状态等价

从“连连看”到DFA最小化&#xff1a;用游戏化思维破解编译原理难题 编译原理作为计算机科学的核心课程之一&#xff0c;常常让初学者望而生畏。特别是当教材开始讨论"确定性有限自动机&#xff08;DFA&#xff09;最小化"这类概念时&#xff0c;那些抽象的状态转换图…...

luci-app-unblockneteasemusic 插件完整技术指南:实现网易云音乐播放限制解除

luci-app-unblockneteasemusic 插件完整技术指南&#xff1a;实现网易云音乐播放限制解除 【免费下载链接】luci-app-unblockneteasemusic [OpenWrt] 解除网易云音乐播放限制 项目地址: https://gitcode.com/gh_mirrors/lu/luci-app-unblockneteasemusic luci-app-unblo…...

跨域突围与全栈架构演进:从Vite本地代理到Nginx部署+Next.js BFF层实战

摘要&#xff1a;前面10篇博客&#xff0c;我们从SPA架构、React核心Hook、TS类型系统、组件化封装、性能优化&#xff0c;一步步吃透了中后台系统的前端开发全流程&#xff0c;完成了从前端入门到熟练开发的进阶。但想要从“只会写页面的码农”&#xff0c;升级为“懂架构、懂…...

统信系统下如何管理Mysql?

背景 看到标题很多朋友会打趣的问我&#xff1a;“你不是一直用麒麟操作系统做讲解吗&#xff1f;”&#xff0c;其实DBCS和DESK的兼容性太强了&#xff0c;什么操作系统都行&#xff0c;Windows上最容易了&#xff0c;所以我一般不用Windows&#xff0c;下次我用Ubuntu给大家…...

Connect to Oracle Database with JDBC Driver

1. Overview The Oracle Database is one of the most popular relational databases. In this tutorial, we’ll learn how to connect to an Oracle Database using a JDBC Driver. 2. The Database To get us started, we need a database. If we don’t have access to …...

Ling-1T万亿参数模型:高效推理新体验

Ling-1T万亿参数模型&#xff1a;高效推理新体验 【免费下载链接】Ling-1T-FP8 项目地址: https://ai.gitcode.com/hf_mirrors/inclusionAI/Ling-1T-FP8 导语&#xff1a;近日&#xff0c;inclusionAI团队正式发布了Ling系列2.0版本的旗舰模型——Ling-1T-FP8&#xff…...