Vue - 組件通訊之$attrs、$listeners

前言

vue通訊手段有不少種,props/emit、vuex、event bus、provide/inject 等。還有一種通訊方式,那就是 $attrs 和 $listeners,以前早就據說這兩個api,趁着有空來補補。這種方式挺優雅,使用起來也不賴。下面例子都會經過父、子、孫子,三者的關係來講明使用方式。vue

$attrs

官方解釋vuex

包含了父做用域中不做爲 prop 被識別 (且獲取) 的特性綁定 (class 和 style 除外)。當一個組件沒有聲明任何 prop 時,這裏會包含全部父做用域的綁定 (class 和 style 除外),而且能夠經過 v-bind="$attrs" 傳入內部組件——在建立高級別的組件時很是有用。api

個人理解ide

接收除了props聲明外的全部綁定屬性(class、style除外)函數

圖解:spa

 因爲child.vue 在 props 中聲明瞭 name 屬性,$attrs 中只有age、gender兩個屬性,輸出結果爲:3d

age: "20", gender: "man" }code

 

 另外能夠在 grandson.vue 上經過 v-bind="$attrs", 能夠將屬性繼續向下傳遞,讓 grandson.vue 也能訪問到父組件的屬性,這在傳遞多個屬性時會顯得很便捷,而不用一條條的進行綁定。blog

若是想要添加其餘屬性,可繼續綁定屬性。但要注意的是,繼續綁定的屬性和 $attrs 中的屬性有重複時,繼續綁定的屬性優先級會更高。事件

 

$listeners

官方解釋:

包含了父做用域中的 (不含 .native 修飾器的) v-on 事件監聽器。它能夠經過 v-on="$listeners" 傳入內部組件——在建立更高層次的組件時很是有用。

個人理解:

接收除了帶有.native事件修飾符的全部事件監聽器

圖解:

 parent.vue 中對 child.vue 綁定了兩個事件,帶有.native的 click 事件和一個自定義事件,因此在 child.vue 中,輸出$listeners的結果爲:

{ customEvent: fn }

 

 

 同 attrs 屬性同樣,能夠經過 v-on="$listeners",將事件監聽器繼續向下傳遞,讓 grandson.vue 訪問到事件,且可使用 $emit 觸發 parent.vue 的函數。

若是想要添加其餘事件監聽器,可繼續綁定事件。但要注意的是,繼續綁定的事件和 $listeners 中的事件有重複時,不會被覆蓋。當 grandson.vue 觸發 customEvent 時,child.vue 和 parent.vue 的事件都會被觸發,觸發順序相似於冒泡,先到 child.vue 再到 parent.vue。

相關文章
相關標籤/搜索