Angular8--父子组件之间的传值

本文详细介绍了Angular中父子组件之间的多种交互方式,包括:输入型绑定、监听子组件事件、setter监听、ngOnChanges钩子、@ViewChild使用、本地变量交互以及通过服务通讯。每种方式都有具体的代码示例和应用场景解析。
摘要由CSDN通过智能技术生成

目录

一、通过输入型绑定把数据从父组件传到子组件。

二、父组件监听子组件的事件

三、通过 setter 截听输入属性值的变化

四、通过ngOnChanges()来截听输入属性值的变化

五、父组件调用@ViewChild()


https://angular.cn/guide/component-interaction官方文档

https://blog.csdn.net/u012967849/article/details/78767294

在该实例中牵扯到的父子文件。

父组件:parent.component.html;    parent.component.ts

子组件:child.component.html;    child.component.ts

一、通过输入型绑定把数据从父组件传到子组件。

@Input :  

父组件给子组件属性值;父组件用子组件的属性值和方法建议用@ViewChild,若用@Input可能需要做数据拦截。
将父作用域中的值“输入”到子作用域中,之后子作用域进行相关处理
@Output :
子作用域触发事件执行响应函数,而响应函数方法体则位于父作用域中,相当于将事件“输出”到父作用域中,在父作用域中处理。
Output一般都是一个EventEmitter的实例,使用实例的emit方法将参数emit到父组件中,触发父组件中对应的事件。

parent.component.html文件中:
<app-child [groupIdName]="serviceSelected?.group_id" (addSuccess)="addSuccessEvent()"></app-child>
child.component.ts文件中:
export class AddServiceComponent {
    // 子组件暴露一个 EventEmitter 属性
  @Output() addSuccess = new EventEmitter();
    // @Input为子组件的属性名groupId指定一个别名groupIdName
  @Input('groupIdName') groupId: number;
  constructor(private http: HttpClient) {}
  handleOk(){
     this.http.post(url, params).subscribe(
     () => {
        this.message.success(this.serviceAddData.id ? '编辑成功' : '添加成功');
        this.addSuccess.emit();
        this.handleCancel();
        this.addForm.form.reset();
      }
    )}
    // 在子组件中使用父组件传递过来的值
    open(data = {}) {
    this.serviceAddData = Object.assign({
      name: '',
      ability_ids: [],
      group_id: this.groupId
    }, data);
  }
}

二、父组件监听子组件的事件

子组件暴露一个 EventEmitter 属性,当事件发生时,子组件利用该属性 emits(向上弹射)事件。父组件绑定到这个事件属性,并在事件发生时作出回应。

子组件的 EventEmitter 属性是一个输出属性,通常带有@Output 装饰器,就像在 VoterComponent 中看到的。

三、通过 setter 截听输入属性值的变化

使用一个输入属性的 setter,以拦截父组件中值的变化,并采取行动。

子组件 NameChildComponent 的输入属性 name 上的这个 setter,会 trim 掉名字里的空格,并把空值替换成默认字符串。

import { Component, Input } from '@angular/core';

@Component({
  selector: 'app-name-child',
  template: '<h3>"{
  {name}}"</h3>'
})
export class NameChildComponent {
  private _name = '';

  @Input()
  set name(name: string) {
    this._name = (name && name.trim()) || '<no name set>';
  }

  get name(): string { return this._name; }
}
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Delicia_Lani

你的鼓励将是我写作的动力。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值