【angular教程240109】06 Angular父子组件以及非父子组件之间通讯

【angular教程240109】06 Angular父子组件以及组件之间通讯

目录:

  • 【angular教程240109】06 Angular父子组件以及组件之间通讯
    • 一、子组件获取父组件的数据、执行子组件的方法 父组件给子组件传值-@input
      • 1子组件
    • 二、子组件通过@Output 结合事件驱动实现组件通讯
      • 1 子组件
    • 三、 父组件发送/接受到子组件的数据、父组件执行子组件方法 (综合)
    • 四、 非父子组件通讯
      • 1. 服务与依赖注入(DI)
      • 2. RxJS Subjects 和 Observables
      • 3. NgRx
      • 4. 事件总线(Event Bus)
      • 5. Local Storage 或 Session Storage
      • 6. Query Params 或 Router State

一、子组件获取父组件的数据、执行子组件的方法 父组件给子组件传值-@input

1子组件

<p>header works!-------------</p>
<header>{{title}}--{{msg}}</header>
<br>
<button (click)="getParentMsg()">子组件header里面获取父组件hone传入的数据msg</button>
<br>
<button (click)="getParentRun()">子组件header里面执行父组件home的run方法</button>
<p>header works!-------------</p>
 import { Component, OnInit, Input } from '@angular/core';
@Component({selector: 'app-header',templateUrl: './header.component.html',styleUrls: ['./header.component.scss'],
})
export class HeaderComponent implements OnInit {//接受父组件传来的数据@Input() title: any;@Input() msg: any;//接受父组件传来的方法@Input() run: any;//传入整个父组件@Input() home: any;constructor() {}ngOnInit() {}//执行父组件的run 方法// this.run();getParentMsg() {//获取父组件的数据alert(this.msg);}getParentRun() {//执行父组件的run 方法// this.run();alert(this.home.msg);this.home.run();}
}

二、子组件通过@Output 结合事件驱动实现组件通讯

1 子组件

html

<p>footer works!</p>
<button (click)="sendParent()">我是子组件footer来给父组件广播数据  </button> 
import { Component,OnInit,Output,EventEmitter } from '@angular/core';
// Output 和 EventEmitter 分别用于定义输出属性和创建事件发射器。
// 代码是Angular组件编程中常见的一部分,
// 用于定义一个可以发射事件给其父组件的输出属性。这是实现Angular组件间通信的一种方式。
@Component({selector: 'app-footer',templateUrl: './footer.component.html',styleUrls: ['./footer.component.scss']
})
export class FooterComponent implements OnInit{@Output() private myouter=new EventEmitter;/* 这是一个装饰器(Decorator),用于Angular的组件(Component)中。
@Output() 表明这是一个输出属性,允许该组件向其父组件发送数据。
private outer = new EventEmitter; 
创建了一个新的事件发射器(EventEmitter)实例,并将其赋值给私有属性outer。
这个事件发射器用于发射事件。
*/ngOnInit(): void {throw new Error('Method not implemented.');}sendParent(){alert(123244);this.myouter.emit('号外号外!!!我是一个来自子组件footer的数据')}
}

三、 父组件发送/接受到子组件的数据、父组件执行子组件方法 (综合)

父组件

<hr><p>-------------home works!</p>
<app-header [title]="title"  [msg]="msg"  [home]="this" ></app-header>
<!--Angular组件标签。[title]、[msg]和[home]是属性绑定,它们将父组件的属性值传递给子组件。-->
<!-- <app-footer  (myouter)="run()"></app-footer> -->
<app-footer  (myouter)="run($event)"></app-footer>
<!--这里的run($event)会在myouter事件触发时执行,$event是事件对象。-->
<p>-------------home works!</p>
<hr>
import { Component, OnInit } from '@angular/core';// 定义一个组件,指定选择器、HTML模板和样式文件的URL
@Component({selector: 'app-home', // 定义组件的选择器,用于在HTML中引用templateUrl: './home.component.html', // 指定组件的HTML模板文件styleUrls: ['./home.component.scss'], // 指定组件的样式文件
})
export class HomeComponent implements OnInit {ngOnInit(): void {} // ngOnInit是生命周期钩子,组件初始化时调用public title: string = '我是首页home的title'; // 定义一个公共属性titlepublic msg: string = '我是首页home的msg'; // 定义一个公共属性msg// run方法,被子组件触发的事件处理函数run(e: any) {alert('我是父组件的run方法'); // 显示警告框console.log(e); // 在控制台输出事件对象}handleChild() {} // 定义一个空方法,可能用于未来的子组件交互
}

