如何操作vue中$emit 與$on父子與兄弟組件通信
這次帶給大家怎樣操作vue中$emit 與$on父子與兄弟組件通信,操作vue中$emit 與$on父子與兄弟組件通信的注意事項有哪些,下面就是實戰案例,一起來看一下。
主要的傳輸方式有三種:
1.父元件到子元件通訊
2.子元件到父元件的通訊
#3.兄弟元件之間的通訊
一、父元件傳值給子元件
#父元件給子元件傳子,使用props
//父组件:parent.vue <template> <p> <child :vals = "msg"></child> </p> </template> <script> import child from "./child"; export default { data(){ return { msg:"我是父组件的数据,将传给子组件" } }, components:{ child } } </script> //子组件:child.vue <template> <p> {{vals}} </p> </template> <script> export default { props:{ //父组件传值 可以是一个数组,对象 vals:{ type:String,//类型为字符窜 default:"123" //可以设置默认值 } }, } </script>
2.子元件到父元件的通訊
使用$emit(eventname,option)
觸發事件,
參數一:自訂事件名稱,寫法,小寫或用-連接,如event,event-name 不能寫駝峰寫法(eventName)
子元件給父元件傳值,可以在子元件中使用$emit觸發事件的值傳出去,父元件透過事件監聽,取得資料
但是,這裡有一個問題,
1、究竟是由子元件內部主動傳資料給父元件,由父元件監聽接收(由子元件中操作決定何時傳值)
2、或透過父元件決定子元件何時傳值給父元件,然後再監聽接收(由父元件中運算決定何時傳值)
兩種情況都有
2.1 : $meit事件觸發,透過子元件內部的事件觸發自訂事件$emit
2.2 : $meit事件觸發, 可以透過父元件運算子元件(ref)的事件來觸發自訂事件$emit
第一種情況:
//父组件:parent.vue <template> <p> <child v-on:childevent='wathChildEvent'></child> <p>子组件的数据为:{{msg}}</p> </p> </template> <script> import child from "./child"; export default { data(){ return{ msg:"" } }, components:{ child }, methods:{ wathChildEvent:function(vals){//直接监听 又子组件触发的事件,参数为子组件的传来的数据 console.log(vals);//结果:这是子组件的数据,将有子组件操作触发传给父组件 this.msg = vlas; } } } </script> //子组件:child.vue <template> <p> <input type="button" value="子组件触发" @click="target"> </p> </template> <script> export default { data(){ return { texts:'这是子组件的数据,将有子组件操作触发传给父组件' } }, methods:{ target:function(){ //有子组件的事件触发 自定义事件childevent this.$emit('childevent',this.texts);//触发一个在子组件中声明的事件 childEvnet } }, } </script>
第二種情況:
//父组件:parent.vue <template> <p> <child v-on:childevent='wathChildEvent' ref="childcomp"></child> <input type="button" @click="parentEnvet" value="父组件触发" /> <p>子组件的数据为:{{msg}}</p> </p> </template> <script> import child from "./child"; export default { data(){ return{ msg:"" } }, components:{ child }, methods:{ wathChildEvent:function(vals){//直接监听 又子组件触发的事件,参数为子组件的传来的数据 console.log(vals);//这是子组件的数据,将有子组件操作触发传给父组件 this.msg = vlas; }, parentEnvet:function(){ this.$refs['childcomp'].target(); //通过refs属性获取子组件实例,又父组件操作子组件的方法触发事件$meit } } } </script> //子组件:child.vue <template> <p> <!-- dothing..... --> </p> </template> <script> export default { data(){ return { texts:'这是子组件的数据,将有子组件操作触发传给父组件' } }, methods:{ target:function(){ //又子组件的事件触发 自定义事件childevent this.$emit('childevent',this.texts);//触发一个在子组件中声明的事件 childEvnet } }, } </script>
將兩者情況對比,差異就在於$emit 自訂事件的觸發是有父元件還是子元件去觸發
第一種,是在子元件中定義一個click點擊事件來觸發自訂事件$emit,然後在父元件監聽
第二種,是在父元件中第一一個click點選事件,在元件中透過refs取得實例方法來直接觸發事件,然後在父元件中監聽
3.兄弟元件之間的通訊
(1) 、兄弟之間傳遞資料通過事件
(2)、建立一個新Vue的實例,讓各兄弟共用同一個事件機制。 (關鍵點)
(3)、傳遞資料方,透過事件觸發$emit(方法名,傳遞的資料)。
(4)、接收資料方,在mounted()鉤子函數(掛載實例)中觸發事件$on(方法名,callback(接收資料的資料)),此時callback函數中的this已經發生了改變,可以使用箭頭函數。
//建立一个空的Vue实例,将通信事件挂载在该实例上 //emptyVue.js import Vue from 'vue' export default new Vue() //兄弟组件a:childa.vue <template> <p> <span>A组件->{{msg}}</span> <input type="button" value="把a组件数据传给b" @click ="send"> </p> </template> <script> import vmson from "./emptyVue" export default { data(){ return { msg:"我是a组件的数据" } }, methods:{ send:function(){ vmson.$emit("aevent",this.msg) } } } </script> //兄弟组件b:childb.vue <template> <p> <span>b组件,a传的的数据为->{{msg}}</span> </p> </template> <script> import vmson from "./emptyVue" export default { data(){ return { msg:"" } }, mounted(){ vmson.$on("aevent",(val)=>{//监听事件aevent,回调函数要使用箭头函数; console.log(val);//打印结果:我是a组件的数据 this.msg = val; }) } } </script> //父组件:parent.vue <template> <p> <childa><childa> <childb></childb> </p> </template> <script> import childa from "./childa"; import childb from "./childb"; export default { data(){ return{ msg:"" } }, components:{ childa, childb }, } </script>
到此,vue中的元件通訊傳值基本上可以搞定了,但是對於大型複雜的項目,建議採用vuex 狀態管理更適合....
相信看了本文案例你已經掌握了方法,更多精彩請關注php中文網其它相關文章!
推薦閱讀:
以上是如何操作vue中$emit 與$on父子與兄弟組件通信的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

