搜尋
首頁web前端Vue.jsVue組件間通訊有哪些方式

方式:1、透過共同祖輩「$parent」或「$root」進行通訊;2、父元件透過設定子元件ref來進行通訊;3、兄弟元件透過「$emit」觸發自訂事件,「$emit」第二個參數為傳遞的數值,另一個兄弟元件透過「$on」監聽自訂事件。

Vue組件間通訊有哪些方式

本文操作環境:windows10系統、Vue2.9.6版,DELL G3電腦。

Vue元件間通訊有哪些方式

一、元件間通訊的概念

開始之前,我們先把元件間通信這個詞進行拆分

組件

通信

都知道組件是vue最強大的功能之一,vue中每一個.vue我們都可以視之為一個元件

通訊指的是發送者透過某種媒體以某種格式來傳遞訊息到收信者以達到某個目的。廣義上,任何資訊的交通都是通訊

元件間通訊即指元件(.vue)透過某種方式來傳遞訊息以達到某個目的

舉個栗子

我們在使用UI框架中的table元件,可能會往table元件中傳入某些數據,這個本質就形成了元件之間的通訊

二、元件間通信解決了什麼

在古代,人們透過驛站、飛鴿傳書、烽火警報、符號、語言、眼神、觸碰等方式進行訊息傳遞,到了今天,隨著科技水準的快速發展,通訊基本上完全利用有線或無線電完成,相繼出現了有線電話、固定電話、無線電話、手機、網路甚至視訊電話等各種通訊方式

從上面這段話,我們可以看到通訊的本質是資訊同步,共享

回到vue中,每個元件之間的都有獨自的作用域,元件間的資料是無法共享的

但實際開發工作中我們常常需要讓元件之間共享數據,這也是元件通訊的目的

要讓它們互相之間能進行通訊,這樣才能構成一個有機的完整系統

二、元件間通訊的分類

元件間通訊的分類可以分成以下

  • 父子元件之間的通訊

  • 兄弟元件之間的通訊

  • #祖孫與後代元件之間的通訊

  • 非關聯元件間之間的通訊
  • 三、元件間通訊的方案

  • 整理vue中8種常規的溝通方案

  • 透過 props 傳遞

  • #透過 $emit 觸發自訂事件

#使用 ref

EventBus

#parent或root

##attrs 與 listeners

Provide 與 Inject

#Vuex

props傳遞資料

適用場景:父元件傳遞資料給子元件

子元件設定props屬性,定義接收父元件傳遞過來的參數

父元件在使用子元件標籤中透過字面量傳遞值

Children.vue

props:{
    // 字符串形式
 name:String // 接收的类型参数
    // 对象形式
    age:{  
        type:Number, // 接收的类型为数值
        defaule:18,  // 默认值为18
       require:true // age属性必须传递
    }
}

Father.vue元件

#$emit 觸發自訂事件

適用場景:子元件傳遞資料給父元件

子元件透過$emit觸發自訂事件,$emit第二個參數為傳遞的數值

父元件綁定監聽器取得到子元件傳遞過來的參數

#Chilfen.vue

this.$emit('add', good)
Father.vue
<Children @add="cartAdd($event)" />
ref

#父元件在使用子元件的時候設定ref

父元件透過設定子元件ref來取得資料

父元件

<Children ref="foo" />
this.$refs.foo  // 获取子组件实例,通过子组件实例我们就能拿到对应的数据

EventBus

使用場景:兄弟元件傳值

建立一個中央時間匯流排EventBus

兄弟元件透過$emit觸發自訂事件,$emit第二個參數為傳遞的數值

另一個兄弟元件透過$on監聽自訂事件

Bus.js

// 创建一个中央时间总线类
class Bus {
  constructor() {
    this.callbacks = {};   // 存放事件的名字
  }
  $on(name, fn) {
    this.callbacks[name] = this.callbacks[name] || [];
    this.callbacks[name].push(fn);
  }
  $emit(name, args) {
    if (this.callbacks[name]) {
      this.callbacks[name].forEach((cb) => cb(args));
    }
  }
}
// main.js
Vue.prototype.$bus = new Bus() // 将$bus挂载到vue实例的原型上
// 另一种方式
Vue.prototype.$bus = new Vue() // Vue已经实现了Bus的功能
Children1.vue
this.$bus.$emit(&#39;foo&#39;)
Children2.vue
this.$bus.$on(&#39;foo&#39;, this.handle)

Parent或 root

#透過共同祖輩$parent或$root搭建通訊僑聯

兄弟元件###
this.$parent.on(&#39;add&#39;,this.add)
###另一個兄弟元件###
this.$parent.emit(&#39;add&#39;)
######attrs與 listeners######## ##適用場景:祖先傳遞資料給子孫######設定批次向下傳屬性$attrs和 $listeners######包含了父級作用域中不作為 prop 被辨識 (且取得) 的特性綁定 ( class 和 style 除外)。 ######可以透過 v-bind="$attrs" 傳⼊內部元件###
// child:并未在props中声明foo
<p>{{$attrs.foo}}</p>
// parent
<HelloWorld foo="foo"/>
// 给Grandson隔代传值,communication/index.vue
<Child2 msg="lalala" @some-event="onSomeEvent"></Child2>
// Child2做展开
<Grandson v-bind="$attrs" v-on="$listeners"></Grandson>
// Grandson使⽤
<div @click="$emit(&#39;some-event&#39;, &#39;msg from grandson&#39;)">
{{msg}}
</div>
######provide 與 inject##########在祖先元件定義provide屬性,傳回傳遞的值######在後代元件經由inject接收元件傳遞過來的值######祖先元件###
provide(){
    return {
        foo:&#39;foo&#39;
    }
}
###後位元件######inject:['foo'] // 取得到祖先元件傳遞過來的值#########vuex##########適用場景: 複雜關係的元件資料傳遞###

Vuex作用相當於一個用來儲存共享變數的容器

state用來存放共享變數的地方

getter,可以增加一個getter派生狀態,(相當於store中的計算屬性),用來取得共享變數的值

mutations用來存放修改state的方法。

actions也是用來存放修改state的方法,不過action是在mutations的基礎上進行。常用來做一些非同步操作

小結

父子關係的元件資料傳遞選擇 props  與 $emit傳遞,也可選擇ref

兄弟關係的元件資料傳遞可選擇$bus,其次可以選擇$parent進行傳遞

祖先與後代組件資料傳遞可選擇attrs與listeners或 Provide與 Inject

複雜關係的元件資料傳遞可以透過vuex存放共享的變數

【相關推薦:《vue.js教學》】

以上是Vue組件間通訊有哪些方式的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
vue.js和前端堆棧:了解連接vue.js和前端堆棧:了解連接Apr 24, 2025 am 12:19 AM

Vue.js與前端技術棧緊密集成,提升開發效率和用戶體驗。 1)構建工具:與Webpack、Rollup集成,實現模塊化開發。 2)狀態管理:與Vuex集成,管理複雜應用狀態。 3)路由:與VueRouter集成,實現單頁面應用路由。 4)CSS預處理器:支持Sass、Less,提升樣式開發效率。

