Angular学习笔记:组件之间通信

本文是自己的学习笔记,主要参考资料如下。

- B站《2020最新Angular实战教程》,老陈打码制作,https://www.bilibili.com/video/BV1i741157Fj?p=2。



这里写目录标题

  • 1、组件通信简述
    • 1.1、什么是父子页面
    • 1.2、父页面向子页面传值
      • 1.2.2、子页面中定义接收器
      • 1.2.3、父页面传值给接收器
        • 1.2.3.1、传值的多种写法
    • 1.3、子页面向父页面传值
      • 1.3.1、子页面定义发送器
      • 1.3.2、父页面中定义接收逻辑
      • 1.3.3、绑定子页面发送器和父页面接收方法
    • 1.4、信息双向绑定
      • 1.4.1、双向绑定的实现


1、组件通信简述

组件之间的通信简单来说就是A组件中的一个变量传递给B组件。而组件之间的通信只限于父子组件之中


1.1、什么是父子页面

我们创建一个新页面child.component.ts
在这里插入图片描述
然后我们在主页面中直接引用这个`````

在这里插入图片描述
那么app.componentchild.component就是父子页面,前者是父页面,后者是子页面。



1.2、父页面向子页面传值

首先,在父页面中定义一个变量sendChildMsg。之后要将这个变量传递给子页面
在这里插入图片描述



1.2.2、子页面中定义接收器

先在子页面的ts中声明Input
在这里插入图片描述
之后使用@Input定义接收器。在这里插入图片描述



1.2.3、父页面传值给接收器

在父页面的html中,将变量值传递给子页面的某一个接收器。中括号中是接收器名称,后面指定的是父页面中的变量。
在这里插入图片描述

我们在子页面中的html中直接把接收器当成普通变量使用,可以正常显示。
在这里插入图片描述

在这里插入图片描述


1.2.3.1、传值的多种写法

这里有个小插曲,[input]="sendChildMsg"是表示将sendChildMsg这个变量传递给子页面的接收器,不是将字符串sendChildMsg赋值给input。如果是想传常量而不是变量的话,有下面两种写法,不加中括号或者加上单引号。

  • input="sendChildMsg"
  • [input]="'sendChildMsg'"



1.3、子页面向父页面传值

1.3.1、子页面定义发送器

先引入Output和EventEmitter

在这里插入图片描述
之后定义发送器,这里发送器的类型是EventEmitter,不能像父页面传值给子页面那样接收器类型为一般字符串。
在这里插入图片描述

定义发送器的逻辑,这里为了方便,我将发送器的逻辑定义在一个button的click事件中。由点击事件触发传值。

onClick() {this.childEmitter.emit({msg:"send to father view"});
}



1.3.2、父页面中定义接收逻辑

父页面中定义一个方法接收子页面的传值,方法参数为事件类型即可。

getChildMsg($event) {alert(event.msg);
}



1.3.3、绑定子页面发送器和父页面接收方法

<app-child [input]="sendChildMsg" (childEmitter)="getChildMsg($event)">app-child>

在父页面的html中绑定发送器和接收方法。其中,(childEmitter)是子页面发送器的名称,"getChildMsg($event)"是父页面的接收方法名。

在这里插入图片描述



现在我们点击按钮,消息传递成功。
在这里插入图片描述



1.4、信息双向绑定

以上的两种通信方式,变量的传递都是单向的。比如父页面向将变量a赋值给子页面的接收器input,a变化时input也会实时变化,但input变化时a不会跟着改变。

Angular中提供了一种方式能让变量的双向传递,使子页面的接收器可以接受数据同时反向赋值给父页面。


1.4.1、双向绑定的实现

继续使用上面的代码样例。子页面中已定义接收器@Input() input;,我们只要再定义一个发送器,使发送器的名字是接收器名+Change即可。在这次的例子中发送器名是inputChange,这样就完成双向绑定的定义。代码如下。

export class ChildComponent {@Input() input;@Output() inputChange = new EventEmitter();constructor() { }ngOnChanges() {this.inputChange.emit("emit");}
}

ngOnChanges函数在ChildComponent初始化时就会执行一次,所以父页面将变量a传给input后,input随即就会将变量a的值赋成"emit"

之后父页面的html代码改成下面的内容

<app-child [(input)]="sendChildMsg">app-child>
<button (click)="onClick()">buttonbutton>

[(input)]表示既是发送器也是接收器。我们另外定义一个按钮,用这个按钮来查看sendChildMsg这个变量的值有没有发生变化。

下面是父页面的ts代码。

export class AppComponent {sendChildMsg = "sendChildMsg";onClick() {console.log(this.sendChildMsg);}
}

我们在页面上点击button,发现sendChildMsg的值确实被改成了"emit",双向绑定成功。在这里插入图片描述


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部