或,上一片文章:父组件通过@ViewChild主动获取子组件的数据和方法

四、 非父子组件通讯

在Angular中,非父子组件(即兄弟组件或完全不相关的组件)之间的通信可以通过多种方式实现。这些通信方式适用于当组件没有直接的层级关系时。以下是几种常见的通信方法:

1. 服务与依赖注入(DI)

服务是Angular中一个非常强大的特性,可以用来在组件之间共享数据和行为。你可以创建一个可注入的服务来充当中介,通过它来进行组件间的通信。

@Injectable({providedIn: 'root' // 提供在根模块中,这样整个应用都可以访问这个服务
})
export class DataService {private data = new BehaviorSubject<any>(null);setData(value: any) {this.data.next(value);}getData(): Observable<any> {return this.data.asObservable();}
}

任何组件都可以注入这个服务,并使用它来发送或接收数据。

在Angular中,当使用 @Injectable 装饰器并设置 providedIn: ‘root’ 属性时,服务默认是以单例(Singleton)模式提供的。这意味着整个应用中只会创建该服务的一个实例,无论它被注入到多少个组件或其他服务中。

这是一个单例服务的例子:

@Injectable({providedIn: 'root'
})
export class SingletonService {// 这个服务的实例将在整个应用中是唯一的
}

这种单例行为确保了服务的状态和逻辑在应用的不同部分之间保持一致。不过,Angular也允许将服务的作用域限定到特定模块或组件。如果服务在一个Angular模块或组件中的 providers 数组里提供,那么该服务的实例将限定在该模块或组件及其子组件中。这种情况下,服务不再是单例的。

例如:

@NgModule({providers: [NonSingletonService] // 这将为每个导入该模块的消费者创建服务的新实例
})
export class SomeModule { }

在上面的例子中,NonSingletonService 对于导入 SomeModule 的每个消费者来说都是一个新的实例。

总结来说,是否为单例取决于服务是如何提供的:

使用 providedIn: ‘root’ 或提供到 AppModule:服务是应用级别的单例。
提供到特定模块的 providers:每个导入该模块的消费者都会获得服务的新实例。
提供到组件的 providers:每个组件实例都会获得服务的新实例,只用于该组件及其子组件。

2. RxJS Subjects 和 Observables

RxJS是一个库,它提供了强大的数据流控制能力。Angular服务通常使用RxJS中的 Subject 或 BehaviorSubject 来创建可观察的数据流。

 
// 在服务中
private mySubject = new Subject<any>();sendMessage(message: string) {this.mySubject.next(message);
}getMessage(): Observable<any> {return this.mySubject.asObservable();
}// 在发送消息的组件中
this.dataService.sendMessage('Hello from Component A!');// 在接收消息的组件中
this.dataService.getMessage().subscribe(message => {console.log(message); // 输出 'Hello from Component A!'
});

3. NgRx

NgRx是一个基于RxJS的框架,用于在Angular应用中管理状态和允许组件间的通信。它提供了一个全局的状态管理,通过Actions和Reducers来处理状态的更新。

4. 事件总线(Event Bus)

虽然这不是Angular推荐的做法,但在某些情况下,创建一个事件总线(Event Bus)可以作为组件间通信的手段。通常,这涉及到创建一个服务,该服务包含一个 Subject,允许发送和接收消息。

5. Local Storage 或 Session Storage

对于需要持久化数据,或者在用户导航到不同页面时保持数据的场景,你可以使用Web Storage API(如Local Storage或Session Storage)来存储数据。

6. Query Params 或 Router State

如果组件间的通信与路由导航有关,你可以使用路由的Query Params或Router State来传递数据。

选择哪种方法取决于的具体需求,例如:

