<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
對於稍微接觸過Angular元件的同學來說,元件間互動應該沒有什麼問題。
本文想追求的是用一個通俗解釋,幫助自己理解的更準確。
在介紹父子元件之前,先要了解一個概念——selector、選擇器
我們定義一個新元件時,一定會有這個屬性:
@Component({ selector: 'app-village-edit', ① templateUrl: './village-edit.component.html', styleUrls: ['./village-edit.component.scss'] })
其中①就是選擇器,就是告訴別的元件,如果想呼叫我這個元件,就要使用本元件的選擇器<selectorName></selectorName>
來呼叫。
本質上就是定義了元件的HTML標籤,就像常見的<p>
標籤、<button>
標籤一樣。
就像現實中父母和孩子的關係是相對的一樣,一個人對於它的父母來說,就承擔了孩子的角色;對於它的孩子來說則承擔了父母的角色。
父元件和子元件也是相對的。
假設,一個元件在自己的HTML模板中,通過選擇器(也就是特定的HTML標籤)來呼叫其他元件時。我們稱這個元件為父元件,而那個被呼叫的元件稱為子元件。
定義了兩個類:
child.component.ts,它的選擇器selector是: 'app-child'
parent.component.ts,它的選擇器selector是: 'app-parent',
此時,在parent元件的HTMl中參照child元件的選擇器:
<app-child></app-child>
這樣就完成了子元件的呼叫。
此時,如果通過路由載入父元件,就會發現子元件也會在特定的位置被渲染出來。
子元件從父元件接收的值,會儲存到子元件的變數中。
所以用來接收傳值的變數與普通變數唯一的區別,就是在常規的變數上增加一個@input()註解。
定義普通變數是這樣的:
master = 'Master';
如果用來接收傳值,只要改成這樣:
@Input() master = 'Master';
這樣,master變數預設是'Master'字串。
但如果父元件向其傳值,變數就變成了接收的值。
常規方式呼叫子元件:
<app-child></app-child>
如果子元件可以接收資料,就可以用[propertyName] = value的方法來傳值。
例如:
<app-child [master]="hero"> </app-child>
用這種寫法可以實現:一旦元件渲染完成後,子元件中的master變數就是'hero'的值了。
當父元件中的變數值變化時,子元件也會同步變化,也就是說,子元件可以監聽傳過來的值的變化資訊。
在上面的方式中,對於傳過來的值,雖然可以監聽變化,但侷限在於:子元件只能直接使用傳入的值。
如果想對傳入的值進行處理或過濾,就要稍微調整一下子元件。
常規情況下,子元件是通過給變數加上@Input裝飾器來接收引數的:
@Input() name = 'name';
如果想處理引數,只需要把接收傳值的變數變成set方法即可:
@Input() get name(): string { return this._name; } set name(name: string) { // 此處可以增加其他處理邏輯 this._name = name; } private _name = '';
此時,_name
是內部變數,當父元件對於name屬性傳入值的時候,會自動執行set name方法給_name
賦值並增加其他的處理邏輯。
官方檔案中寫到:“當需要監視多個、互動式輸入屬性的時候,ngOnChanges()比用屬性 setter 方法更合適。”
常規情況下,子元件是通過給變數加上@Input裝飾器來接收引數的:
@Input() param1 = 'string1'; @Input() param2 = 'string2';
當我們要監聽多個變數的變化並做出反應時,可以用ngOnChanges()方法:
@Input() param1 = 'string1'; @Input() param2 = 'string2'; ngOnChanges(changes: SimpleChanges) { ① for (const propName in changes) { ② // 通過變數名獲取變化資訊 const changedProp = changes[propName]; // 獲取上一個值 const from = JSON.stringify(changedProp.previousValue); ③ // 獲取當前值 const to = JSON.stringify(changedProp.currentValue); ④ // 此處可以新增其他處理過程了 ⑤ } }
① 執行ngOnChanges()方法時,可以用一個SimpleChanges引數來獲得當前元件所有引數的變化情況。
② 通過迴圈獲得每一個引數的上一個值和當前值。
③ 獲得上一個值④ 獲得當前值⑤ 根據業務邏輯新增其他處理過程
注:由於ngOnChanges方法呼叫非常頻繁,會導致效能問題或者軟體崩潰,所以建議少用。
剛剛講到了子元件如何獲取父元件的傳入的變數,如何監聽父元件的變化,以及如何處理傳入的值。
接下來講反向的傳輸:父元件如何監聽子元件的變化,並做出反應。
定義普通變數是這樣的:
param1 = 'String1';
如果想把這個變數暴露給父元件,需要在變數前加入@output()裝飾器,並且給他賦值一個變數彈射器:
@Output() param1 = new EventEmitter<string>();
此處EventEmitter是變數彈射器,EventEmitter需要一個確定的型別。
但此時,這個param1變數就不能再用等號"="賦值了,如果想讓父元件監聽到變化,就需要用彈射方法.emit
:
this.param1.emit("String2");
接下來前往父元件。
剛剛已經在子元件設定好了暴露的變數,那麼父元件如何接收呢?
常規的父元件呼叫子元件:
<app-child></app-child>
如果想監聽子元件的某個變數,可以使用圓括號():
<app-child (param1)="function1($event)"> </app-child>
$event 是Angular內建的事件變數。
function1我們在父元件中定義的處理變化的方法。
使用方式如下:
function1(param2: boolean) { // 這個param2為我們自己定義的引數名, // 本質上是子元件中變化的param1引數,但不用和子元件中的引數名相同 // 在此處增加處理過程即可 }
此時,當param1的值發生變化,就會執行function1,並且傳入一個事件,事件的實質內容就是子元件定義的param1引數。
function1方法把引數作為param2接收,並新增處理過程。
熟悉的風格,一圖勝千言:
是不是有似曾相識的感覺,在剛開始接觸Angular時就知道,可以使用方括號[]來繫結原生HTML標籤的某些屬性,例如:
<p [id]="sayHelloId" [style.color]="fontColor"> You can set my color in the component! </p>
另一方面,還有一個相似之處就是,Angular中也是使用圓括號()來繫結原生HTML標籤的某個方法,例如:
<button (click)="onClick()"> 點我! </button>
這些是巧合嗎?並不是。
我們可以這樣理解:
Angular中所有的原生HTML標籤都變成了元件。
之所以很多標籤中可以用方括號[]繫結屬性、使用圓括號()繫結方法,是因為Angular已經為我們擴充套件了原生的HTML標籤,使它們具備了接收和傳送資料的能力!
換言之,在Angular內部的元件中,已經為我們加上了許許多多的@input和@output裝飾器,我們才能方便的繫結這些屬性和方法。
到此這篇關於如何通過簡單的程式碼描述Angular父元件、子元件傳值的文章就介紹到這了,更多相關Angular父元件、子元件傳值內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45