成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

vue非父子組件傳值和事件總線(eventbus)的使用方法是什么

這篇文章給大家分享的是有關vue非父子組件傳值和事件總線(eventbus)的使用方法是什么的內(nèi)容。小編覺得挺實用的,因此分享給大家做個參考。一起跟隨小編過來看看吧。

讓客戶滿意是我們工作的目標,不斷超越客戶的期望值來自于我們對這個行業(yè)的熱愛。我們立志把好的技術(shù)通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領域值得信任、有價值的長期合作伙伴,公司提供的服務項目有:申請域名、虛擬空間、營銷軟件、網(wǎng)站建設、西鄉(xiāng)網(wǎng)站維護、網(wǎng)站推廣。

先說一下什么是事件總線,其實就是訂閱發(fā)布者模式;

比如有一個bus對象,這個對象上有兩個方法,一個是on(監(jiān)聽,也就是訂閱),一個是emit(觸發(fā),也就是發(fā)布),我們通過on方法去監(jiān)聽某個事件,再用emit去觸發(fā)這個事件,同時調(diào)用on中的回調(diào)函數(shù),這樣就完成了一次事件觸發(fā);

這是一種設計模式,和語言沒有關系;

如果不太了解什么是訂閱發(fā)布者模式,請移步看這篇文章JavaScript設計模式--觀察者模式(發(fā)布者-訂閱者模式)

在實際開發(fā)中,往往最麻煩的就是各種組件之間的傳值問題;如果利用事件總線就會讓這件事情變得很簡單;

vue自帶事件總線的短板

我們都知道在vue被實例化之后,他就具備了充當事件總線對象的能力,在他上面掛了兩個方法,是$emit和$on;

而vue文檔說的很明白,$emit會觸發(fā)當前實例上的事件,附加參數(shù)都會傳給監(jiān)聽器回調(diào);

由于在實際工作中,我們都是以組件的形式開發(fā),每個組件就是一個實例;

所以利用vue自帶的總線能力有很大的局限性,最多只能從子組件觸發(fā)到父組件中,而不能在非父子組件之間傳值;

所以這時,我們就需要有一個全局的事件總線對象,讓我們掛載監(jiān)聽事件和觸發(fā)事件;

舉個例子,子組件向父組件傳值;父組件向子組件傳值很簡單,我們這里不說
// 子組件中
<template>
  <div>
    <span>{{child}}</span>
    <input type="button" value="點擊觸發(fā)" @click="send">
  </div>
</template>
<script>
  export default {
    data () {
      return {
        child: '我是子組件的數(shù)據(jù)'
      }
    },
    methods: {
      send () {
      // 如果傳多個值就用逗號隔開 a, b, c
        this.$emit('fromChild', this.child)
      }
    }
  }
</script>
// 父組件
<template>
  <div>
    <span>{{name}}</span>
    // 在父組件中監(jiān)聽 fromChild事件
    <child @fromChild="onFromChild"></child>
  </div>
</template>
<script>
  import child from './child'
  export default {
    components: {
      child
    },
    data () {
      return {
        name: ''
      }
    },
    methods: {
      onFromChild: function (data) {
        // data就是子組件傳過來的值
        // 如果傳過來多個值就用逗號隔開去接收 data1, data2, data3
        this.name = data
      }
    }
  }
</script>

實現(xiàn)全局事件總線對象的幾種方式

方式一,也是我自己使用的方式(推薦使用,簡單)

大概思路是 :在main.js,也就是入口文件中,我們在vue的原型上添加一個bus對象;

具體實現(xiàn)方式如下:

下面的組件A和組件B可以是項目中任意兩個組件

//在mian.js中
Vue.prototype.bus = new Vue()  //這樣我們就實現(xiàn)了全局的事件總線對象

//組件A中,監(jiān)聽事件
this.bus.$on('updata', function(data) {
    console.log(data)  //data就是觸發(fā)updata事件帶過來的數(shù)據(jù)
})

//組件B中,觸發(fā)事件
this.bus.$emit('updata', data)  //data就是觸發(fā)updata事件要帶走的數(shù)據(jù)
方式二,稍微有點麻煩,但也很容易理解

大概的實現(xiàn)思路: 新建一個bus.js文件, 在這個文件里實例化一下vue;然后在組件A和組件B中分別引入這個bus.js文件,將事件監(jiān)聽和事件觸發(fā)都掛到bus.js這個實例上,這樣就可以實現(xiàn)全局的監(jiān)聽與觸發(fā)了

寫個例子
bus.js文件
// bus.js文件
import Vue from 'vue'
export default new Vue()
組件A
// 組件A ,監(jiān)聽事件send
<template>
  <div>
    <span>{{name}}</span>
  </div>
</template>
<script>
  import Bus from './bus.js'
  export default {
    data () {
      return {
        name: ''
      }
    },
    created() {
      let _this = this
      // 用$on監(jiān)聽事件并接受數(shù)據(jù)
      Bus.$on('send', (data) => {
        _this.name = data
        console.log(data)
      })
    },
    methods: {}
  }
</script>

組件B

// 組件B, 觸發(fā)事件send
<template>
  <div>
    <input type="button" value="點擊觸發(fā)" @click="onClick">
  </div>
</template>
<script>
  import Bus from './bus.js'
  export default {
    data () {
      return {
        elValue: '我是B組件數(shù)據(jù)'
      }
    },
    methods: {
        // 發(fā)送數(shù)據(jù)
      onClick() {
        Bus.$emit('send', this.elValue)
      }
    }
  }
</script>

這樣我們就完成了一個簡單非父子組件之間的傳值。

感謝各位的閱讀!關于vue非父子組件傳值和事件總線(eventbus)的使用方法是什么就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,讓大家可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

網(wǎng)站欄目:vue非父子組件傳值和事件總線(eventbus)的使用方法是什么
網(wǎng)頁鏈接:http://jinyejixie.com/article46/pppshg.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供關鍵詞優(yōu)化、做網(wǎng)站、動態(tài)網(wǎng)站、網(wǎng)站內(nèi)鏈、網(wǎng)頁設計公司、商城網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站網(wǎng)頁設計
呼图壁县| 彭水| 汉寿县| 昌黎县| 屏南县| 咸宁市| 闽侯县| 永康市| 汉中市| 伊吾县| 绥芬河市| 仙游县| 稻城县| 沁阳市| 外汇| 祁东县| 湟源县| 山东省| 陕西省| 马公市| 左云县| 当涂县| 海南省| 礼泉县| 贵德县| 东方市| 信宜市| 儋州市| 闽清县| 陵川县| 汉中市| 武隆县| 丰县| 汾西县| 岳普湖县| 瑞丽市| 宁乡县| 启东市| 庄浪县| 镇赉县| 楚雄市|