如果需要一个集中式的状态管理,可能会选择NgRx。
如果希望通过订阅模式来共享数据,可能会选择使用服务和RxJS。
对于更简单的需求,可能使用Local Storage或Session Storage更为直接。
Angular的服务和RxJS通常是最常见和推荐的方法,因为它们提供了一种清晰和响应式的方式来处理应用状态和事件。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

onlyOffice实践-在线协同word、ppt、excel编辑

一、x86 安装docker 18.09.0版本及以上&#xff08;我的版本是18.09.0&#xff09;配置docker阿里源&#xff0c;下载国外的镜像加速&#xff08;参考docker的常规使用总结-CSDN博客&#xff09;docker search 186184848/documentserver选择对应的破解版本下载&#xff08;这个…

脚本编程游戏引擎会遇到哪些问题

在游戏开发中&#xff0c;脚本编程已经成为了一种非常常见的方式&#xff0c;用来实现游戏逻辑和功能。但是脚本编程游戏引擎也可能会面临一些挑战和问题。下面简单的探讨一下都会遇到哪些问题&#xff0c;并且该如果做。 性能问题 脚本语言通常需要运行时解释执行&#xff0…

Android 自动滚动的RecyclerView,手动滑动和自动滑动无缝斜街,手动滑动时数据不重复

概要 做一个自动滑动的列表&#xff0c;用于展示聊天记录或者通知栏信息等&#xff0c;还是使用主流的RecyclerView来做。网上有很多案例&#xff0c;但当手动滑动时会一直无限循环&#xff0c;数据重复的出现&#xff0c;如果想要自动滑动时能无限循环&#xff0c;手动滑动时又…

端到端自动驾驶

自动驾驶主要流程&#xff1a;感知->预测->规划 预测是预测周围目标&#xff08;车、行人、动物等&#xff09;的轨迹&#xff0c;规划是规划自车的运动轨迹。 UniAD[CVPR 2023]: 使用transformer架构&#xff0c;统一自动驾驶流程&#xff0c;完成所有检测&#xff0c…

Springboot对接ceph集群以及java利用s3对象网关接口与ceph集群交互

springboot中引入相关依赖 <dependency><groupId>software.amazon.awssdk</groupId><artifactId>regions</artifactId><version>2.22.13</version></dependency><dependency><groupId>software.amazon.awssdk<…

【Kafka-3.x-教程】-【六】Kafka 外部系统集成 【Flume、Flink、SpringBoot、Spark】

【Kafka-3.x-教程】专栏&#xff1a; 【Kafka-3.x-教程】-【一】Kafka 概述、Kafka 快速入门 【Kafka-3.x-教程】-【二】Kafka-生产者-Producer 【Kafka-3.x-教程】-【三】Kafka-Broker、Kafka-Kraft 【Kafka-3.x-教程】-【四】Kafka-消费者-Consumer 【Kafka-3.x-教程】-【五…

Pycharm 重命名SSH的conda解释器后,提示该解释器不可用

结论 目前已知是BUG&#xff0c;截至投稿日未修复已经提交给youtrack.jetbrains.com&#xff0c;如下图&#xff1a; 解决方法&#xff0c;待更新…

monorepo工程开发交互nodejs命令行程序

