面試官:Vue組件間通信方式都有哪些?

2021-12-22 Vue中文社區

一、組件間通信的概念

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

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

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

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

舉個慄子

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

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

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

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

回到vue中,每個組件之間的都有獨自的作用域,組件間的數據是無法共享的

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

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

二、組件間通信的分類

組件間通信的分類可以分成以下

關係圖:

三、組件間通信的方案

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

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

Children.vue

props:{
    // 字符串形式
 name:String // 接收的類型參數
    // 對象形式
    age:{  
        type:Number, // 接收的類型為數值
        defaule:18,  // 默認值為18
       require:true // age屬性必須傳遞
    }
}

Father.vue組件

<Children name:"jack" age=18 />

$emit 觸發自定義事件

子組件通過$emit觸發自定義事件,$emit第二個參數為傳遞的數值

Chilfen.vue

this.$emit('add', good)

Father.vue

<Children @add="cartAdd($event)" />

ref

父組件

<Children ref="foo" />

this.$refs.foo  // 獲取子組件實例,通過子組件實例我們就能拿到對應的數據

EventBus

兄弟組件通過$emit觸發自定義事件,$emit第二個參數為傳遞的數值

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('foo')

Children2.vue

this.$bus.$on('foo', this.handle)

兄弟組件

this.$parent.on('add',this.add)

另一個兄弟組件

this.$parent.emit('add')

設置批量向下傳屬性$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('some-event', 'msg from grandson')">
{{msg}}
</div>

provide 與 inject

祖先組件

provide(){
    return {
        foo:'foo'
    }
}

後代組件

inject:['foo'] // 獲取到祖先組件傳遞過來的值

vuexgetter,可以增加一個getter派生狀態,(相當於store中的計算屬性),用來獲得共享變量的值actions也是用來存放修改state的方法,不過action是在mutations的基礎上進行。常用來做一些異步操作小結父子關係的組件數據傳遞選擇 props  與 $emit進行傳遞,也可選擇ref兄弟關係的組件數據傳遞可選擇$bus,其次可以選擇$parent進行傳遞祖先與後代組件數據傳遞可選擇attrs與listeners或者 Provide與 Inject複雜關係的組件數據傳遞可以通過vuex存放共享的變量參考文獻https://juejin.cn/post/6844903990052782094#heading-0https://zh.wikipedia.org/wiki/%E9%80%9A%E4%BF%A1https://vue3js.cn/docs/zh

