Angular组件怎么进行通信?父子组件通信的2种方法

本篇文章带大家了解一下angular中的组件通信,介绍一下父子组件间通信、无直接关系组件间通信的方法。

Angular组件怎么进行通信?父子组件通信的2种方法

在实际的应用中我们的组件将会以树形的结构进行关联,所以组件间的关系主要就是:父子关系兄弟关系无直接关系【相关教程推荐:《angular教程》】

准备一下我们的环境:

1、创建一个header组件: ng g c components/header


登录后复制

export class HeaderComponent implements OnInit {  constructor() {}  ngOnInit(): void {}}

登录后复制

2、创建一个title组件: ng g c components/title

{{title}}

登录后复制

export class TitleComponent implements OnInit {  public title: string = '标题';  constructor() {}  ngOnInit(): void {}}

登录后复制

3、创建一个button组件: ng g c components/button

登录后复制

export class ButtonComponent implements OnInit {  public btnName: string = '按钮';  constructor() {}  ngOnInit(): void {}}

登录后复制

直接调用

适用于父子关系组件,注意点是直接调用使得父子组件的耦合性变高,要明确使用确实需要直接调用。

1、将我们的header组件挂载到app中,使得app和header之间形成父子组件关系

2、使用#为我们的组件起一个名称:

3、现在我们的header组件还很空,我们扩展一下,要不然调用什么呢?

export class HeaderComponent implements OnInit {  public name: string = 'HeaderComponent';  printName(): void {    console.log('component name is', this.name);  }}

登录后复制

4、组件扩展好以后我们就可以在父组件app中调用子组件header中的属性和函数了

  调用子组件属性: {{ header.name }}  

登录后复制

5、第4步是在父组件的html模板中进行操作,有时候我们还需要在父组件的ts类中对子组件进行操作,我们接下来接着演示。

6、我们需要用到一个新的装饰器@ViewChild(Component)