前言 [MixedCli](https://zhangfisher.github.io/mixed-cli/)为monorepo应用开发命令行程序提供了一套解决方案&#xff0c;提供了更加友好的命令行开发体验。 第1步&#xff1a;创建工程 以一个典型的monorepo为例开始&#xff1a; flexapppackagescli corevuereact示例…

如何给AVR16芯片解锁

AVRM16核心板本身集成了强大的芯片自解锁功能模块&#xff0c;当由于熔丝位设置错误&#xff0c;导致芯片锁死&#xff0c;无法正常使用时候&#xff0c;可以利用畅学AVR16核心板上的解锁功能给芯片解锁。 &#xff08;如果芯片没有锁死&#xff0c;可以跳过此步骤&#xff09…

ffmpeg解码音频planar模式和packed模式

转载&#xff1a;原文地址&#xff1a; FFmpeg连载4-音频解码-阿里云开发者社区ffmpeg连载系列https://developer.aliyun.com/article/1197520 导读 前面我们介绍了使用FFmpeg解码视频&#xff0c;今天我们使用FFmpeg解码音频。我们的目标将mp4中的音频文件解码成PCM数据&…

python 文本内容随机生成器

这段代码是一个用于生成指定长度的随机文本的函数。主要包括两个函数&#xff1a;generate_text()和generate_other_content()。 generate_text(original_text, length)函数接受两个参数&#xff1a;原始文本和生成文本的长度。该函数的作用是根据原始文本生成指定长度的文本。…

Java异常及网络编程

异常续 throws关键字 当一个方法中使用throw抛出一个非RuntimeException的异常时&#xff0c;就要在该方法上使用throws声明这个异常的抛出。此时调用该方法的代码就必须处理这个异常&#xff0c;否则编译不通过。 package exception; ​ /*** 测试异常的抛出*/ public clas…

【普中开发板】基于51单片机的简易密码锁设计( proteus仿真+程序+设计报告+讲解视频)

基于51单片机的简易密码锁设计 1.主要功能&#xff1a;资料下载链接&#xff1a; 实物图&#xff1a;2.仿真3. 程序代码4. 设计报告5. 设计资料内容清单 【普中】基于51单片机的简易密码锁设计 ( proteus仿真程序设计报告讲解视频&#xff09; 仿真图proteus8.16(有低版本) 程…

vue知识-04

计算属性computed 注意&#xff1a; 1、计算属性是基于它们的依赖进行缓存的 2、计算属性只有在它的相关依赖发生改变时才会重新求值 3、计算属性就像Python中的property&#xff0c;可以把方法/函数伪装成属性 4、computed: { ... } 5、计算属性必须要有…

css的一些属性

我们在写项目的时候&#xff0c;会遇到多种多样的样式&#xff0c;大部分都是由css来实现的&#xff0c;css可以让我们的页面更美观&#xff0c;css通常是配合HTML使用&#xff0c;代码较为简单! 下面我就给大家举几个较为常用的一些css属性。 1.CSS中怎样让元素圆角化&#…

【从零开始学习微服务 | 第一篇】什么是微服务

目录 前言&#xff1a; 架构风格&#xff1a; 单体架构&#xff1a; 分布式架构&#xff1a; 微服务&#xff1a; 总结&#xff1a; 前言&#xff1a; 在当今快速发展的软件开发领域&#xff0c;构建大型应用程序已经成为一项巨大的挑战。传统的单体应用架构往往难以满足…

未完成销量任务的智己汽车突发大规模车机故障,竞争压力不小

2024年刚开年&#xff0c;智己汽车便上演了一出“开门黑”。 近日&#xff0c;不少车主在社交平台发帖&#xff0c;反映智己LS6出现大规模车机故障&#xff0c;包括但不限于主驾驶屏幕不显示车速、档位、行驶里程&#xff0c;左右转盲区显示失效&#xff0c;无转向灯、雷达提醒…

CSS-设置背景图片的大小

要设置背景图片的大小&#xff0c;您可以使用CSS的background-size属性。这个属性允许您指定背景图片的尺寸。 background-size属性可以接受不同的值&#xff0c;包括&#xff1a; auto&#xff1a;保持原始图片的尺寸。cover&#xff1a;将图片缩放到完全覆盖背景区域&#…

ThreadLocal如何使用详解

ThreadLocal概述&#xff1a; ThreadLocal是Java中的一个线程局部变量工具类&#xff0c;它提供了一种在多线程环境下&#xff0c;每个线程都可以独立访问自己的变量副本的机制。ThreadLocal中存储的数据对于每个线程来说都是独立的&#xff0c;互不干扰。 使用场景&#xff1a…

Linux最常用的几个系统管理命令

文章目录 Linux最常用的几个系统管理命令查看网络信息的原初 ifconfig默认无参数使用-s显示短列表配置IP地址修改MTU启动关闭网卡 显示进程状态 ps语法几个实例默认情况显示所有进程查找特定进程信息 任务管理器的 top常规使用显示完整命令设置信息更新次数设置信息更新时间显示…