【vue教程】三. 组件复用和通信(7 种方式)

目录

    • 本章涵盖知识点
    • 回顾
  • 组件开发与复用
    • 组件的创建和注册
      • 全局定义
      • 局部定义
      • 单文件组件(.vue 文件)
      • 组件的注册方式
        • 在实例中注册
        • 在 Vue 中注册
    • 组件的 props
      • 定义 props
      • 传递 props
    • 组件事件
      • 自定义事件的创建和触发
      • 父组件监听子组件事件
      • 父组件处理事件
    • Vue 实现逻辑复用的两种方式
      • 插件 (Plugins)
      • 混入 (Mixins)
    • 内容分发--插槽(Slots)
      • 默认插槽
      • 具名插槽
      • 作用域插槽
      • 使用插槽
      • 作用域插槽的使用
  • 组件通信方式
    • 1. 父子组件通信
      • Props 和 Events
      • 实例演示
    • 2.Event Bus (非官方,但常用)
    • 3.`$attrs` 和 `$listeners` (v-bind 与 v-on)
    • 4.provide/inject (2.2.0+)
      • 实例演示
    • 5. 状态管理库(Vuex)
      • 实例演示
    • 6.ref
    • 7. `$parent` / `$children`
    • 常见使用场景可以分为三类:
    • 结语

本章涵盖知识点

  • 组件的基本概念和作用
  • 组件的创建和注册
  • 组件的 props、事件和自定义事件
  • 三类插槽(slot)的使用
  • 组件间常见的7种通信方式

回顾

在前两篇文章中,我们分别介绍了 Vue.js 的基础知识,包括 Vue 实例、模板语法、数据绑定、事件处理等。本文将主要学习组件化,组件化是 Vue.js 的核心概念之一,它允许开发者将界面拆分成独立、可复用的组件,使得开发大型应用变得更加简单和高效。


在这里插入图片描述

正文开始如果觉得文章对您有帮助,请帮我三连+订阅,谢谢💖💖💖


组件开发与复用

组件的创建和注册

Vue 组件是可复用的 Vue 实例,拥有自己的模板、数据和方法。

全局定义

// 全局注册组件
Vue.component('my-component', {template: '<div>我是全局组件!</div>',
})

局部定义

// 在特定实例中局部注册组件
new Vue({components: {'my-component': {template: '<div>我是局部组件!</div>',},},
})

单文件组件(.vue 文件)

<template><div>A single file component!</div>
</template>
<script>
export default {// component definition
}
</script>

组件的注册方式

在实例中注册
new Vue({components: {'my-component': MyComponentDefinition,},
})
在 Vue 中注册
// 全局注册后可以在任何实例中使用
Vue.component('my-component', MyComponentDefinition)

组件的 props

Props 是父组件向子组件传递数据的一种方式。

定义 props

// 在 JavaScript 中是 camelCase 的
props: ['id', 'name', 'isCompleted']

传递 props

<todo-item id="1" name="Learn Vue" :is-completed="false"></todo-item>

组件事件

组件可以向父组件触发自定义事件。

自定义事件的创建和触发

methods: {notifyParent: function () {this.$emit('custom-event', 'Hello from child!');}
}

父组件监听子组件事件

<child-component @custom-event="handleCustomEvent"></child-component>

父组件处理事件

methods: {handleCustomEvent: function (message) {console.log(message);}
}

Vue 实现逻辑复用的两种方式

插件 (Plugins)

可以全局或局部地添加功能。

