欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

淺談Vue2.0父子組件間事件派發(fā)機(jī)制

 更新時(shí)間:2018年01月08日 15:45:01   作者:不可能的是  
本篇文章主要介紹了淺談Vue2.0父子組件間事件派發(fā)機(jī)制,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧

從vue1.x過來的都知道,在vue2.0中,父子組件間事件通信的$dispatch和$broadcase被移除了。官方考慮是基于組件樹結(jié)構(gòu)的事件流方式實(shí)在是讓人難以理解,并且在組件結(jié)構(gòu)擴(kuò)展的過程中會(huì)變得越來越脆落。特別是在組件層級(jí)比較深的情況下。通過廣播和事件分發(fā)的機(jī)制,就顯得比較混亂了。

官方在廢除的同時(shí),也為我們提供了替換方案,包括實(shí)例化一個(gè)空的vue實(shí)例,使用$emit反應(yīng)子組件上的狀態(tài)變化

1.使用$emit觸發(fā)事件

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

configBox.vue作為子組件,假設(shè)為封裝的公告彈窗。

在父組件中 helloWorld.vue 中

< template/>

  <config-box
   :visible="dialogConfigVisible"        
   @listenToConfig="changeConfigVisible"
 > </config-box>

script

 data(){
  return {
   dialogConfigVisible:true
  }
 }
  methods: {
   changeConfigVisible(flag) {
     this.dialogConfigVisible = flag;
   }
  }

然后,在子組件 configBox.vue 中,主要在任意事件回調(diào)中,使用 $emit來觸發(fā)自定義的 listenToConfig事件,后面還可以加上參數(shù)傳給父組件。比如,在子組件彈窗上點(diǎn)擊×關(guān)閉時(shí),通知父組件 helloWorld.vue我要關(guān)閉了,主要方便父組件改變相應(yīng)狀態(tài)變量,并傳入false到自定義的事件中。

script

methods:{
 dialogClose() {
  this.show = false;
  this.$emit("listenToConfig", false)
 }
}

在子組件中,主動(dòng)觸發(fā)listenToConfig事件,并傳入?yún)?shù) false, 告訴父組件 helloWorld.vue對(duì)話框要關(guān)閉了。這里就可以避免父組件中的狀態(tài)未變化,再次刷新頁(yè)面的時(shí)候?qū)υ捒驎?huì)自動(dòng)出現(xiàn)。

2.實(shí)例化一個(gè)空的vue實(shí)例bus

這里實(shí)例化一個(gè)bus 空vue實(shí)例,主要為了統(tǒng)一管理子組件和父組件相互通信,通過bus 作為媒介,首先新建一個(gè)bus.js 文件,在里面新建一個(gè)對(duì)象,父組件為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('getData',(argsData)=>{
     // 這里獲取子組件傳來的參數(shù)
     console.log(argsData);
     })

   }
  }

 </script>

 // tableColumn.vue
 <script>
  import {bus} from "./bus"
  export default{
   methods(){
    handleClick(){
     bus.$emit('getData',{data:"from tableColumn!"})
    }
   }
  }
 </script>

上面的父子組件中,父組件中利用bus注冊(cè)監(jiān)聽事件getData,子組件中一旦有狀態(tài)變化,就觸發(fā)bus上對(duì)應(yīng)的事件。

這種利用空實(shí)例的方式,相當(dāng)于創(chuàng)建了一個(gè)事件中心,所以這種通信同樣適用于非父子組件間的通信,

3.多級(jí)父子組件通信

有時(shí),可能想要實(shí)現(xiàn)通信的兩個(gè)組件不是直接的父子組件,而是祖父和孫子,或者是跨越了更多層級(jí)的父子組件

不可能由子組件一級(jí)一級(jí)的向上傳遞參數(shù),來達(dá)到通信的目的,雖然現(xiàn)在我們理解的通信都是這樣經(jīng)過中轉(zhuǎn)的。可以通過while等循環(huán),不斷向上遍歷,直到找到目標(biāo)父組件,就在對(duì)應(yīng)的組件上觸發(fā)事件。

下面就只element-ui實(shí)現(xiàn)的一個(gè)父子組件通信的mixins,對(duì)于組件同步有很大的作用。在element-ui 的優(yōu)點(diǎn)概述中也特意提到這個(gè)組件通信

function broadcast(componentName, eventName, params) {

 // 向下遍歷每個(gè)子節(jié)點(diǎn),觸發(fā)相應(yīng)的向下廣播的 事件
 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: {
   // 向上遍歷父節(jié)點(diǎn),來獲取指定父節(jié)點(diǎn),通過$emit 在相應(yīng)的 組件中觸發(fā) eventName 事件
  dispatch(componentName, eventName, params) {
   var parent = this.$parent || this.$root;
   var name = parent.$options.componentName;
   // 上面的componentName 需要在每個(gè)vue 實(shí)例中額外配置自定義屬性 componentName,
   //可以簡(jiǎn)單替換成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);
  }
 }
};