相關焦點

  • Vue.js 父子組件通信的十種方式
    面試官:Vue 中父子組件通信有哪些方式?自己先想一分鐘。無可否認,現在無論大廠還是小廠都已經用上了 Vue.js 框架,簡單易上手不說,教程詳盡,社區活躍,第三方套件還多。真的是前端開發人員必備技能。而且在面試當中也往往會問到關於 Vue 方面的各種問題,其中大部分面試官會問到如上這種問題。
  • Vue組件通信的葵花寶典
    vue作為大前端的後起之秀,如今已是前端開發的必備技能,幾乎所有的公司在面試的時候,都默契的增加了一條,有vue開發經驗者優先,可見vue的魅力。vue學習門檻低,易上手,而且生態圈也比較豐富,完全滿足中小企業的需求,作為一名前端開發者,我們必須掌握基本的生存技能,才能在日益變化的前端開發中不被淘汰。
  • Vue組件的通信--eventBus
    但是對於具有簡單體系結構的應用程式來說,使用事件在組件之間進行通信就足夠了。為此,我們可以創建一個快速的解決方案並實現EventBus,也稱作vue的中央事件總線,適用於跨級或兄弟組件。EventBus允許我們在一個組件中發出一個事件,而在另一個組件中偵聽該事件。本示例將說明如何在Vue.js應用程式中執行此操作。
  • Vue2.0父子組件間通信
    運行環境搭建Vue引入方式一般有三種:第一種CDN引入<script src="[https://cdn.jsdelivr.net/npm/vue](https://cdn.jsdelivr.net/npm/vue)"></script>第二種使用 NPM 安裝$ npm install vue//安裝最新穩定版第三種搭建腳手架
  • Vue 組件通信方式居然有這麼多?你了解幾種
    vue組件通信的方式,這是在面試中一個非常高頻的問題,我剛開始找實習便經常遇到這個問題,當時只知道回到props和 $emit,後來隨著學習的深入,才發現vue組件的通信方式竟然有這麼多!今天對vue組件通信方式進行一下總結,如寫的有疏漏之處還請大家留言。
  • Vue3 的 7 種和 Vue2 的 12 種組件通信,值得收藏
    Vue2.x組件通信12種方式寫在後面了,先來 Vue3 的奧力給!Vue3 組件通信方式Vue3 通信使用寫法1. props用 props 傳數據給子組件有兩種方法,如下方法一,混合寫法// Parent.vue 傳送<child :msg1="msg1" :msg2="msg2
  • Vue最重要的知識點:組件化開發
    並且有一個很大的問題:如果多個地方都要使用到該日期呢?每次都這麼長的表達式?在Java中自然而言就會想到方法的封裝,同樣的道理,在Vue中提供了計算屬性,來替代複雜的表達式,本質也是方法:既然是方法,肯定要有返回值,頁面渲染時,可以把這個方法當成一個變量來使用。
  • 前端面試題——Vue
    前言前幾天整理了一些 html + css + JavaScript 常見的面試題(https://segmentfault.com/u/youdangde_5c8b208a23f95/articles),然後現在也是找了一些在 Vue 方面經常出現的面試題,留給自己查看消化,也分享給有需要的小夥伴。
  • 化身面試官出 20+ Vue 面試題,超級乾貨
    會遍歷當前平臺下相對的屬性處理代碼,其中就有 updateDOMLListeners 方法,內部會傳入 add() 方法組件綁定事件,原生事件,自定義事件;組件綁定之間是通過 Vue 中自定義的 $on 方法實現的。
  • 詳解30道Vue面試題
    $emit('input', '小紅') },},15、Vue 組件間通信有哪幾種方式?Vue 組件間通信是面試常考的知識點之一,這題有點類似於開放題,你回答出越多方法當然越加分,表明你對 Vue 掌握的越熟練。
  • vue2.0 子組件和父組件之間的傳值
    環境搭建步驟:打開git ,運行 npm install --global vue-cli 這是安裝vue的命令行vue init webpack vue-demoHello.vue,然後在App.vue中刪除對於Hello子組件的註冊和使用還有一些其他無關緊要的東西,此時的App.vue應為這樣App.png一.父組件向子組件傳值
  • vue組件詳解—組件通信
    組件之間通信可以用下圖表示:組件關係可分為父子組件通信、兄弟組件通信、跨級組件通信。一、自定義事件當子組件需要向父組件傳遞數據時,就要用到自定義事件。子組件用$emit ()來觸發事件,父組件用$on()來監昕子組件的事件。
  • 面試必備的 13 道舉一反三的 Vue 面試題
    vue常用的修飾符?vue-cli 工程常用的 npm 命令有哪些?vue中 keep-alive 組件的作用?首先,上述類型的面試題在文檔中可查,沒有比官方文檔更權威的答案了,其次這種問題沒有太大價值,除了考察候選人的記憶力,最後,這種面試題只要用過vue的都知道,沒有必要佔用我們的篇幅.
  • Vue面試中,經常會被問到的面試題/Vue知識點整理
    切記不要以為背了面試題,就萬事大吉了,最好是理解背後的原理,這樣面試的時候才能侃侃而談。不然,稍微有水平的面試官一看就能看出,是否有真才實學還是剛好背中了這道面試題。(都是一些基礎的vue面試題,大神不用浪費時間往下看)一、對於MVVM的理解?MVVM 是 Model-View-ViewModel 的縮寫。
  • 詳解 30 道 Vue 面試題(建議收藏)
    前言本文以前端面試官的角度出發,對 Vue 框架中一些重要的特性、框架的原理以問題的形式進行整理匯總,意在幫助作者及讀者自測下 Vue 掌握的程度。$emit('input', '小紅')  },},15、Vue 組件間通信有哪幾種方式?Vue 組件間通信是面試常考的知識點之一,這題有點類似於開放題,你回答出越多方法當然越加分,表明你對 Vue 掌握的越熟練。
  • vue內置組件keep-alive的使用
    在面試的時候,很多面試官再問vue的時候可能就會提一嘴,你知道keep-alive有什麼作用嗎
  • 面試官:簡述下 Vue3 相比 Vue2 有哪些 「與眾不同」
    window.removeEventListener('mousemove', update)  })    return {    x,    y  }}</script>複製代碼解決了 Vue2 Mixin的存在的命名衝突隱患,依賴關係不明確,不同組件間配置化使用不夠靈活
  • 【Vue.js入門到實戰教程】11-Vue Loader(下)| 編寫一個單文件 Vue 組件
    /App.vue'import 'bootstrap'import 'bootstrap/dist/css/bootstrap.min.css'...接下來,就可以正式編寫單文件組件了。編寫 ModalExample 組件我們將 vue_learning/component/slot.html 中的 modal-example 組件拆分出來,在 vue_learning/demo-project/src/components 目錄下新建一個單文件組件 ModalExample.vue,將 modal-example 組件代碼按照 Vue Loader 指定的格式填充到對應位置
  • 30 道 Vue 面試題,內含詳細講解
    $emit('input', '小紅')  },},複製代碼15、Vue 組件間通信有哪幾種方式?Vue 組件間通信是面試常考的知識點之一,這題有點類似於開放題,你回答出越多方法當然越加分,表明你對 Vue 掌握的越熟練。
  • Vue3的7種和Vue2的12種組件通信,值得收藏
    >Vue2.x組件通信12種方式寫在後面了,先來 Vue3 的奧力給!v-modelprovide / injectVuexVue3 通信使用寫法props用 props 傳數據給子組件有兩種方法,如下