首頁 web前端 js教程 有關Vue2.0父子元件間實作派發機制(詳細教學)

有關Vue2.0父子元件間實作派發機制(詳細教學)

Jun 12, 2018 pm 06:26 PM
事件派發

這篇文章主要介紹了淺談Vue2.0父子元件間事件派發機制,現在分享給大家,也給大家做個參考。

從vue1.x過來的都知道,在vue2.0中,父子元件間事件通訊的$dispatch和$broadcase被移除了。官方考慮是基於組件樹結構的事件流方式實在是讓人難以理解,並且在組件結構擴展的過程中會變得越來越脆落。特別是在組件層級比較深的情況下。透過廣播和事件分發的機制,就顯得比較混亂了。

官方在廢除的同時,也為我們提供了替換方案,包括實例化一個空的vue實例,使用$emit反應子組件上的狀態變化

1.使用$emit觸發事件

helloWorld.vue作為父元件,dialogConfigVisible變數控制子元件彈框顯示或隱藏。

configBox.vue作為子元件,假設為封裝的公告彈出視窗。

在父元件中helloWorld.vue 中

< template/>

  <config-box
   :visible="dialogConfigVisible"        
   @listenToConfig="changeConfigVisible"
 > </config-box>
登入後複製

script

 data(){
  return {
   dialogConfigVisible:true
  }
 }
  methods: {
   changeConfigVisible(flag) {
     this.dialogConfigVisible = flag;
   }
  }
登入後複製

然後,在子元件configBox.vue 中,主要在任意事件回呼中,使用$emit來觸發自訂的listenToConfig事件,後面還可以加上參數傳給父元件。例如,在子元件彈跳窗上點擊×關閉時,通知父元件 helloWorld.vue我要關閉了,主要方便父元件改變對應狀態變量,並傳入false到自訂的事件。

script

methods:{
 dialogClose() {
  this.show = false;
  this.$emit("listenToConfig", false)
 }
}
登入後複製

在子元件中,主動觸發listenToConfig事件,並傳入參數 false, 告訴父親元件 helloWorld.vue對話方塊要關閉了。這裡可以避免父元件中的狀態未變化,再次刷新頁面的時候對話方塊會自動出現。

2.實例化一個空的vue實例bus

這裡實例化一個bus 空vue實例,主要為了統一管理子元件和父元件相互通信,透過bus 作為媒介,先新建一個bus.js 文件,在裡面新建一個對象,父組件為table.vue, 子組件為tableColumn.vue

 // bus.js
 import Vue from "vue";
 export var bus = new Vue({
   data:{
    scrollY:false
   },
   methods:{
    updateScrollY(flag){
     this.scrollY = flag;
    }
   }
  })
登入後複製

然後分別引入:

 // table.vue
 <script>
 import {bus} from "./bus"
  export default {
   created(){
    bus.$on(&#39;getData&#39;,(argsData)=>{
     // 这里获取子组件传来的参数
     console.log(argsData);
     })

   }
  }

 </script>