首先定義兩個(gè)嵌套的組件 f1.vue 和 c1.vue,實(shí)例是:

 <f1>
  <c1></c1>
 </f1>

然后,分別定義兩個(gè)父子組件:

c2.vue

 <template>
   <section>
   <button type="button" name="button" @click="dispatchTest">點(diǎn)擊一下,就可以</button>
  </section>
 </template>
<script type="text/javascript">
import Emitter from "../mixins/emitter";
export default {
name: "c2",
mixins: [Emitter],
componentName:'c2',
methods: {
 dispatchTest() {
  this.dispatch('f1', 'listenerToC1', false);
 }
}
}
</script>

 f1.vue

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

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

這樣,就可以在子組件中點(diǎn)擊按鈕,觸發(fā) listenerToC1事件,在父組件中監(jiān)聽到這個(gè)事件,

其實(shí)更$emit觸發(fā)事件類似。不同之處在于,這里可以多級(jí)嵌套,不一定是直接的父子組件都可以觸發(fā)到。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • vue3 獲取元素高度不準(zhǔn)的問題

    vue3 獲取元素高度不準(zhǔn)的問題

    這篇文章主要介紹了vue3 獲取元素高度不準(zhǔn)的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • vue用Object.defineProperty手寫一個(gè)簡(jiǎn)單的雙向綁定的示例

    vue用Object.defineProperty手寫一個(gè)簡(jiǎn)單的雙向綁定的示例

    這篇文章主要介紹了用Object.defineProperty手寫一個(gè)簡(jiǎn)單的雙向綁定的示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-07-07
  • vue-hook-form使用詳解

    vue-hook-form使用詳解

    這篇文章主要為大家詳細(xì)介紹了vue-hook-form的使用方法,以及如何安裝vue-hook-form,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-04-04
  • Vue在echarts?tooltip中添加點(diǎn)擊事件案例詳解

    Vue在echarts?tooltip中添加點(diǎn)擊事件案例詳解

    本文主要介紹了Vue項(xiàng)目中在echarts?tooltip添加點(diǎn)擊事件的案例詳解,代碼具有一定的價(jià)值,感興趣的小伙伴可以來學(xué)習(xí)一下
    2021-11-11
  • 基于vue+ bootstrap實(shí)現(xiàn)圖片上傳圖片展示功能

    基于vue+ bootstrap實(shí)現(xiàn)圖片上傳圖片展示功能

    這篇文章主要介紹了基于vue+ bootstrap實(shí)現(xiàn)圖片上傳圖片展示功能,需要的朋友可以參考下
    2017-05-05
  • Vue檢測(cè)屏幕變化來改變不同的charts樣式實(shí)例

    Vue檢測(cè)屏幕變化來改變不同的charts樣式實(shí)例

    這篇文章主要介紹了Vue檢測(cè)屏幕變化來改變不同的charts樣式實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-10-10
  • Vue項(xiàng)目的表單校驗(yàn)實(shí)戰(zhàn)指南

    Vue項(xiàng)目的表單校驗(yàn)實(shí)戰(zhàn)指南

    這篇文章主要介紹了Vue項(xiàng)目表單校驗(yàn)的相關(guān)資料,前端表單校驗(yàn)?zāi)軠p少無(wú)效請(qǐng)求,保護(hù)后端接口,使用ElementPlus表單組件進(jìn)行校驗(yàn),需要準(zhǔn)備表單對(duì)象、規(guī)則對(duì)象并進(jìn)行雙向綁定,用戶名、密碼以及協(xié)議勾選等字段都需符合特定規(guī)則,需要的朋友可以參考下
    2024-10-10
  • Vue無(wú)后端配合實(shí)現(xiàn)導(dǎo)出功能的示例代碼

    Vue無(wú)后端配合實(shí)現(xiàn)導(dǎo)出功能的示例代碼

    這篇文章主要為大家詳細(xì)介紹了Vue如何在無(wú)后端配合的情況下實(shí)現(xiàn)導(dǎo)出功能,文中的示例代碼簡(jiǎn)潔易懂,有需要的小伙伴可以跟隨小編一起了解一下
    2024-01-01
  • 15 分鐘掌握vue-next函數(shù)式api(小結(jié))

    15 分鐘掌握vue-next函數(shù)式api(小結(jié))

    這篇文章主要介紹了15 分鐘掌握vue-next函數(shù)式api(小結(jié)),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-10-10
  • Vue鼠標(biāo)點(diǎn)擊事件和鍵盤事件舉例詳解

    Vue鼠標(biāo)點(diǎn)擊事件和鍵盤事件舉例詳解

    在Vue框架中我們經(jīng)常需要綁定各種JS事件,如"點(diǎn)擊事件"、"鼠標(biāo)移動(dòng)事件"、"鍵盤事件"等等,這篇文章主要給大家介紹了關(guān)于Vue鼠標(biāo)點(diǎn)擊事件和鍵盤事件的相關(guān)資料,需要的朋友可以參考下
    2024-01-01

最新評(píng)論