Vue.js $emit的介紹和簡單使用

前言

在 Vue.js 開發中,組件化是核心思想之一。但組件間的通信是一個重要課題,特別是子組件向父組件傳遞數據的場景。Vue 提供了多種通信方式,而$emit正是實現子→父通信的關鍵方法。本文將深入解析$emit的原理、使用場景及最佳實踐。

一、$emit 基礎:原理與語法

1.1 核心概念

$emit是 Vue 實例的內置方法,用于觸發自定義事件。其核心作用是:

  • 創建事件通道:子組件定義并觸發事件
  • 傳遞數據載體:可攜帶任意類型參數
  • 父組件響應:通過v-on@監聽并處理

?1.2 語法結構

// 子組件中觸發事件
this.$emit('event-name', payload1, payload2);// 父組件中監聽
<ChildComponent @event-name="handleEvent" />

1.3 工作流程圖

子組件 (Child)            父組件 (Parent)┌───────────┐            ┌───────────┐│ this.$emit ├───────┐    │ @event    ││('event')   │       │    │ =handler  │└───────────┘       │    └───────────┘▼事件總線│▼┌───────────┐            ┌───────────┐│           │            │ handler() ││  等待觸發  │?──────────┤  處理邏輯  ││           │            │           │└───────────┘            └───────────┘

二、典型應用場景

2.1 表單數據提交

場景:子組件收集表單數據,提交給父組件處理

子組件示例

