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

Vue開(kāi)發(fā)之組件通信的常用方案全攻略

 更新時(shí)間:2026年02月02日 09:13:40   作者:發(fā)現(xiàn)一只大呆瓜  
在 Vue 開(kāi)發(fā)中,組件通信是構(gòu)建復(fù)雜應(yīng)用的基礎(chǔ),本文將對(duì)比 Vue 2 與 Vue 3,帶你梳理最常用的 5 種通信方案,有需要的小伙伴可以根據(jù)需要進(jìn)行選擇

前言

在 Vue 開(kāi)發(fā)中,組件通信是構(gòu)建復(fù)雜應(yīng)用的基礎(chǔ)。隨著 Vue 3 的普及,通信方式發(fā)生了不少變化(如 defineProps 的引入、EventBus 的退場(chǎng))。本文將對(duì)比 Vue 2 與 Vue 3,帶你梳理最常用的 5 種通信方案。

一、 父子組件通信:最基礎(chǔ)的單向數(shù)據(jù)流

這是最常用的通信方式,遵循“Props 向下傳遞,Emit 向上通知”的原則。

1. Vue 2 經(jīng)典寫(xiě)法

  • 接收:使用 props 選項(xiàng)。
  • 發(fā)送:使用 this.$emit。

2. Vue 3 + TS 標(biāo)準(zhǔn)寫(xiě)法

在 Vue 3 <script setup> 中,我們使用 definePropsdefineEmits。

父組件:Parent.vue

<template>
  <ChildComponent :id="currentId" @childEvent="handleChild" />
</template>

<script setup lang="ts">
import { ref } from 'vue';
import ChildComponent from './Child.vue';

const currentId = ref<string>('001');
const handleChild = (msg: string) => {
  console.log('接收到子組件消息:', msg);
};
</script>

子組件:Child.vue

<script setup lang="ts">
// 使用 TS 類(lèi)型定義 Props
const props = defineProps<{
  id: string
}>();

// 使用 TS 定義 Emits,具備更好的類(lèi)型檢查
const emit = defineEmits<{
  (e: 'childEvent', args: string): void;
}>();

const sendMessage = () => {
  emit('childEvent', '這是來(lái)自子組件的參數(shù)');
};
</script>

二、 跨級(jí)調(diào)用:通過(guò) Ref 訪問(wèn)實(shí)例

有時(shí)父組件需要直接調(diào)用子組件的內(nèi)部方法。

1. Vue 2 模式

直接通過(guò) this.$refs.childRef.someMethod() 調(diào)用。

2. Vue 3 模式(顯式暴露)

Vue 3 的組件默認(rèn)是關(guān)閉的。如果父組件想訪問(wèn)子組件的方法,子組件必須使用 defineExpose。

子組件:Child.vue

<script setup lang="ts">
const childFunc = () => {
  console.log('子組件方法被調(diào)用');
};

// 必須手動(dòng)暴露,父組件才能訪問(wèn)
defineExpose({
  childFunc
});
</script>

父組件:Parent.vue

<template>
  <Child ref="childRef" />
</template>

<script setup lang="ts">
import { ref, onMounted } from 'vue';
import Child from './Child.vue';

// 這里的類(lèi)型定義有助于獲得代碼提示
const childRef = ref<InstanceType<typeof Child> | null>(null);

onMounted(() => {
  childRef.value?.childFunc();
});
</script>

三、 非父子組件通信:事件總線 (EventBus)

1. Vue 2 做法

利用一個(gè)新的 Vue 實(shí)例作為中央調(diào)度器。

import Vue from 'vue';
export const EventBus = new Vue();

// 組件 A 發(fā)送
EventBus.$emit('event', data);
// 組件 B 接收
EventBus.$on('event', (data) => { ... });

2. Vue 3 重要變更

