元件通信、props 父元件--->子元件通信、$emit 子元件--->父元件傳遞
$emit與props結合 兄弟元件傳值、bus(事件總線) 兄弟元件通信、children 直接通路元件執行個體、$refs、provide/inject(提供/注入) 多元件或深層次元件通信、vuex狀态管理、slot(slot-scope作用域插槽)
目錄
元件通信
1、props 父元件--->子元件通信
2、$emit 子元件--->父元件傳遞$emit與props結合 兄弟元件傳值
3、bus(事件總線) 兄弟元件通信
4、$parent、$children 直接通路元件執行個體
5、$refs
6、provide/inject(提供/注入) 多元件或深層次元件通信
7、slot(slot-scope作用域插槽) 子元素-->父元素(類似于通信)
8、vuex狀态管理
父元件---屬性的方式傳值給子元件
子元件---props方式接收資料
子元件props接受的參數名稱,要與父元件傳遞時定義的屬性名一緻
注意:
子元件不能夠直接去修改父元件傳遞的值修改的:因為Vue的單向資料流機制,如果直接修改那父元件的值就被“污染”了。(props是單向綁定的(隻讀屬性):當父元件的屬性變化時,将傳導給子元件,但是反過來不會)
報錯資訊大概是:vue使用prop通信出錯:Avoid mutating a prop directly since the value will be overwritten whenever the parent
解決方案:可以在子元件内定義一個變量mydata去接收fData資料
參數傳遞類型不确定是可以這麼寫:
子元件綁定自定義事件
$emit()第一個參數為:自定義的事件名稱,第二個參數為:需要傳遞的資料
使用 $emit() 觸發更改資料
子元件
父元件(子元件發送的事件名稱,要和父元件接受的事件名稱一緻)
父元件引入兩個子元件
父元件充當一個橋梁作用
父元件
子元件B改變,接收資料
子元件A接收資料
非父子元件或更多層級間元件間傳值,在Vue中通過單獨的事件中心來管理元件間的傳值
建立一個公共的bus.js檔案
暴露出Vue執行個體
傳遞資料方,通過一個事件觸發bus.$emit(方法名,傳遞的資料)
接收資料方,在生命周期函數中,通過bus.$on(方法名,[params])來監聽
銷毀事件,在接受資料方,通過bus.$off(方法名)銷毀之後無法監聽資料
需要改變資料的元件中定義調用
另外一個元件中同樣引入bus.js檔案,通過$on監聽事件回調
子元件通過---> $parent 獲得父元件執行個體
父元件通過---> $children 獲得子元件執行個體數組
子元件---this.$parent可以擷取到父元件的方法、data的資料等,并可以直接使用和執行
父元件 --- 擷取子元件執行個體的,并且擷取的執行個體是一個數組形式,this.$children[0]才可以擷取某個元件執行個體,并調用元件方法和資料
ref被用來給元素或子元件注冊引用資訊。引用資訊将會注冊在父元件的 $refs 對象上。
父元件使用 $refs 獲得元件執行個體
provide/inject詳解
父元件使用 provide 注入資料
子元件使用 inject 使用資料
至此provideName這個變量可以提供給它其下的所有子元件,包括曾孫、孫子元件等,隻需要使用 inject 就能擷取資料
父元件不需要知道哪個元件使用它提供出去的資料
子附件不需要知道這個資料從哪裡來
用作一個 (能被傳遞資料的)可重用模闆,來代替已經渲染好的元素
在子元件中,隻需将資料傳遞到插槽,就像你将 prop 傳遞給元件一樣
注意:父級插槽接收内容是最外側元素 ,必須要有屬性slot-scope
子元素
父元素
相當于一個公共資料的倉庫
提供一些方法管理倉庫資料
官網