vue通訊手段有不少種,props/emit、vuex、event bus、provide/inject 等。還有一種通訊方式,那就是 $attrs 和 $listeners,以前早就據說這兩個api,趁着有空來補補。這種方式挺優雅,使用起來也不賴。下面例子都會經過父、子、孫子,三者的關係來講明使用方式。vue
官方解釋: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 中的屬性有重複時,繼續綁定的屬性優先級會更高。事件
官方解釋:
包含了父做用域中的 (不含 .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。