Vue 3 官方已移除了 $on、$off$once 方法,因此不再支持直接通過(guò) Vue 實(shí)例創(chuàng)建 EventBus。

  • 官方推薦方案:使用第三方庫(kù) mitttiny-emitter。
  • 補(bǔ)充:如果邏輯簡(jiǎn)單,可以使用 Vue 3 的 provide / inject 實(shí)現(xiàn)跨級(jí)通信。

provide / inject 示例:

1.祖先組件:提供數(shù)據(jù) (App.vue)

<template>
  <div class="ancestor">
    <h1>祖先組件</h1>
    <p>當(dāng)前主題:{{ theme }}</p>
    <Middle />
  </div>
</template>

<script setup lang="ts">
import { ref, provide } from 'vue';
import Middle from './Middle.vue';

// 1. 定義響應(yīng)式數(shù)據(jù)
const theme = ref<'light' | 'dark'>('light');

// 2. 定義修改數(shù)據(jù)的方法(推薦在提供者內(nèi)部定義,保證數(shù)據(jù)流向清晰)
const toggleTheme = () => {
  theme.value = theme.value === 'light' ? 'dark' : 'light';
};

// 3. 注入 key 和對(duì)應(yīng)的值/方法
provide('theme', theme);
provide('toggleTheme', toggleTheme);
</script>

2.中間組件:無(wú)需操作 (Middle.vue)

中間組件不需要顯式接收 theme,直接透?jìng)骷纯?/p>

3.后代組件:注入并使用 (DeepChild.vue)

<template>
  <div class="descendant">
    <h3>深層子組件</h3>
    <p>接收到的主題:{{ theme }}</p>
    <button @click="toggleTheme">切換主題</button>
  </div>
</template>

<script setup lang="ts">
import { inject } from 'vue';

// 使用 inject 獲取,第二個(gè)參數(shù)為默認(rèn)值(可選)
const theme = inject('theme');
const toggleTheme = inject<() => void>('toggleTheme');
</script>

四、 集中式狀態(tài)管理:Vuex 與 Pinia

當(dāng)應(yīng)用變得龐大,組件間的關(guān)系交織成網(wǎng)時(shí),我們需要一個(gè)“單一事實(shí)來(lái)源”。

Vuex:Vue 2 時(shí)代的標(biāo)準(zhǔn)。基于 Mutation(同步)和 Action(異步)。

Pinia:Vue 3 的官方推薦。

  • 優(yōu)勢(shì):更完美的 TS 支持、沒(méi)有 Mutation 的繁瑣邏輯、極其輕量。
  • 核心stategetters、actions。

Pinia 示例:

import { defineStore } from 'pinia';

export const useUserStore = defineStore('user', {
  state: () => ({
    name: '張三',
    age: 18
  }),
  actions: {
    updateName(newName: string) {
      this.name = newName;
    }
  }
});

五、 總結(jié)

安全性建議:在使用 defineExpose 時(shí),盡量只暴露必要的接口,遵循最小暴露原則。

EventBus 警示:Vue 3 開(kāi)發(fā)者請(qǐng)注意,不要再?lài)L試使用 new Vue() 來(lái)做事件總線,應(yīng)當(dāng)轉(zhuǎn)向 Pinia 或全局狀態(tài)。

