最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Vue非父子組件之間的通信方式詳解

 更新時間:2022年07月28日 15:36:32   作者:林有酒  
在實際業(yè)務(wù)中,除了父子組件通信外,還有很多非父子組件通信的場景,下面這篇文章主要給大家介紹了關(guān)于Vue非父子組件之間的通信方式,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下

非父子組件的通信

此篇講解的是, 在學(xué)習(xí)狀態(tài)管理之前, 非父子間通信的方案

在開發(fā)中,我們構(gòu)建了組件樹之后,除了父子組件之間的通信之外,還會有非父子組件之間的通信。

這里我們主要講兩種方式

  • Provide/Inject;
  • 全局事件總線;

1.Provide和Inject

1.1基本使用

Provide/Inject用于非父子組件之間共享數(shù)據(jù)

  • 比如有一些深度嵌套的組件,子組件想要獲取父組件的部分內(nèi)容;
  • 在這種情況下,如果我們?nèi)匀粚rops沿著組件鏈逐級傳遞下去,就會非常的麻煩;

對于這種情況下,我們可以使用 Provide 和 Inject

  • 無論層級結(jié)構(gòu)有多深,父組件都可以作為其所有子組件的依賴提供者;
  • 父組件有一個 provide 選項來提供數(shù)據(jù);
  • 子組件有一個 inject 選項來開始使用這些數(shù)據(jù);

實際上,你可以將依賴注入看作是“long range props”,除了

  • 父組件不需要知道哪些子組件使用它 provide 的 property
  • 子組件不需要知道 inject 的 property 來自哪里

我們開發(fā)一個下面這樣的結(jié)構(gòu): 讓App.vue提供一些數(shù)據(jù)給HomeContent.vue使用[外鏈圖片轉(zhuǎn)存失敗,

在祖先組件中通過provide將數(shù)據(jù)傳出, provide對應(yīng)的是一個對象

export default {
  components: {
    Home
  },
  // 通過provide將數(shù)據(jù)傳出
	provide() {
		return {
			name: this.name,
			age: this.age,
			height: this.height
		}
	}
}

在后代元素中, 通過inject接收祖先傳遞的數(shù)據(jù), inject對應(yīng)的是一個數(shù)組

export default {
  inject: ["name", "age", "height"]
}

1.2處理響應(yīng)式數(shù)據(jù)(了解)

我們先來驗證一個結(jié)果:如果我們修改了this.names的內(nèi)容,那么使用length的子組件會不會是響應(yīng)式的?

<template>
  <div class="app">
    <home />
    <h2>{{ name }}</h2>
    <button @click="btnClick">按鈕</button>
  </div>
</template>

<script>
  import Home from './Home.vue'

  export default {
    components: {
      Home
    },
    data() {
      return {
        name: "chenyq",
        age: 18,
        height: 1.88,
      }
    },
    // 通過provide將數(shù)據(jù)傳出
    provide() {
      return {
        name: this.name,
        age: this.age,
        height: this.height
      }
    },
    methods: {
      btnClick() {
        this.name = "kaisa"
      }
    },
  }
</script>

我們會發(fā)現(xiàn)對應(yīng)的子組件中是沒有反應(yīng)的

這是因為當(dāng)我們修改了names之后,之前在provide中引入的 this.name 本身并不是響應(yīng)式的;

那么怎么樣可以讓我們的數(shù)據(jù)變成響應(yīng)式的呢?

  • 非常的簡單,我們可以使用響應(yīng)式的一些API來完成這些功能,比如說computed函數(shù);
  • 當(dāng)然,這個computed是vue3的新特性,在后面我會專門講解,這里大家可以先直接使用一下;
import { computed } from 'vue'

export default {
  components: {
    Home
  },
  data() {
    return {
      name: "chenyq",
      age: 18,
      height: 1.88,
    }
  },
  // 通過provide將數(shù)據(jù)傳出
  provide() {
    return {
      name: computed(() => this.name),
      age: this.age,
      height: this.name
    }
  },
  methods: {
    btnClick() {
      this.name = "kaisa"
    }
  },
}

注意:我們在使用name的時候需要獲取其中的value

這是因為computed返回的是一個ref對象,需要取出其中的value來使用;

<template>
  <div class="home-content">
    <h2>名字: {{ name.value }}, 年齡: {{ age}}, 身高: {{ height}}</h2>
  </div>
</template>

2.全局事件總線

Vue3從實例中移除了 o n 、 on、 on、off 和 $once 方法,所以我們?nèi)绻M^續(xù)使用全局事件總線,要通過第三方的庫

  • Vue3官方有推薦一些庫,例如 mitt 或 tiny-emitter, 這兩個庫雖然不再維護, 但還是可以使用的;
  • 這里我們主要講解一下 hy-event-store 的使用, 是前端大神coderwhy封裝的他自己的庫;

首先,我們需要先安裝這個庫npm install hy-event-store

其次,我們可以封裝一個工具eventbus.js

import { HyEventBus } from "hy-event-store";
const eventBus = new HyEventBus()
export default eventBus

