父子組件溝通原則


為了提高組件的獨立性與重用性,父組件會透過 props 向下傳遞資料給子組件,當子組件有事情要通知父組件時會透過 emit 事件告知父組件,如此確保每個組件都是獨立在相對隔離的環境中運作,可以大幅提高組件的維護性。

ref: http://cn.vuejs.org/v2/guide/components.html#Prop

pass props


此屬性是作為外部傳入資料的接口,為遵循單向資料流,避免子組件無意修改了父組件資料,因此在設計上 props 是單向綁定機制。

  • 當父組件更新傳入值的時候,子組件 props 都會更新為最新值
  • 子組件不允許直接異動 props 屬性值 (主控台會發出警告訊息)
  • 子組件強行修改 props 屬性值時,由於單向資料流的特性,因此是不會異動到父組件的數值。

特別注意若傳入物件或陣列型態資料時,若子組件強行修改 props 值是會異動到父組件的資料喔!

建立子組件

來驗證一下上述特性,首先建立 Product Card 子組件 (ProductCard.vue),並且建立兩個 props 接受外部傳入之資料,及一個 props 接收外部傳入的方法 。

  • type : 表示資料型態 (會進行類型檢測,不符會在主控台發出警告訊息)
  • default : 設定預設值 (無傳入資料時,使用預設值)
  • required : 是否為必輸入屬性 (預設為 false)

另外有兩的 method 用來強行修改 props 屬性資料

  • 修改 string 型態的 props 屬性
  • 修改 object 型態的 props 屬性

建立父組件

接著建立 Props Tester 父組件 (ProductTest.vue),並且使用 Product Card 子組件。

傳入三個 props (string, object and function) 至該組件中

''

在父組件中呈現的畫面如下,上方輸入框呈現父組件資料,皆透過 v-model 雙向綁定各資料;下方則是傳入資料後所呈現出的子組件,皆使用 v-bind 單向綁定傳入 props 的資料。

測試父子互動

當父組件更新傳入值的時候,子組件 props 都會更新為最新值

在子組件修改傳入 props 型態為 string 資料時,系統會發出警告,並且無法異動父組件資料

但在子組件修改傳入 props 型態為 object資料時,可是會直接異動父組件資料(雙向綁定) 喔!

最後點選 More Info 後順利執行父層透過 function props 傳入的方法,並且確實傳入變數至該方法中。

emit event


先前有提到父組件傳入的資料是不行被異動的,因此如果要在子組件操作該資料,並且要在資料異動時通知父組件,讓父組件去做相對應的資料處理時,就要透過 emit 事件通知父層。

如何在子層使用父層傳入的資料?

  • 子層內部使用,變動後無須通知父層 :

    簡單定義 data 屬性 internalMadeFrom,將傳入值 madeFrom 作為該值的初始值,後續在子組件就直接操作 internalMadeFrom 即可。

  • 父子共用,異動必須通知父層 :

    定義 computed 計算屬性 clonedMadeFrom,在 getter 中直接取用 props 傳入 madeFrom 資料,在 setter 中直接將異動後新值透過 emit 發送特定事件讓父層接收(可透過此機制讓父層更新 madeFrom 值,再透過 prop 傳遞新值進子組件,更新子層 madeFrom 資料,就類似雙向綁定作用),後續在子組件就直接操作 clonedMadeFrom 即可。

results matching ""

    No results matching ""