vue基礎之組件通信(VUE3)

文章目錄

  • 前言
  • 一、父子組件通信
    • 1.父組件向子組件通信
    • 2.子組件向父組件通信
    • 3.ref父組件直接操作子組件通信。
  • 二、跨代通信
    • 1. 跨層級通信
    • 2.事件總線通信
  • 總結


前言

vue3的組件通信和vue2相比在語法上會有些差距,且vue3有的通信方式也在功能上比vue2更加完善,比如provide/inject,vue3相比vue2多了支持響應式的功能。這里主要列出vue3的組件通信,且使用vue3的組合式API風格來實現。


提示:以下是本篇文章正文內容,下面案例可供參考

一、父子組件通信

1.父組件向子組件通信

(1)父組件傳遞:
只需要在引入的子組件標簽上,傳入(子組件那里已經定義的)參數名對應的值即可。
語法:
<template><子組件名稱 :參數名1="值" :參數名2="值"></子組件名稱></template>
(2)子組件接收:
使用props關鍵字。在vue2(選項式API)中,props直接定義在最外層和data、methods同級,而vue3的組合式api中則需要通過defineProps來定義,
即語法為:(語法糖形式)

const props = defineProps({ 參數名1: 參數類型, 參數名2: 參數類型 });

如果是setup()形式,則和setup()同級,寫法和選項式api一致,一般寫setup上面:

export default {props: {參數1: 參數值},setup(props) {// setup() 接收 props 作為第一個參數console.log(props.參數1)}
}

當然defineProps中不僅可以傳對象也可以傳字符串數組,一般是傳遞對象,因為需要定義參數類型。

使用時語法:props.參數名1

整體示例:
子組件:
ChildComponent.vue

<script setup>
import { ref } from 'vue';const props = defineProps({title: {type: String,default: '默認標題',},btnFun: {type: Function,default: () => {},},
});
const inputValue = ref('');
</script><template><div><h2>{{ props.title }}</h2><a-button type="primary" @click="props.btnFun">完成</a-button><a-input v-model:value="inputValue" placeholder="請輸入" /></div>
</template>

父組件:


<template><child-component :title="測試標題" :btn-fun="() => { console.log('按鈕被點擊'); }"></child-component>
</template>

其中ChildComponent和btnFun可以是原值,也可以是“-”分割后的值,都可以識別。

2.子組件向父組件通信

使用emit,vue3定義emit,使用defineEmits,
子組件里:
定義語法:
const emit = defineEmits(['child-event1','child-event2']);
setup()形式定義位置同1中的defineProps。
觸發語法:
emit('child-event1',要傳遞的參數)
父組件里:
接收語法:
<子組件名 @child-event1='本地定義函數名'/>
整體例子:

<!-- 父組件 -->
<template><ChildComponent :message="parentMsg" @child-event="handleEvent" />
</template><script setup>
import { ref } from 'vue';
const parentMsg = ref('來自父組件的數據');const handleEvent = (payload) => {console.log('子組件傳來:', payload);
};
</script><!-- 子組件:ChildComponent -->
<template><button @click="$emit('child-event', '觸發事件')">發送數據</button>
</template><script setup>
const props = defineProps({message: String
});
const emit = defineEmits(['child-event']);
</script>

3.ref父組件直接操作子組件通信。

vue3中的語法,父組件:

<template><子組件名稱 ref="ref名稱"/>
</template><script setup>
import { ref } from 'vue';
const 'ref名稱' = ref(null); // 父組件可以通過'ref名稱'拿到子組件上的方法和data等數據</script>

示例:

<!-- 父組件 -->
<template><ChildComponent ref="childRef" />
</template><script setup>
import { ref, onMounted } from 'vue';
const childRef = ref(null);onMounted(() => {childRef.value.someMethod(); // 調用子組件方法
});
</script>

進階:如果是遇到多個子組件按需加載的情況,則此時若要通過ref獲取到子組件的信息,則子組件還需加上 defineExpose
場景:
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

is里面循環的子組件(StepOne、StepTwo)里需要加上:在這里插入圖片描述

二、跨代通信

1. 跨層級通信

使用provide/inject函數, 其中provide為后代組件提供數據,需要接收的后代組件則是通過inject去接收數據。
語法:
祖先組件發送數據:provide('注入名', 要傳遞的參數);
后代接收數據:inject('注入名',要接收的參數);
使用示例:

<!-- 祖先組件 -->
<script setup>
import { provide, ref } from 'vue';
const theme = ref('dark');
provide('theme', theme); // 提供數據
</script><!-- 深層子組件 -->
<script setup>
import { inject } from 'vue';
const theme = inject('theme'); // 注入數據
console.log(theme.value); // 'dark'
</script>

另:如果沒有使用setup語法糖,provide(/inject)要在setup()函數內調用:

import { provide } from 'vue'export default {setup() {provide(/* 注入名 */ 'message', /* 值 */ 'hello!')}
}

進階:
provide第二個參數,即要傳遞的參數值可以是任意類型,包括響應式的狀態,比如一個 ref;
provide可以傳遞多個,后代按照注入名字接收,如果有重復的則以離得最近的父代為準。

import { ref, provide } from 'vue'const count = ref(0);
function updateCount() {count ++;
}
provide('key', { count, updateCount });

后代接收時:

<script setup>
import { inject } from 'vue'const { count, updateCount } = inject('location'); 
</script><template><button @click="updateCount">{{ count }}</button>
</template>

2.事件總線通信

使用mitt工具:
下載:npm install mitt
創建事件總線模塊:
event-bus.js

import mitt from 'mitt';const emitter = mitt();export default emitter;

發送事件組件:
SenderComponent.vue

<template><button @click="sendMessage">發送消息</button>
</template><script setup>
import emitter from './event-bus';const sendMessage = () => {emitter.emit('custom-event', {message: '來自SenderComponent的消息',timestamp: new Date().toISOString()});
};
</script>

接收事件組件:
ReceiverComponent.vue

<template><div><p>接收到的消息: {{ receivedMessage }}</p></div>
</template><script setup>
import { ref, onMounted, onUnmounted } from 'vue';
import emitter from './event-bus';const receivedMessage = ref('等待消息...');const handleEvent = (payload) => {receivedMessage.value = payload.message;console.log('接收到事件:', payload);
};onMounted(() => {// 注冊事件監聽emitter.on('custom-event', handleEvent);
});onUnmounted(() => {// 移除事件監聽,防止內存泄漏emitter.off('custom-event', handleEvent);
});
</script>

總結

以上用了大概五種方式來闡述組件之間的通信,這些在日常開發中比較常見,對于vue入門來說是需要去掌握并靈活運用的,對于子父組件一開始會有混亂不清的情況,這種在以后的練習和熟悉中會逐漸分清。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/86946.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/86946.shtml
英文地址,請注明出處:http://en.pswp.cn/web/86946.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【RidgeUI AI+系列】中文重復統計器

中文重復統計器 文字重復統計是一個使用文本處理工具&#xff0c; 輸入文本內容并指定最小詞長度后&#xff0c; 就能自動高亮顯示重復的詞。 本教程將會借助AI實現這個應用的開發 頁面腳本編寫 該工具的基礎流程較為清晰&#xff1a;用戶輸入一段文字后&#xff0c;調用提取…

代碼隨想錄|圖論|05島嶼數量(深搜DFS)

leetcode:99. 島嶼數量 題目 題目描述&#xff1a; 給定一個由 1&#xff08;陸地&#xff09;和 0&#xff08;水&#xff09;組成的矩陣&#xff0c;你需要計算島嶼的數量。島嶼由水平方向或垂直方向上相鄰的陸地連接而成&#xff0c;并且四周都是水域。你可以假設矩陣外均…

數據結構-第二節-堆棧與隊列

一、概念&#xff1a; 堆棧與隊列也是線性表&#xff0c;但是&#xff1a; 堆棧&#xff1a;只能在一個端進行插入刪除&#xff0c;此端稱為棧頂。&#xff08;特點&#xff1a;后來居上&#xff09; 隊列&#xff1a;在一端進行插入&#xff08;隊尾&#xff09;&#xff0…

HarmonyNext動畫大全02-顯式動畫

HarmonyOS NEXT顯式動畫詳解 1. 核心接口 顯式動畫通過animateTo接口實現&#xff0c;主要特點包括&#xff1a; 觸發方式&#xff1a;需主動調用接口觸發動畫 參數配置 &#xff1a; animateTo({duration: 1000, // 動畫時長(ms)curve: Curve.Ease, // 動畫曲線delay: 200…

芯谷科技--高壓降壓型 DC-DC 轉換器D7005

在當今電子設備日益復雜且對電源性能要求極高的背景下&#xff0c;一款高效、穩定的電源管理芯片至關重要。 D7005憑借其卓越的性能和廣泛的應用適配性&#xff0c;成為眾多工程師在設計電源方案時的優選。 產品簡介 D7005 是一款高效、高壓降壓型 DC-DC 轉換器&#xff0c;具…

MySQL的GTID詳解

GTID&#xff08;Global Transaction Identifier&#xff0c;全局事務標識符&#xff09;是MySQL 5.6及以上版本引入的重要特性&#xff0c;用于在主從復制環境中唯一標識每個事務&#xff0c;簡化復制管理、故障轉移和數據一致性維護。以下從多維度詳細介紹GTID&#xff1a; …

專題:2025中國游戲科技發展研究報告|附130+份報告PDF、原數據表匯總下載

原文鏈接&#xff1a;https://tecdat.cn/?p42756 本報告匯總解讀基于艾瑞咨詢《2025中國游戲科技發展白皮書》、伽馬數據《2025年1-3月中國游戲產業季度報告》、嘉世咨詢《2025中國單機游戲市場現狀報告》等多份行業研報數據。當《黑神話&#xff1a;悟空》以虛幻引擎5復刻東…

【數據挖掘】數據挖掘綜合案例—銀行精準營銷

要求&#xff1a; 1、根據相關的信息預測通過電話推銷&#xff0c;用戶是否會在銀行進行存款 2、數據bank.csv&#xff0c;約4520條數據&#xff0c;17個屬性值 提示&#xff1a; 17個屬性&#xff0c;分別是年齡&#xff0c;工作類型&#xff0c;婚姻狀況&#xff0c;受教育…

postgresql查看鎖的sql語句

發現一個查看postgresql鎖比較好的sql語句&#xff0c;參考鏈接地址如下 鏈接地址 查看鎖等待sql witht_wait as(select a.mode,a.locktype,a.database,a.relation,a.page,a.tuple,a.classid,a.granted,a.objid,a.objsubid,a.pid,a.virtualtransaction,a.virtualxid,a.trans…

JSON 格式詳解

JSON 格式詳解 隨著互聯網的發展和各種 Web 應用程序的普及&#xff0c;數據交換已經成為了我們日常開發中的重要環節。而在各種數據交換格式中&#xff0c;JSON&#xff08;JavaScript Object Notation&#xff09;作為一種輕量級的數據交換格式&#xff0c;以其簡潔、易于閱…

原型設計Axure RP網盤資源下載與安裝教程共享

對于初學者來說&#xff0c;我們熟悉一下其定義&#xff1a;?Axure RP是一款常用的快速原型設計工具?&#xff0c;主要用于創建應用軟件或Web網站的線框圖、流程圖、原型和規格說明文檔&#xff0c;廣泛應用于產品經理、UI/UX設計師等專業領域。?? 主要用戶群體&#xff1…

iframe嵌套 redirect中轉頁面 route跳轉

需求是項目A要使用iframe內嵌項目B的頁面&#xff0c; 由于需要嵌套的頁面很多&#xff0c;每個頁面路徑和參數又各不相同&#xff0c; 所以我們在項目B里做了一個中轉頁面&#xff0c;這樣就能自己掌控項目A傳遞過來的東西了&#xff1b; routes.js 增加一個菜單&#xff1a;…

IP數據報 封裝成 MAC幀 ( 目的MAC地址6B 源MAC地址6B 類型2B 數據部分 FCS校驗和4B )

將 IP 數據報&#xff08;Internet Protocol Datagram&#xff09;封裝成 MAC 幀 需要在數據鏈路層添加適當的頭部信息&#xff0c;以便在局域網內進行傳輸。這個過程涉及將網絡層&#xff08;IP 層&#xff09;的數據通過數據鏈路層&#xff08;MAC 層&#xff09;封裝成適合物…

Note2.4 機器學習:Batch Normalization Introduction

Batch Normalization&#xff08;批標準化&#xff0c;BN&#xff09;通過標準化數據的操作&#xff0c;使得損失函數的優化地形&#xff08;optimization landscape&#xff09;更加平滑&#xff0c;從而達到更好地訓練效果。BN常用于卷積神經網絡&#xff08;CNN&#xff09;…

IDEA在AI時代的智能編程實踐:從工蜂到通義靈碼的效能躍遷??

引言? 在騰訊云工作期間&#xff0c;我曾使用?工蜂的AI代碼補全功能&#xff0c;結合IntelliJ IDEA&#xff08;以下簡稱IDEA&#xff09;極大提升了開發效率。如今離開騰訊云&#xff0c;面對外部開發環境&#xff0c;如何繼續利用AI提升編碼效率&#xff1f;本文將系統梳理…

MySQL 慢查詢日志詳解

慢查詢日志&#xff08;Slow Query Log&#xff09;是 MySQL 提供的一種核心性能優化工具&#xff0c;用于記錄執行時間超過指定閾值的 SQL 語句。通過分析這些日志&#xff0c;可以定位數據庫性能瓶頸&#xff0c;優化低效查詢&#xff0c;提升系統整體效率。 一、慢查詢日志的…

UV安裝Python指南總結

UV安裝Python指南總結 UV是一個Python包管理工具,它可以幫助我們安裝和管理Python版本。以下是關于UV安裝Python的主要功能和用法總結。 基本使用 安裝最新版Python uv python install注意&#xff1a;UV使用Astral的python-build-standalone項目提供的Python發行版,而不是…

運維基礎-MYSQL數據庫-筆記

序 欠10年前自己的一份筆記&#xff0c;獻給今后的自己。 數據庫介紹 數據的時代 涉及的數據量大數據不隨程序的結束而消失數據被多個應用程序共享大數據 數據庫的發展史 萌芽階段&#xff1a;文件系統 使用磁盤文件來存儲數據初級階段&#xff1a;第一代數據庫 出現了網狀…

從GPTs到Real智能體:目前常見的幾種創建智能體方式

文章目錄 智能體的三個發展階段低階智能體(面向過程) VS 高階智能體(面向目標)主流智能體創建平臺實踐基礎型平臺cherry-studio豆包訊飛星火騰訊元器 高階智能體開發體系cline開發套件Coze平臺Dify開源框架Manus突破性方案 技術演進趨勢總結 智能體的三個發展階段 當前智能體技…

WPF 實現自定義數字輸入彈窗

1.前端代碼實現 <Grid><Grid.RowDefinitions><RowDefinition Height"100" /><RowDefinition Height"*" /></Grid.RowDefinitions><BorderGrid.Row"0"BorderBrush"WhiteSmoke"BorderThickness"0…