在項目中導(dǎo)入后可以使用它們

  • 我們在App.vue中監(jiān)聽事件;
  • 我們在Banner.vue中觸發(fā)事件;

Banner中觸發(fā)事件:

<template>
  <div class="home-content">
    <button @click="btnClick">按鈕</button>
  </div>
</template>

<script>
  import eventBus from './utils/event-bus'

  export default {
    methods: {
      btnClick() {
        console.log("myEvent事件被監(jiān)聽")
				// 發(fā)送事件到事件總線上
        eventBus.emit("myEvent", "chenyq", 18, 1.88)
      }
    },
  }
</script>

App中監(jiān)聽事件:

<script>
  import eventBus from './utils/event-bus'
  import Home from './Home.vue'

  export default {
    components: {
      Home
    },
    created() {
			// 監(jiān)聽事件總線上的事件
      eventBus.on("myEvent", (name, age, height) => {
        console.log(name, age, height)
      })
    },
  }
</script>

總結(jié)

到此這篇關(guān)于Vue非父子組件之間的通信方式的文章就介紹到這了,更多相關(guān)Vue非父子組件通信內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 解決Vue在Tomcat8下部署頁面不加載的問題

    解決Vue在Tomcat8下部署頁面不加載的問題

    今天小編就為大家分享一篇解決Vue在Tomcat8下部署頁面不加載的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-11-11
  • vue腳手架搭建過程圖解

    vue腳手架搭建過程圖解

    vue腳手架是個好東西,能夠快速搭建vue單頁面應(yīng)用,vue是基于node環(huán)境的,所以要先安裝node。下面通過圖文并茂的形式給大家介紹vue腳手架搭建過程圖解,感興趣的朋友一起看看吧
    2018-06-06
  • 詳解TypeScript+Vue 插件 vue-class-component的使用總結(jié)

    詳解TypeScript+Vue 插件 vue-class-component的使用總結(jié)

    這篇文章主要介紹了TypeScript+Vue 插件 vue-class-component的使用總結(jié),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-02-02
  • Electron+Vue實現(xiàn)截屏功能的兩種方式

    Electron+Vue實現(xiàn)截屏功能的兩種方式

    在Electron環(huán)境下,截屏功能相對強大,可以通過desktopCapturer獲取應(yīng)用視頻流,實現(xiàn)對整個應(yīng)用的截屏,而在非Electron環(huán)境下,截屏功能受限,只能截取瀏覽器內(nèi)容,且存在iframe或base64圖片加載問題
    2024-10-10
  • vue使用el-upload上傳文件及Feign服務(wù)間傳遞文件的方法

    vue使用el-upload上傳文件及Feign服務(wù)間傳遞文件的方法

    這篇文章主要介紹了vue使用el-upload上傳文件及Feign服務(wù)間傳遞文件的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-03-03
  • Vue核心概念A(yù)ction的總結(jié)

    Vue核心概念A(yù)ction的總結(jié)

    今天小編就為大家分享一篇關(guān)于Vue核心概念A(yù)ction的總結(jié),小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-01-01
  • Vue3?Hooks?模塊化抽離示例詳解

    Vue3?Hooks?模塊化抽離示例詳解

    這篇文章主要為大家介紹了Vue3?Hooks?模塊化抽離示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-09-09
  • 解決vue刷新頁面以后丟失store的數(shù)據(jù)問題

    解決vue刷新頁面以后丟失store的數(shù)據(jù)問題

    這篇文章主要介紹了解決vue刷新頁面以后丟失store的數(shù)據(jù)問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-08-08
  • Vue實現(xiàn)輸入框回車發(fā)送和粘貼文本與圖片功能

    Vue實現(xiàn)輸入框回車發(fā)送和粘貼文本與圖片功能

    這篇文章主要為大家詳細介紹了Vue如何實現(xiàn)聊天輸入框回車發(fā)送、粘貼文本(包括HTML)、粘貼圖片等功能,文中的實現(xiàn)方法講解詳細,需要的可以參考一下
    2022-05-05
  • vue解決跨域問題的幾種方式

    vue解決跨域問題的幾種方式

    這篇文章主要給大家介紹了關(guān)于vue解決跨域問題的幾種方式,跨域跨域報錯是前端開發(fā)中非常經(jīng)典的一個錯誤,文中通過代碼示例介紹的非常詳細,需要的朋友可以參考下
    2023-07-07

最新評論

云南省| 红河县| 龙泉市| 嵊泗县| 秭归县| 兴和县| 基隆市| 本溪市| 宿松县| 福建省| 洪雅县| 芒康县| 汶上县| 莱西市| 辰溪县| 湟中县| 新源县| 神木县| 北流市| 陆良县| 光泽县| 白城市| 通州市| 乐亭县| 健康| 顺昌县| 罗平县| 华安县| 连南| 中宁县| 洛阳市| 双桥区| 巩留县| 芜湖县| 剑阁县| 茂名市| 南丰县| 庐江县| 理塘县| 庆安县| 凤城市|