以上就是Vue開(kāi)發(fā)之組件通信的常用方案全攻略的詳細(xì)內(nèi)容,更多關(guān)于Vue組件通信的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • vue前端crud(頁(yè)面布局、新增及vue中反向代理)圖文詳解

    vue前端crud(頁(yè)面布局、新增及vue中反向代理)圖文詳解

    Vue.js是一款輕量級(jí)的前端框架,具有響應(yīng)式的數(shù)據(jù)綁定和組件化的開(kāi)發(fā)方式,適合構(gòu)建用戶(hù)界面,這篇文章主要介紹了vue前端crud(頁(yè)面布局、新增及vue中反向代理)的相關(guān)資料,需要的朋友可以參考下
    2026-02-02
  • vue實(shí)現(xiàn)簡(jiǎn)單無(wú)縫滾動(dòng)效果

    vue實(shí)現(xiàn)簡(jiǎn)單無(wú)縫滾動(dòng)效果

    這篇文章主要為大家詳細(xì)介紹了vue實(shí)現(xiàn)簡(jiǎn)單無(wú)縫滾動(dòng)效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • vite build vue3項(xiàng)目配置開(kāi)啟sourcemap方式

    vite build vue3項(xiàng)目配置開(kāi)啟sourcemap方式

    這篇文章主要介紹了vite build vue3項(xiàng)目配置開(kāi)啟sourcemap方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-06-06
  • Vue和Flask通信的實(shí)現(xiàn)

    Vue和Flask通信的實(shí)現(xiàn)

    最近新做了個(gè)項(xiàng)目,前端使用的是目前很流行的前端框架,對(duì)于后端,本項(xiàng)目選擇的是比較好上手、輕量級(jí)的python后臺(tái)框架:Flask。感興趣的可以了解一下
    2021-05-05
  • 基于vue.js實(shí)現(xiàn)圖片輪播效果

    基于vue.js實(shí)現(xiàn)圖片輪播效果

    這篇文章主要為大家詳細(xì)介紹了基于vue.js實(shí)現(xiàn)圖片輪播效果,vue如何實(shí)現(xiàn)輪播圖效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-12-12
  • vue3中vite.config.js相關(guān)常用配置超詳細(xì)講解

    vue3中vite.config.js相關(guān)常用配置超詳細(xì)講解

    在Vue3項(xiàng)目中vite.config.js文件是Vite構(gòu)建工具的配置文件,它用于定義項(xiàng)目的構(gòu)建和開(kāi)發(fā)選項(xiàng),這篇文章主要介紹了vue3中vite.config.js相關(guān)常用配置的相關(guān)資料,需要的朋友可以參考下
    2025-04-04
  • html2canvas使用文檔(vue舉例)

    html2canvas使用文檔(vue舉例)

    html2canvas.js是一款可以在網(wǎng)頁(yè)上實(shí)現(xiàn)頁(yè)面截圖的js,它使用了html5和css3的一些新功能特性,實(shí)現(xiàn)了在客戶(hù)端對(duì)網(wǎng)頁(yè)進(jìn)行截圖的功能,這篇文章主要給大家介紹了關(guān)于html2canvas使用的相關(guān)資料,需要的朋友可以參考下
    2024-03-03
  • Vue-Ant Design Vue-普通及自定義校驗(yàn)實(shí)例

    Vue-Ant Design Vue-普通及自定義校驗(yàn)實(shí)例

    這篇文章主要介紹了Vue-Ant Design Vue-普通及自定義校驗(yàn)實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-10-10
  • vue3封裝echarts組件最佳形式詳解

    vue3封裝echarts組件最佳形式詳解

    這篇文章主要為大家介紹了vue3封裝echarts組件最佳形式詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-11-11
  • Vue指令的學(xué)習(xí)

    Vue指令的學(xué)習(xí)

    這篇文章主要介紹了Vue指令,Vue官網(wǎng)一共有提供了14個(gè)指令,下面我們就來(lái)詳細(xì)講解每一個(gè)指令的詳細(xì)內(nèi)容,需要的朋友可以參考一下
    2021-10-10

最新評(píng)論

赤峰市| 渭源县| 安多县| 疏附县| 犍为县| 南京市| 郯城县| 宜宾县| 盱眙县| 武夷山市| 开化县| 静海县| 泸溪县| 宁安市| 伊金霍洛旗| 凤台县| 琼结县| 广平县| 兰考县| 潢川县| 玉环县| 普洱| 南京市| 济南市| 岱山县| 镇坪县| 常山县| 山西省| 宜城市| 勐海县| 西丰县| 广州市| 泰宁县| 永城市| 巫溪县| 滁州市| 辽中县| 牙克石市| 铁岭市| 襄城县| 灵寿县|