Netflix:探索React(或其他框架)的使用Netflix:探索React(或其他框架)的使用Apr 23, 2025 am 12:02 AM

Netflix選擇React來構建其用戶界面,因為React的組件化設計和虛擬DOM機制能夠高效處理複雜界面和頻繁更新。 1)組件化設計讓Netflix將界面分解成可管理的小組件,提高了開發效率和代碼可維護性。 2)虛擬DOM機制通過最小化DOM操作,確保了Netflix用戶界面的流暢性和高性能。

vue.js和前端:深入研究框架vue.js和前端:深入研究框架Apr 22, 2025 am 12:04 AM

Vue.js被開發者喜愛因為它易於上手且功能強大。 1)其響應式數據綁定係統自動更新視圖。 2)組件系統提高了代碼的可重用性和可維護性。 3)計算屬性和偵聽器增強了代碼的可讀性和性能。 4)使用VueDevtools和檢查控制台錯誤是常見的調試技巧。 5)性能優化包括使用key屬性、計算屬性和keep-alive組件。 6)最佳實踐包括清晰的組件命名、使用單文件組件和合理使用生命週期鉤子。

vue.js在前端的力量:關鍵特徵和好處vue.js在前端的力量:關鍵特徵和好處Apr 21, 2025 am 12:07 AM

Vue.js是一個漸進式的JavaScript框架,適用於構建高效、可維護的前端應用。其關鍵特性包括:1.響應式數據綁定,2.組件化開發,3.虛擬DOM。通過這些特性,Vue.js簡化了開發過程,提高了應用性能和可維護性,使其在現代Web開發中備受歡迎。

vue.js比反應好嗎?vue.js比反應好嗎?Apr 20, 2025 am 12:05 AM

Vue.js和React各有優劣,選擇取決於項目需求和團隊情況。 1)Vue.js適合小型項目和初學者,因其簡潔和易上手;2)React適用於大型項目和復雜UI,因其豐富的生態系統和組件化設計。

vue.js的功能:增強前端的用戶體驗vue.js的功能:增強前端的用戶體驗Apr 19, 2025 am 12:13 AM

Vue.js通過多種功能提升用戶體驗:1.響應式系統實現數據即時反饋;2.組件化開發提高代碼復用性;3.VueRouter提供平滑導航;4.動態數據綁定和過渡動畫增強交互效果;5.錯誤處理機制確保用戶反饋;6.性能優化和最佳實踐提升應用性能。

vue.js:定義其在網絡開發中的作用vue.js:定義其在網絡開發中的作用Apr 18, 2025 am 12:07 AM

Vue.js在Web開發中的角色是作為一個漸進式JavaScript框架,簡化開發過程並提高效率。 1)它通過響應式數據綁定和組件化開發,使開發者能專注於業務邏輯。 2)Vue.js的工作原理依賴於響應式系統和虛擬DOM,優化性能。 3)實際項目中,使用Vuex管理全局狀態和優化數據響應性是常見實踐。

了解vue.js:主要是前端框架了解vue.js:主要是前端框架Apr 17, 2025 am 12:20 AM

Vue.js是由尤雨溪在2014年發布的漸進式JavaScript框架,用於構建用戶界面。它的核心優勢包括:1.響應式數據綁定,數據變化自動更新視圖;2.組件化開發,UI可拆分為獨立、可複用的組件。

See all articles

熱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

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

熱工具

MantisBT

MantisBT

Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

EditPlus 中文破解版

EditPlus 中文破解版

體積小,語法高亮,不支援程式碼提示功能

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強大的PHP整合開發環境

Safe Exam Browser

Safe Exam Browser

Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

SublimeText3 Mac版

SublimeText3 Mac版

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