Angular組件之間的通信方式。

準備寫到Angular總結中去的,又怕太長以後自己都找不到,就先寫下來再說吧!
Angular組件之間的通信方式,和vue一樣有3種。

1.父組件往子組件傳遞(vue中是props down)
2.子組件往父組件傳遞(vue中是events up)
3.非父子關係組件傳遞(vue中是bus總線)

1.父組件往子組件傳遞

既然是父組件往子組件傳值,那麼首先肯定要有2個組件。先創建2個組件

ng g component father
ng g component son

這時兩個組件創建好了,但是還沒有形成父子關係。
在這裏插入圖片描述

在father組件中,引入子組件。
在這裏插入圖片描述

子組件中準備好接受父組件傳值的位置:
在這裏插入圖片描述
將父組件導入根組件中,看看效果。
在這裏插入圖片描述

還是和vue類似,在父組件引用子組件的位置,寫一個自定義屬性,不用:也不用[],直接寫屬性和值即可,這裏叫做myName=‘我是父組件傳給子組件的值9588’。

在這裏插入圖片描述


這裏需要注意的是,因爲這裏我傳遞的是一個寫好的字符串,如果傳遞的是一個變量,或者其他組件傳過來的值,那麼這裏需要用[]將myName括起來,作爲綁定屬性使用。後面雙引號的內容就應該是綁定屬性的變量。這個地方有點坑,否則你傳遞給子組件的只是一個字符串。

在這裏插入圖片描述

看看效果。

在這裏插入圖片描述


然後子組件需要接受父組件傳來的值。因爲接受一個值屬於輸入行爲,所以在子組件son的ts文件中,需要添加Input類才能接受輸入。這一點和自定義指令中接受參數的設置是一樣的。
在這裏插入圖片描述
上圖紅框可以看到,使用裝飾器@Input綁定myName屬性之後,直接使用this.myName已經可以讀取到數據了。
在子組件son的html中,直接使用{{myName}}即可讀取到父組件傳遞進來的值。
在這裏插入圖片描述

最後看下效果,沒毛病。
在這裏插入圖片描述

個人總結:感覺父傳子和vue一樣,需要通過在引用子組件的位置綁定屬性才能傳遞。只是接受值的方式寫法有些不同。

2.子組件向父組件傳遞,通信

首先複習一下vue中的子組件向父組件通信。
在這裏插入圖片描述
這裏同樣的,我們要 在調用子組件時,給子組件綁定一個自定義事件,事件名爲myEvent。
Angular中綁定事件是用小圓括號(),這裏vue中可以不加函數的括號和參數,但是Angular中一定要加括號,而且參數也要寫上$event才行,否則無法接受到子組件傳過來的值。
如果子組件只是想調用父組件中的方法而不傳值,就可以不寫。
在這裏插入圖片描述

然後回到father.ts,設置一個msg變量用來保存傳遞過來的值,創建handleEvent方法,用來操作傳遞過來的值。
在這裏插入圖片描述
這樣步驟1父組件中的操作就結束了。
回到子組件son中的ts文件,由於子組件向父組件傳值屬於輸出事件,所以這裏需要引入Output類,而傳遞事件屬於事件發送,所以還需要引入EventEmitter類。

引入之後在下面使用裝飾器創建變量,保存事件發送對象。

@Output() myEvent = new EventEmitter()

最後調用事件對象的emit方法,發送信息給父組件。

   this.myEvent.emit('我是子組件發送給父組件的值123')

完整代碼如下:
在這裏插入圖片描述

查看下效果,沒問題。
在這裏插入圖片描述

總結:

步驟1:調用子組件時,給子組件綁定一個自定義事件
handleEvent(msg){}
<son (myEvent)=“handleEvent($event)”></son>
步驟2:觸發事件並傳值
import {Output,EventEmitter} from ‘@angular/core’
綁定裝飾器
@Output() myEvent = new EventEmitter()
調用emit方法
this.myEvent.emit(123)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章