// 插件
Vue.use({install(Vue) {Vue.prototype.$myGlobalMethod = function () {// ...}},
})

混入 (Mixins)

可以包含可复用的组件逻辑。

// myMixin.js
// 混入
export default {created: function () {this.hello()},methods: {hello: function () {console.log('hello from mixin!')},},
}
// 定义一个使用混入对象的组件
var Component = Vue.extend({mixins: [myMixin],
})

内容分发–插槽(Slots)

插槽是 Vue 组件用于内容分发的机制。

默认插槽

<!-- 子组件 -->
<template><div><slot>默认插槽内容</slot></div>
</template>

具名插槽

<!-- 子组件 -->
<template><div><slot name="header">Default header</slot><slot name="footer">Default footer</slot></div>
</template>

作用域插槽

<!-- 子组件 -->
<template><ul><li v-for="item in items" :key="item.id"><slot :item="item">text</slot></li></ul>
</template>

使用插槽

<child-component><template v-slot:header>Header content</template><template v-slot:footer>Footer content</template>Default content
</child-component>

作用域插槽的使用

<child-component><template v-slot="slotProps"><div>{{ slotProps.item.defaultText }}</div></template>
</child-component>

组件通信方式

1. 父子组件通信

Props 和 Events

  • Props:父组件可以通过props向子组件传递数据。
  • Events:子组件可以使用$emit向父组件发送事件。

实例演示

<!-- 子组件 -->
<template><button @click="increment">Increment</button>
</template><script>export default {props: ['initialCount'],methods: {increment() {this.$emit('increment', this.initialCount + 1)},},}
</script><!-- 父组件 -->
<template><child-component :initial-count="count" @increment="count++"></child-component>
</template>

2.Event Bus (非官方,但常用)

通过一个事件总线(通常是一个 Vue 实例)来通信。

// 创建一个中央事件总线
const EventBus = new Vue()// 在组件中
EventBus.$emit('custom-event', 'some data')EventBus.$on('custom-event', data => {// 处理事件
})

3.$attrs$listeners (v-bind 与 v-on)

  • $attrs:包含父作用域中不作为 prop 被识别(且获取)的属性绑定(classstyle除外)。
  • $listeners(在 Vue 2.x 中):包含了父作用域中的(不含.native修饰器的)v-on 事件监听器。它可以通过v-on="$listeners"传入内部组件。

4.provide/inject (2.2.0+)

  • provide:祖父组件可以使用provide来提供数据。
  • inject:后代组件可以使用inject来注入数据。

实例演示

// 祖父组件
provide() {return {someData: this.someData};
}
// 后代组件
inject: ['someData'],

5. 状态管理库(Vuex)

Vue 探索之旅:第六站 — Vue 的状态管理

对于复杂应用,可以使用 Vuex 来集中管理状态。

实例演示

// Vuex store
const store = new Vuex.Store({state: {count: 0,},mutations: {increment(state) {state.count++},},
})// 组件中
this.$store.commit('increment')

6.ref

ref:如果在普通的 DOM 元素上使用,引用指向的就是 DOM 元素;如果用在子组件上,引用就指向组件实例

// 父组件
<template><component-a ref="comA"></component-a>
</template>
<script>export default {mounted () {const comA = this.$refs.comA;console.log(comA.title);  // Vue.js}}
</script>
// component-a 子组件
export default {data() {return {title: 'Vue.js',}},
}

7. $parent / $children

使用 $parent$children 可能会导致组件之间的耦合度增加,这可能会使组件更难以重用和测试。因此,通常推荐使用 props 和 events 来实现父子组件之间的通信。

<template><div><h1>这是父组件</h1><child-component1></child-component1><child-component2></child-component2><button @click="callChildMethod">调用子组件方法</button></div>
</template><script>
import ChildComponent1 from './ChildComponent1.vue'
import ChildComponent2 from './ChildComponent2.vue'export default {components: {ChildComponent1,ChildComponent2,},methods: {callChildMethod() {// 遍历所有子组件并调用它们的方法this.$children.forEach(child => {if (child.someMethod) {child.someMethod()}})},},
}
</script>
<!-- ChildComponent1.vue -->
<template><div><h2>我是子组件1</h2><p>父组件的标题是: "{{ parentTitle }}"</p></div>
</template><script>
export default {name: 'ChildComponent1',mounted() {// 访问父组件的属性this.parentTitle = this.$parent.someProperty || '父组件标题'},data() {return {parentTitle: '',}},methods: {someMethod() {alert('子组件1的方法被调用了!')},},
}
</script>

常见使用场景可以分为三类:

  • 父子通信:

    • 父向子传递数据是通过 props,子向父是通过 events($emit)
    • 通过父链 / 子链也可以通信($parent / $children)
    • ref 也可以访问组件实例
    • provide / inject API
    • a t t r s / attrs/ attrs/listeners
  • 兄弟通信:

    • Bus
    • Vuex
  • 跨级通信:

    • Bus
    • Vuex
    • provide / inject API
    • a t t r s / attrs/ attrs/listeners

结语

通过本文,我们详细了解了 Vue 组件化开发的各个方面,包括组件的多种创建和注册方式、props 的定义和传递、自定义事件的创建和触发、以及插槽的多种类型和用法。这些知识将帮助我们构建更加模块化和可复用的 Vue 应用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1486550.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

数字孪生:变电站监测和运维的智能化实践

随着夏季高温天气的到来&#xff0c;我国用电也迎来了高峰。用电负荷持续走高&#xff0c;对全国各地电网运维也迎来了挑战。电力系统作为现代社会的基础设施&#xff0c;其稳定性和可靠性至关重要&#xff0c;变电站则是实现电力系统电力互联互通的枢纽。 在传统变电站中&…

Python文字识别

在对于图片文字识别中&#xff0c;可以采用Python进行&#xff0c;对于下面图片&#xff1a; """ 程序实现思路&#xff1a; 1、怎么从图片中识别文字&#xff1f; 实例化OCR模型进行识别 2、怎么打开文件进行识别&#xff1f; 识别图片中的文字内容 …

SVN 服务 安装部署 Docker(compose) 方式

通过 dockerhub 或者 命令行运行 &#xff1a; docker search svn 查看 svn 的镜像 如命令行&#xff1a; [rootSGP ~]# docker search svn NAME DESCRIPTION STARS OFFICIAL AUTOMATED garethflower…

《0基础》学习Python——第十八讲__爬虫/<1>

一、什么是爬虫 爬虫是一种网络数据抓取的技术。通过编写程序&#xff08;通常使用Python&#xff09;&#xff0c;爬虫可以自动化地访问网页&#xff0c;解析网页内容并提取出所需的数据。爬虫可以用于各种用途&#xff0c;如搜索引擎的索引&#xff0c;数据分析和挖掘&#x…

系统编程--Linux下文件的“其他操作”函数

这里写目录标题 文件存储理论补充dentry、inode 文件其他操作stat函数作用函数原型代码&#xff08;以获取文件大小为例&#xff09;补充&#xff08;获取文件类型&#xff09; lstat函数作用函数原型代码补充&#xff08;获取文件权限&#xff09;总结 tipslink函数作用简介函…

有哪些好用的 AI 学术研究工具和科研工具?

AI视频生成&#xff1a;小说文案智能分镜智能识别角色和场景批量Ai绘图自动配音添加音乐一键合成视频百万播放量https://aitools.jurilu.com/ AI 应用其实分两个层面&#xff0c;第一是模型&#xff0c;第二是应用。现在很多模型厂家都是既做 toC 的对话应用&#xff0c;也做 t…

使用API有效率地管理Dynadot域名,处理域名推送请求

简介 Dynadot是通过ICANN认证的域名注册商&#xff0c;自2002年成立以来&#xff0c;服务于全球108个国家和地区的客户&#xff0c;为数以万计的客户提供简洁&#xff0c;优惠&#xff0c;安全的域名注册以及管理服务。 Dynadot平台操作教程索引&#xff08;包括域名邮箱&…

Nginx学习-相关概念

Nginx学习-相关概念 主要学习几个概念&#xff1a;Nginx&#xff0c;正向代理、反向代理、负载均衡、动静分离。–2020年05月29日 什么是Nginx Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器&#xff0c;同时也提供了IMAP/POP3/SMTP服务。 特点是占有内存少&…

绘制混淆矩阵热力图

Python绘制混淆矩阵热力图 用matplotlib绘制混淆矩阵&#xff0c;可以通过改变 imshow 函数中的 cmap 参数来修改颜色。cmap 参数接受一个 colormap 的名字&#xff0c;你可以选择许多不同的 colormap&#xff0c;例如 ‘viridis’, ‘plasma’, ‘inferno’, ‘magma’, ‘civ…

Rust代码答疑报错|Python一对一辅导答疑

Question 你好&#xff0c;我是悦创。 学员答疑&#xff1a; https://code.bornforthis.cn/?id4e72084d-1eaf-44ed-8067-744671491574https://code.bornforthis.cn/?id664ff169-41d6-409f-a05b-02ed42279759 问题代码&#xff1a; // You can bring module paths into sc…

阶梯-度小满春招算法方向第1批

问题的题面是典型的最长上升子序列问题。求方案数属动态规划问题&#xff0c;可推出以a[i]为最大节点的上升子序列方案数公式 dp[i]{dp[j] , 1<j<i-1&&f[j]1f[i]} &#xff08;f为最大上升子序列&#xff09;。 并且这个方案总数不会超过n&#xff0c;因此也…

C++相关概念和易错语法(24)(map、迭代器分类)

1.map 在上篇文章中&#xff0c;我着重介绍了set&#xff0c;由于map和set同源&#xff0c;所以这次我会着重介绍map别于set的地方 &#xff08;1&#xff09;模板参数 set是以单一的key作为成员变量&#xff0c;而map是以pair作为成员变量&#xff0c;而pair的first作为key来…

mysql对数据库的增删改

目录 DML语句&#xff1a; 增加数据&#xff08;insert语句&#xff09; 增加数据&#xff08;insert into select&#xff09; 修改数据&#xff08;update语句&#xff09; 【where 子句条件】 删除数据&#xff08;delete语句&#xff09; 删除数据&#xff08;trunca…

【北京迅为】《i.MX8MM嵌入式Linux开发指南》-第三篇 嵌入式Linux驱动开发篇-第四十一章 物理地址与虚拟地址

i.MX8MM处理器采用了先进的14LPCFinFET工艺&#xff0c;提供更快的速度和更高的电源效率;四核Cortex-A53&#xff0c;单核Cortex-M4&#xff0c;多达五个内核 &#xff0c;主频高达1.8GHz&#xff0c;2G DDR4内存、8G EMMC存储。千兆工业级以太网、MIPI-DSI、USB HOST、WIFI/BT…

C# 委托函数 delegate

在C#中&#xff0c;委托&#xff08;Delegate&#xff09;是一种特殊的类型&#xff0c;它可以持有对方法的引用。 委托是实现事件的基础。事件本质上是多播委托&#xff0c;允许多个方法被触发 委托允许你将方法作为参数传递给其他方法&#xff0c;或者将方法作为返回值从方法…

基于生物地理算法的MLP多层感知机优化matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 4.1 生物地理算法&#xff08;BBO&#xff09;原理 4.2 多层感知机&#xff08;MLP&#xff09; 4.3 BBO优化MLP参数 5.完整程序 1.程序功能描述 基于生物地理算法的MLP多层感知机优化mat…

昇思25天学习打卡营第23天|ShuffleNet图像分类

ShuffleNet网络介绍 ShuffleNetV1是旷视科技提出的一种计算高效的CNN模型&#xff0c;和MobileNet, SqueezeNet等一样主要应用在移动端&#xff0c;所以模型的设计目标就是利用有限的计算资源来达到最好的模型精度。ShuffleNetV1的设计核心是引入了两种操作&#xff1a;Pointw…

Validated 中常用的注解

Validated 中常用的注解 导入依赖常用注解嵌套校验校验注解的三个参数在post 和 [get](https://so.csdn.net/so/search?qget&spm1001.2101.3001.7020) 请求上使用 添加全局异常处理器&#xff0c;处理参数验证异常 导入依赖 <dependency><groupId>org.spring…

蒙特卡罗模型★★★★★

该博客为个人学习清风建模的学习笔记&#xff0c;部分课程可以在B站&#xff1a;【强烈推荐】清风&#xff1a;数学建模算法、编程和写作培训的视频课程以及Matlab等软件教学_哔哩哔哩_bilibili 目录 1引例&#xff1a;布丰投针实验 2蒙特卡罗方法概述 2.1定义 2.2提出 2…

基于词级ngram的词袋模型对twitter数据进行情感分析

按照阿光的项目做出了学习笔记&#xff0c;pytorch深度学习实战项目100例 基于词级ngram的词袋模型对twitter数据进行情感分析 什么是 N 符&#xff1f; N 格是指给定文本或语音样本中 n 个项目的连续序列。这些项目可以是音素、音节、字母、单词或碱基对&#xff0c;具体取…