開始以前,咱們把組件間通訊這個詞進行拆分vue
都知道組件是vue
最強大的功能之一,vue
中每個.vue
咱們均可以視之爲一個組件vuex
通訊指的是發送者經過某種媒體以某種格式來傳遞信息到收信者以達到某個目的。廣義上,任何信息的交通都是通訊框架
組件間通訊即指組件(.vue
)經過某種方式來傳遞信息以達到某個目的異步
舉個栗子ide
咱們在使用UI
框架中的table
組件,可能會往table
組件中傳入某些數據,這個本質就造成了組件之間的通訊post
在古代,人們經過驛站、飛鴿傳書、烽火報警、符號、語言、眼神、觸碰等方式進行信息傳遞,到了今天,隨着科技水平的飛速發展,通訊基本徹底利用有線或無線電完成,相繼出現了有線電話、固定電話、無線電話、手機、互聯網甚至視頻電話等各類通訊方式ui
從上面這段話,咱們能夠看到通訊的本質是信息同步,共享this
回到vue
中,每一個組件之間的都有獨自的做用域,組件間的數據是沒法共享的spa
但實際開發工做中咱們經常須要讓組件之間共享數據,這也是組件通訊的目的prototype
要讓它們互相之間能進行通信,這樣才能構成一個有機的完整系統
組件間通訊的分類能夠分紅如下
關係圖:
## 3、組件間通訊的方案
整理vue
中8種常規的通訊方案
### props傳遞數據
props
屬性,定義接收父組件傳遞過來的參數Children.vue
props:{ // 字符串形式 name:String // 接收的類型參數 // 對象形式 age:{ type:Number, // 接收的類型爲數值 defaule:18, // 默認值爲18 require:true // age屬性必須傳遞 } }
Father.vue
組件
<Children name:"jack" age=18 />
### $emit觸發自定義事件
$emit觸發
自定義事件,$emit
第二個參數爲傳遞的數值Chilfen.vue
this.$emit('add', good)
Father.vue
<Children @add="cartAdd($event)" />
### ref
ref
ref
來獲取數據父組件
<Children ref="foo" /> this.$refs.foo // 獲取子組件實例,經過子組件實例咱們就能拿到對應的數據
### EventBus
EventBus
$emit
觸發自定義事件,$emit
第二個參數爲傳遞的數值$on
監聽自定義事件Bus.js
// 建立一箇中央時間總線類 class Bus { constructor() { this.callbacks = {}; // 存放事件的名字 } $on(name, fn) { this.callbacks[name] = this.callbacks[name] || []; this.callbacks[name].push(fn); } $emit(name, args) { if (this.callbacks[name]) { this.callbacks[name].forEach((cb) => cb(args)); } } } // main.js Vue.prototype.$bus = new Bus() // 將$bus掛載到vue實例的原型上 // 另外一種方式 Vue.prototype.$bus = new Vue() // Vue已經實現了Bus的功能
Children1.vue
this.$bus.$emit('foo')
Children2.vue
this.$bus.$on('foo', this.handle)
### $parent 或 $root
$parent
或者$root
搭建通訊僑聯兄弟組件
this.$parent.on('add',this.add)
另外一個兄弟組件
this.$parent.emit('add')
### $attrs 與 $listeners
$attrs
和 $listeners
prop
被識別 (且獲取) 的特性綁定 ( class 和 style 除外)。能夠經過 v-bind="$attrs"
傳⼊內部組件
// child:並未在props中聲明foo <p>{{$attrs.foo}}</p> // parent <HelloWorld foo="foo"/>
// 給Grandson隔代傳值,communication/index.vue <Child2 msg="lalala" @some-event="onSomeEvent"></Child2> // Child2作展開 <Grandson v-bind="$attrs" v-on="$listeners"></Grandson> // Grandson使⽤ <div @click="$emit('some-event', 'msg from grandson')"> {{msg}} </div>
### provide 與 inject
provide
屬性,返回傳遞的值inject
接收組件傳遞過來的值祖先組件
provide(){ return { foo:'foo' } }
後代組件
inject:['foo'] // 獲取到祖先組件傳遞過來的值
### vuex
Vuex
做用至關於一個用來存儲共享變量的容器state
用來存放共享變量的地方getter
,能夠增長一個getter
派生狀態,(至關於store
中的計算屬性),用來得到共享變量的值mutations
用來存放修改state
的方法。actions
也是用來存放修改state的方法,不過action
是在mutations
的基礎上進行。經常使用來作一些異步操做### 小結
props
與 $emit
進行傳遞,也可選擇ref
$bus
,其次能夠選擇$parent
進行傳遞attrs
與listeners
或者 Provide
與 Inject
vuex
存放共享的變量## 參考文獻
@JS語音社羣