export class AppComponent {  title = 'angular-course';  @ViewChild(HeaderComponent)  private header!: HeaderComponent;// 声明周期钩子: 组件及子组件视图更新后调用,执行一次  ngAfterViewInit(): void {    // 调用子组件属性    console.log(this.header.name);    // 调用子组件函数    this.header.printName();  }}

登录后复制

@Input和@Output

适用于父子关系组件

1、我们通过在header组件中定义title,来解耦title组件中直接调用导致扩展复杂的问题

2、为title组件中的title属性增加@Input()装饰器: @Input() public title: string = ‘标题’;

3、为header组件新增title属性并赋值: public title: string = ‘我是新标题’;

4、我们再header组件的html模板中这样来使用title组件:

5、一起看看到现在的效果吧,界面虽然丑,但是下次使用组件时title设置是不是方便一点呢?

image.png

6、以上步骤实现了父组件的数据传递到了子组件中,那么我们接着来看子组件的数据怎么传递到父组件中呢? 我们一起来用@Output()装饰器实现以下吧

7、在title组件的ts类中增加titleChange属性: @Output() public titleChange = new EventEmitter();

8、在title组件的ts类中定时派发数据

ngOnInit(): void {  // 定时将子组件的数据进行派发  setInterval(() => {  this.titleChange.emit(this.title);}, 1500);}

登录后复制

9、现在我们来修改header父组件来接收派发来的数据:


登录后复制

onChildTitleChange(value: any) {console.log('onChildTitleChange: >>', value);}

登录后复制

利用服务单利进行通信

适用于无直接关系组件

image.png

1、既然要通过服务来做通信,那我们就先创建一个服务吧: ng g s services/EventBus,并且我们声明了一个类型为Subject的属性来辅助通信

@Injectable({  providedIn: 'root',})export class EventBusService {  public eventBus: Subject = new Subject();  constructor() {}}

登录后复制

2、我们为了省事就不重新创建组件了,因为我们的header中的按钮组件和title组件就符合没有直接关系的组件。

3、改造一下我们的button组件,并且添加点击事件来触发triggerEventBus函数

export class ButtonComponent implements OnInit {  public btnName: string = '按钮';  constructor(public eventBusService: EventBusService) {}  ngOnInit(): void {}  public triggerEventBus(): void {    this.eventBusService.eventBus.next('我是按钮组件');  }}

登录后复制

4、在title组件中模拟数据的获取

export class TitleComponent implements OnInit {  constructor(public eventBusService: EventBusService) {}  ngOnInit(): void {    this.eventBusService.eventBus.subscribe((value) => {      console.log(value);    });  }}

登录后复制

利用cookie、session或者localstorage进行通信

image.png

1、这个就很简单了,我们还是用title组件和button组件来做演示,这次我们在title组件中将数据保存,在button组件中获取数据。我们仅演示localstorage吧,其他都雷同的。

2、在title组件的ngOnInit()钩子中保存title到localstorage中: window.localStorage.setItem(‘title’, this.title);

3、在button组件中获取数据: const title = window.localStorage.getItem(‘title’);

结语:

本篇我们介绍了Angular的组件通信,为我们拆分后的组件可以进行合理的通信提供了保障,我们到现在组件的使用都是通过引入标签的方式进行。

原文地址:https://juejin.cn/post/6991471300837572638

作者:小鑫同学

更多编程相关知识,请访问:编程入门!!

以上就是Angular组件怎么进行通信?父子组件通信的2种方法的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2709168.html

(0)
上一篇 2025年3月7日 20:29:32
下一篇 2025年3月7日 20:29:38

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • Angular组件学习之浅析内容投影

    本篇文章带大家了解一下angular组件中的内容投影。内容投影和vue中的插槽很类似,在组件封装的时候非常有用,我们一起来体验一下 【相关教程推荐:《angular教程》】 1. 投影一块内容 容器组件这样写   编号1   登录后复制 业…

    2025年3月7日
    200
  • Angular父子组件间怎么进行通信?父子传值的方式浅析

    angular父子组件间怎么进行通信?本篇文章给大家介绍一下angular父子组件传值方式。 通过Input和Ouput传值 父组件:html和ts 登录后复制 public name: string = “jack”;public cha…

    2025年3月7日
    200
  • 带你详细了解Angular中的变更检测

    本篇文章带你详细了解一下Angular中的变更检测,给大家介绍一下Angular 的 DOM 更新机制、变更检测能解决什么问题等。 通过这篇的文章,可以帮助你收获这些知识: Angular 的 DOM 更新是如何做到的?【相关教程推荐:《a…

    2025年3月7日 编程技术
    200
  • Angular怎么构建组件?3种方法介绍

    angular怎么构建组件?本篇文章给大家介绍一下angular创建项目的方法,angular创建组件的三种方式。 一、angular 与angularjs的区别是什么? 命名变化,Angular2 以后官方命名为Angular, 2.0 …

    2025年3月7日 编程技术
    200
  • 浅谈Angular组件之间通信的5种方法

    angular组件间怎么通信?下面本篇文章给大家介绍一下angular组件之间通信的5种方法,有需要的可以参考~ 组件是angular的构建单元,在项目中为了保证组件之间的数据能够来回的传递,angular封装了一些能够实现组件之间通信的方…

    2025年3月7日
    200
  • 手把手教你使用Angular CDK Portal创建动态内容

    之前介绍过原生 API 的动态视图插入,功能上已经可以满足大多数使用场景。不过也有一些缺憾,还没有解决在 Angular 应用外插入内容的需求,指令也不能跟动态插入的组件有输入输出的交互。 好在 Angular 官方提供了一套组件开发套件 …

    2025年3月7日
    200
  • 浅谈Angular中如何使用路由?

    angular中如何使用路由?本篇文章就来带大家了解一下angular中使用路由的方法,快速入门angular路由,希望对大家有所帮助! 路由的概念在前端的框架中得到了广泛的应用,对于路由的感念不做阐述,路由的应用无外乎就是嵌套、传参,高级…

    2025年3月7日
    200
  • 聊聊Angular中的自定义管道

    angular中管道有什么用?特点是什么?怎么自定义管道?下面本篇文章带大家了解一下angular中的管道,介绍一下自定义管道的方法,希望对大家有所帮助! 一、管道的作用 方便我们在模板中对我们的数据进行格式化处理。【相关教程推荐:《ang…

    2025年3月7日
    200
  • 深入了解Angular中的路由

    什么是路由?本篇文章带大家深入了解一下angular中的路由,希望对大家有所帮助! 路由简介 路由是实现单页面应用的一种方式,通过监听hash或者history的变化,渲染不同的组件,起到局部更新的作用,避免每次URL变化都向服务器请求数据…

    2025年3月7日
    200
  • 深入浅析Angular中的依赖注入

    什么是依赖注入?本篇文章带大家了解一下angular中的依赖注入,希望对大家有所帮助! 依赖注入概念: 维基百科对依赖注入的解释:在软件工程中,依赖注入是实现控制反转的一种软件设计模式,一个依赖是一个被其他对象(client)调用的对象(服…

    2025年3月7日
    200

发表回复

登录后才能评论