登入後複製
 // tableColumn.vue
 <script>
  import {bus} from "./bus"
  export default{
   methods(){
    handleClick(){
     bus.$emit(&#39;getData&#39;,{data:"from tableColumn!"})
    }
   }
  }
 </script>
登入後複製

上面的父子元件中,父元件中利用bus註冊監聽事件getData,子元件中一旦有狀態變化,就觸發bus上對應的事件。

這種利用空實例的方式,相當於創建了一個事件中心,所以這種通信同樣適用於非父子組件間的通信,

3.多級父子元件通訊

有時,可能想要實作通訊的兩個元件不是直接的父子元件,而是祖父和孫子,或是跨越了更多層級的父子元件

#不可能由子組件一級一級的向上傳遞參數,來達到通訊的目的,雖然現在我們所理解的通訊都是這樣經過中轉的。可以透過while等循環,不斷向上遍歷,直到找到目標父元件,就在對應的元件上觸發事件。

下面就只element-ui實作的一個父子元件通訊的mixins,對於元件同步有很大的作用。在element-ui 的優點概述中也刻意提到這個元件通訊

function broadcast(componentName, eventName, params) {

 // 向下遍历每个子节点,触发相应的向下广播的 事件
 this.$children.forEach(child => {
  var name = child.$options.componentName;

  if (name === componentName) {
   child.$emit.apply(child, [eventName].concat(params));
  } else {
   broadcast.apply(child, [componentName, eventName].concat([params]));
  }
 });
}
export default {
 methods: {
   // 向上遍历父节点,来获取指定父节点,通过$emit 在相应的 组件中触发 eventName 事件
  dispatch(componentName, eventName, params) {
   var parent = this.$parent || this.$root;
   var name = parent.$options.componentName;
   // 上面的componentName 需要在每个vue 实例中额外配置自定义属性 componentName,
   //可以简单替换成var name = parent.$options._componentTag;

   while (parent && (!name || name !== componentName)) {
    parent = parent.$parent;

    if (parent) {
     name = parent.$options.componentName;
    }
   }
   if (parent) {
    parent.$emit.apply(parent, [eventName].concat(params));
   }
  },
  broadcast(componentName, eventName, params) {
   broadcast.call(this, componentName, eventName, params);
  }
 }
};
登入後複製

先定義兩個嵌套的元件f1.vue 和c1.vue,實例是:

 <f1>
  <c1></c1>
 </f1>
登入後複製

然後,分別定義兩個父子元件:

c2.vue

 <template>
   <section>
   <button type="button" name="button" @click="dispatchTest">点击一下,就可以</button>
  </section>
 </template>
<script type="text/javascript">
import Emitter from "../mixins/emitter";
export default {
name: "c2",
mixins: [Emitter],
componentName:&#39;c2&#39;,
methods: {
 dispatchTest() {
  this.dispatch(&#39;f1&#39;, &#39;listenerToC1&#39;, false);
 }
}
}
</script>
登入後複製

 f1.vue

<template type="html">
 <p class="outBox-class">
  <slot>
  </slot>
 </p>
</template>

<script type="text/javascript">
import Emitter from "../mixins/emitter";
export default {
name: "f1",
mixins: [Emitter],
componentName: &#39;f1&#39;,
mounted() {
 this.$on("listenerToC1", (value) => {
   alert(value);
 })
}
}
</script>
登入後複製

這樣,就可以在子元件中點選按鈕,觸發listenerToC1事件,在父元件中監聽到這個事件,

其實更$emit觸發事件類似。不同之處在於,這裡可以多層嵌套,不一定是直接的父子組件都可以觸發到。

上面是我整理給大家的,希望今後對大家有幫助。

相關文章:

如何透過js將目前時間格式化?

使用vue引入css,less相關問題

#透過vue如何引入公共css檔案

在Vue中有關使用ajax方法有哪些?

以上是有關Vue2.0父子元件間實作派發機制(詳細教學)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

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

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

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

前端熱敏紙小票打印遇到亂碼問題怎麼辦? 前端熱敏紙小票打印遇到亂碼問題怎麼辦? Apr 04, 2025 pm 02:42 PM

前端熱敏紙小票打印的常見問題與解決方案在前端開發中,小票打印是一個常見的需求。然而,很多開發者在實...

神秘的JavaScript:它的作用以及為什麼重要 神秘的JavaScript:它的作用以及為什麼重要 Apr 09, 2025 am 12:07 AM

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

誰得到更多的Python或JavaScript? 誰得到更多的Python或JavaScript? Apr 04, 2025 am 12:09 AM

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

JavaScript難以學習嗎? JavaScript難以學習嗎? Apr 03, 2025 am 12:20 AM

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

如何使用JavaScript將具有相同ID的數組元素合併到一個對像中? 如何使用JavaScript將具有相同ID的數組元素合併到一個對像中? Apr 04, 2025 pm 05:09 PM

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

如何實現視差滾動和元素動畫效果,像資生堂官網那樣?
或者:
怎樣才能像資生堂官網一樣,實現頁面滾動伴隨的動畫效果? 如何實現視差滾動和元素動畫效果,像資生堂官網那樣? 或者: 怎樣才能像資生堂官網一樣,實現頁面滾動伴隨的動畫效果? Apr 04, 2025 pm 05:36 PM

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

JavaScript的演變:當前的趨勢和未來前景 JavaScript的演變:當前的趨勢和未來前景 Apr 10, 2025 am 09:33 AM

JavaScript的最新趨勢包括TypeScript的崛起、現代框架和庫的流行以及WebAssembly的應用。未來前景涵蓋更強大的類型系統、服務器端JavaScript的發展、人工智能和機器學習的擴展以及物聯網和邊緣計算的潛力。

console.log輸出結果差異:兩次調用為何不同? console.log輸出結果差異:兩次調用為何不同? Apr 04, 2025 pm 05:12 PM

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

See all articles