Python和JavaScript開發者的薪資沒有絕對的高低,具體取決於技能和行業需求。 1.Python在數據科學和機器學習領域可能薪資更高。 2.JavaScript在前端和全棧開發中需求大,薪資也可觀。 3.影響因素包括經驗、地理位置、公司規模和特定技能。

JavaScript是現代Web開發的基石,它的主要功能包括事件驅動編程、動態內容生成和異步編程。 1)事件驅動編程允許網頁根據用戶操作動態變化。 2)動態內容生成使得頁面內容可以根據條件調整。 3)異步編程確保用戶界面不被阻塞。 JavaScript廣泛應用於網頁交互、單頁面應用和服務器端開發,極大地提升了用戶體驗和跨平台開發的靈活性。

如何在JavaScript中將具有相同ID的數組元素合併到一個對像中?在處理數據時,我們常常會遇到需要將具有相同ID�...

實現視差滾動和元素動畫效果的探討本文將探討如何實現類似資生堂官網(https://www.shiseido.co.jp/sb/wonderland/)中�...

學習JavaScript不難,但有挑戰。 1)理解基礎概念如變量、數據類型、函數等。 2)掌握異步編程,通過事件循環實現。 3)使用DOM操作和Promise處理異步請求。 4)避免常見錯誤,使用調試技巧。 5)優化性能,遵循最佳實踐。

探索前端中類似VSCode的面板拖拽調整功能的實現在前端開發中,如何實現類似於VSCode...

深入探討console.log輸出差異的根源本文將分析一段代碼中console.log函數輸出結果的差異,並解釋其背後的原因。 �...