<template><form @submit.prevent="handleSubmit"><input v-model="username" placeholder="用戶名"><button type="submit">提交</button></form>
</template><script>
export default {data() {return { username: '' }},methods: {handleSubmit() {// 觸發事件并傳遞數據this.$emit('form-submit', {username: this.username,timestamp: new Date()});}}
}
</script>

父組件示例

<template><div><FormComponent @form-submit="processForm" /><p v-if="lastSubmit">上次提交: {{ lastSubmit.username }}</p></div>
</template><script>
import FormComponent from './FormComponent.vue';export default {components: { FormComponent },data() { return { lastSubmit: null } },methods: {processForm(data) {// 接收數據并處理this.lastSubmit = data;console.log('接收到表單數據:', data);}}
}
</script>

2.2 狀態變更通知

場景:子組件狀態變化時通知父組件

子組件示例

<template><div><el-switch v-model="status" @change="onStatusChange" /><span>{{ status ? '開啟' : '關閉' }}</span></div>
</template><script>
export default {props: ['initialStatus'],data() {return { status: this.initialStatus }},methods: {onStatusChange(newValue) {// 通知父組件狀態變更this.$emit('status-changed', newValue);}}
}
</script>

父組件示例

<template><div><StatusSwitch :initial-status="featureEnabled"@status-changed="updateFeature"/><p>功能狀態: {{ featureEnabled ? '啟用' : '禁用' }}</p></div>
</template><script>
import StatusSwitch from './StatusSwitch.vue';export default {components: { StatusSwitch },data() { return { featureEnabled: false } },methods: {updateFeature(newStatus) {// 更新狀態并可能觸發其他操作this.featureEnabled = newStatus;this.$message(`功能已${newStatus ? '啟用' : '禁用'}`);}}
}
</script>

2.3 列表項交互

場景:列表組件中的項觸發事件

子組件示例

<template><li @click="handleClick">{{ item.name }}<button @click.stop="deleteItem">刪除</button></li>
</template><script>
export default {props: ['item'],methods: {handleClick() {this.$emit('item-clicked', this.item.id);},deleteItem() {this.$emit('delete-item', this.item.id);}}
}
</script>

父組件示范:

<template><ul><ListItem v-for="item in list" :key="item.id":item="item"@item-clicked="viewItem"@delete-item="removeItem"/></ul>
</template><script>
import ListItem from './ListItem.vue';export default {components: { ListItem },data() {return {list: [{ id: 1, name: '項目A' },{ id: 2, name: '項目B' }]}},methods: {viewItem(id) {this.$router.push(`/items/${id}`);},removeItem(id) {this.list = this.list.filter(item => item.id !== id);}}
}
</script>

三、進階技巧與最佳實踐

3.1 事件命名規范

  • 推薦風格:使用短橫線分隔 (kebab-case)
  • 避免沖突:添加組件前綴 (如?user-form:submit)
  • 語義化:使用動詞開頭 (如?delete-item?而非?item-delete)

3.2 事件參數優化

// 推薦:傳遞結構化數據
this.$emit('user-updated', {id: this.userId,name: this.username,action: 'update'
});// 避免:傳遞零散參數
this.$emit('user-updated', this.userId, this.username, 'update');

3.3 與v-model結合

<template><input :value="value" @input="$emit('input', $event.target.value)">
</template><script>
export default {props: ['value']
}
</script>

3.4 事件驗證

props: {// 基礎類型檢查value: String,// 帶驗證的事件處理函數onSubmit: {type: Function,required: true,validator: fn => typeof fn === 'function'}
}

四、總結與最佳實踐

4.1 適用場景總結

  • 子組件向父組件傳遞數據
  • 組件狀態變更通知
  • 表單數據提交
  • 列表項交互事件

4.2 對比其他通信方式

方式方向復雜度適用場景
$emit子→父簡單組件通信
props父→子單向數據流
event bus任意跨級 / 兄弟組件通信
Vuex/Pinia全局大型應用狀態管理
provide/inject祖先→后代跨級共享數據

?

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

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

相關文章

【Linux 學習計劃】-- 簡易版shell編寫

目錄 思路 創建自己的命令行 獲取用戶命令 分割命令 檢查是否是內建命令 cd命令實現 進程程序替換執行程序 總代碼 結語 思路 int main() {while (1){// 1. 自己的命令行PrintCommandLine();// 2. 獲取用戶命令char command[SIZE];int n GetUserCommand(command, si…

一個完整的日志收集方案:Elasticsearch + Logstash + Kibana+Filebeat (二)

&#x1f4c4; 本地 Windows 部署 Logstash 連接本地 Elasticsearch 指南 ? 目標 在本地 Windows 上安裝并運行 Logstash配置 Logstash 將數據發送至本地 Elasticsearch測試數據采集與 ES 存儲流程 &#x1f9f0; 前提條件 軟件版本要求安裝說明Java17Oracle JDK 下載 或 O…

Java使用Selenium反爬蟲優化方案

當我們爬取大站的時候&#xff0c;就得需要對抗反爬蟲機制的場景&#xff0c;因為項目要求使用Java和Selenium。Selenium通常用于模擬用戶操作&#xff0c;但效率較低&#xff0c;所以需要我們結合其他技術來實現高效。 在 Java 中使用 Selenium 進行高效反爬蟲對抗時&#xff…

狀態管理方案對比與決策

1. 狀態管理的基本概念 現代前端應用隨著功能復雜度提升&#xff0c;狀態管理已成為架構設計的核心挑戰。狀態管理本質上解決的是數據的存儲、變更追蹤和響應式更新問題&#xff0c;以確保UI與底層數據保持同步。 核心挑戰: 狀態共享與組件通信可預測的狀態變更性能優化與重…

Fetch與Axios:區別、聯系、優缺點及使用差異

Fetch與Axios&#xff1a;區別、聯系、優缺點及使用差異 文章目錄 Fetch與Axios&#xff1a;區別、聯系、優缺點及使用差異一、聯系二、區別1. 瀏覽器支持與兼容性2. 響應處理3. 請求攔截和響應攔截4. 錯誤處理 三、優缺點1. Fetch API優點缺點 2. Axios優點缺點 四、使用上的差…

【Docker】快速入門與項目部署實戰

我們在部署一個項目時&#xff0c;會出現一系列問題比如&#xff1a; 命令太多了&#xff0c;記不住軟件安裝包名字復雜&#xff0c;不知道去哪里找安裝和部署步驟復雜&#xff0c;容易出錯 其實上述問題不僅僅是新手&#xff0c;即便是運維在安裝、部署的時候一樣會覺得麻煩…

Java面試題尚硅谷版第1季

1、寫出如下代碼運行結果 1.1、 使用局部變量表和操作數棧解題 1.2、使用前置和后置遞增解題 2、寫一個單例模式 2.1、考察知識點 2.2、單例模式實現 3、類加載和初始化順序 package classload;public class Father {private int i test();private static int j method();st…

關于Qt阻斷樣式繼承的解決辦法

引言 在使用 Qt 開發桌面應用時&#xff0c;借助樣式表&#xff08;StyleSheet&#xff09;來統一定義界面風格是非常常見的做法。通常&#xff0c;你會在主程序中通過 qApp->setStyleSheet(...) 或者直接給某個父控件設置樣式表&#xff0c;讓所有的子控件都采用相同的配色…

鼠標右鍵添加新建某種文件的方法

場景 我經常用到.emmx&#xff0c;.eddx文件&#xff0c;電腦上裝的是wpsX億圖&#xff08;因為有wps會員&#xff09;&#xff0c;沒有開億圖會員。 然后問題就是&#xff0c;思維導圖和流程圖我都能正常開&#xff0c;正常編輯&#xff0c;但鼠標右鍵沒有新建這兩個文件的按…

Inxpect安全雷達傳感器與控制器:動態檢測 + 抗干擾技術重構工業安全防護體系

Inxpect 推出工業安全領域新型智能傳感器與控制器&#xff0c;其核心產品為雷達掃描儀&#xff0c;具備動態調整檢測區域、抗干擾能力強等特點&#xff0c;可精準檢測危險區域人員進入或存在情況&#xff0c;適用于移動機器人等場景。 Inxpect安全雷達傳感器核心功能 動態檢測…

【AI學習】李廣密與階躍星辰首席科學家張祥雨對談:多模態發展的歷史和未來

仔細閱讀了文章《專訪張祥雨&#xff1a;多模態推理和自主學習是未來的 2 個 「GPT-4」 時刻》 https://mp.weixin.qq.com/s/892QuRPH9uP6zN6dS-HZMw 非常贊嘆的一篇文章&#xff0c;說清楚了NLP、CV發展中的許多重大問題&#xff0c;讀來醍醐灌頂&#xff01;這樣的文章&…

C++中std::deque詳解和實戰工程代碼示例

C中std::deque詳解和實戰工程代碼示例 std::deque&#xff08;雙端隊列&#xff09;是 C 標準庫中的一個序列容器&#xff0c;與 std::vector 類似&#xff0c;但它支持從頭部和尾部高效地插入和刪除元素。它底層采用分段連續空間實現&#xff0c;兼具靈活性與性能。 一、基本…

【AI大模型入門指南】概念與專有名詞詳解 (二)

【AI大模型入門指南】概念與專有名詞詳解 &#xff08;二&#xff09; 一 、前言 當你和聊天機器人聊得天花亂墜時&#xff0c;當你用文字讓AI生成精美圖片時&#xff0c;當手機相冊自動幫你分類照片時 —— 這些看似智能的操作背后&#xff0c;都藏著 AI 大模型的身影。 本…

AIStor 的模型上下文協議 (MCP) 服務器:管理功能

在本系列的上一篇博文中&#xff0c;我們討論了 MinIO AIStor 的模型上下文協議 (MCP) 服務器的基本用戶級功能。我們學習了如何使用人類語言命令查看存儲桶的內容、分析對象并標記它們以便將來處理&#xff0c;以及如何通過 LLM&#xff08;例如 Anthropic Claude&#xff09;…

期權末日輪實值期權盈利未平倉怎么辦?

本文主要介紹期權末日輪實值期權盈利未平倉怎么辦&#xff1f;期權末日輪實值期權盈利未平倉該怎么辦&#xff0c;需要明確幾個關鍵點&#xff1a;末日輪指的是期權到期日臨近的時候&#xff0c;通常指最后一周&#xff0c;尤其是最后一天&#xff0c;這時候時間價值衰減很快&a…

C++/Qt 聯合編程中的定時器使用陷阱:QObject::startTimer 報錯詳解

在 Qt 開發中&#xff0c;QTimer 是一個常用的工具類&#xff0c;用于處理定時事件。但不少開發者在 C/Qt 聯合編程&#xff0c;尤其是在工具類、靜態類、線程中使用定時器時&#xff0c;會遇到如下令人困惑的報錯&#xff1a; QObject::startTimer: Timers can only be used …

CentOS7.9 查詢運維安全日志,排查惡意用戶

1、查看系統版本 cat /etc/redhat-release uname -a 2、查看所有賬號 cat /etc/shadow 3、修改 root 密碼 passwd 3、查看賬號ID id jinzhi 4、查看登錄日志 lastlog 5、查看操作日志 cat .bash_history sudo cat /home/yunwei/.bash_history sudo grep root /va…

多模態大語言模型arxiv論文略讀(117)

Training-free Zero-shot Composed Image Retrieval via Weighted Modality Fusion and Similarity ?? 論文標題&#xff1a;Training-free Zero-shot Composed Image Retrieval via Weighted Modality Fusion and Similarity ?? 論文作者&#xff1a;Ren-Di Wu, Yu-Yen L…

如何正確的配置eureka server集群

將 Eureka Server 實例的 hostname 都配置成相同的值&#xff0c;在 Eureka Server 集群環境下同樣是不推薦且通常會導致嚴重問題的&#xff0c; 核心問題&#xff1a;Eureka Server 集群的工作機制 Eureka Server 集群通過相互注冊&#xff08;Peering&#xff09;來實現高可…

AI支持下的-ArcGIS數據處理、空間分析、可視化及多案例綜合應用

查看原文>>> 從入門到精通-AI支持下的-ArcGIS數據處理、空間分析、可視化及多案例綜合應用 結合ArcGIS和GPT的優勢&#xff0c;本文重點進行AI大模型應用、ArcGIS工作流程及功能、Prompt使用技巧、AI助力工作流程、AI助力數據讀取與處理、AI助力空間分析、AI助力遙感…