Vue 3 中的 $emit 函數是如何工作的

在 Vue.js 框架中,組件間的通信是一個核心概念。Vue 提供了多種方式來實現父子組件間的通信,其中?$emit?是子組件向父組件發送消息的一種常用手段。在 Vue 3 中,隨著 Composition API 的引入,$emit?的使用方式也發生了一些變化,但其核心原理仍然保持不變。

一、Vue 2 中的?$emit

在 Vue 2 中,我們通常在 Vue 實例的?methods?或?computed?屬性中使用?this.$emit?來觸發一個自定義事件,并傳遞數據給父組件。例如:

 

vue復制代碼

<template>
<button @click="notifyParent">點擊通知父組件</button>
</template>
<script>
export default {
methods: {
notifyParent() {
this.$emit('childToParent', 'Hello from child!');
}
}
}
</script>

在這個例子中,當按鈕被點擊時,notifyParent?方法會被調用,進而通過?this.$emit?觸發一個名為?childToParent?的事件,并傳遞一個字符串?'Hello from child!'?作為參數。

二、Vue 3 中的?$emit

在 Vue 3 中,你仍然可以使用?this.$emit?在 Options API 中觸發事件,但如果你選擇使用 Composition API,那么就需要從?setup?函數的參數中獲取?emit?函數。例如:

 

vue復制代碼

<template>
<button @click="notifyParent">點擊通知父組件</button>
</template>
<script>
import { defineComponent } from 'vue';
export default defineComponent({
setup(props, { emit }) {
const notifyParent = () => {
emit('childToParent', 'Hello from child!');
};
return { notifyParent };
}
});
</script>

在這個例子中,setup?函數接收兩個參數:props?和一個包含多個實用函數的上下文對象。我們可以從這個上下文對象中解構出?emit?函數,并在?setup?函數內部使用它來觸發事件。

三、$emit?的工作原理

無論是在 Vue 2 還是 Vue 3 中,$emit?的基本工作原理都是相似的。當你在子組件中調用?$emit?函數時,Vue 會查找該組件的父組件,并查看父組件是否監聽了你觸發的事件。如果父組件監聽了該事件,那么它就會調用與該事件相關聯的回調函數,并將你傳遞的數據作為參數傳遞給這個回調函數。

這個過程是同步的,意味著一旦你調用了?$emit,父組件中的回調函數就會立即被調用。這使得?$emit?成為一種非常有效的組件間通信手段,尤其是當你需要子組件在某種情況下通知父組件時。

四、注意事項

  1. 事件名:確保你觸發的事件名是唯一的,以避免與父組件中其他可能監聽的事件發生沖突。通常建議使用 kebab-case(短橫線分隔)來命名自定義事件,例如?child-to-parent?而不是?childToParent。但請注意,在模板中監聽事件時,你可以使用任何你喜歡的大小寫形式,因為 Vue 會自動將它們轉換為 kebab-case。然而,在 JavaScript 代碼中觸發或監聽事件時,你需要確保事件名的大小寫與模板中的一致。
  2. 數據傳遞:你可以通過?$emit?傳遞任何類型的數據給父組件,包括基本類型、對象、數組等。但是請注意,如果你傳遞了一個對象或數組,并且在父組件中修改了這個對象或數組,那么子組件中的原始數據也會被修改,因為它們引用的是同一個內存地址。如果你不希望這種情況發生,可以考慮傳遞一個深拷貝的副本給父組件。
  3. 事件監聽與解綁:在父組件中,你需要使用?v-on?或?@?指令來監聽子組件觸發的事件。當子組件被銷毀時,Vue 會自動解綁所有與該組件相關聯的事件監聽器。但是,如果你手動添加了事件監聽器(例如通過?addEventListener),那么你需要手動移除它們,以避免內存泄漏和意外行為。
  4. 與?$attrs?和?$listeners?的關系:在 Vue 2 中,你可以使用?$attrs?和?$listeners?來傳遞未知的屬性和事件給子組件。然而,在 Vue 3 中,這兩個屬性已經被整合進了?v-bind?和?v-on?的新語法中。這意味著你可以更簡潔地在父組件和子組件之間傳遞屬性和事件。但是請注意,如果你顯式地定義了一個與從父組件接收的屬性或事件同名的屬性或事件,那么它將覆蓋從父組件接收的值。為了避免這種情況,你可以使用?inheritAttrs: false?選項來阻止自動綁定未知的屬性,并手動選擇你想要綁定的屬性。同時,你也可以使用?v-on="$listeners"?的語法來監聽所有從父組件傳遞下來的事件(盡管在 Vue 3 中這種需求較少見,因為你可以直接監聽具體的事件名)。但是請注意,在 Vue 3 中更推薦使用?emits?選項來明確聲明子組件可以觸發哪些事件,并在父組件中顯式地監聽這些事件。這可以提高代碼的可讀性和可維護性,并減少潛在的錯誤和混淆。同時,使用?emits?選項還可以享受更好的 TypeScript 支持和類型推斷功能(如果你在使用 TypeScript 的話)。為了與 Vue 3 的新特性保持一致并充分利用其提供的優勢功能(如 Composition API、更靈活的組件間通信方式等),建議在實際開發中優先考慮使用 Vue 3 的新特性和語法規范進行代碼編寫和組織工作。

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

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

相關文章

[HackMyVM] 靶場 Wave

kali:192.168.56.104 主機發現 arp-scan -l # arp-scan -l Interface: eth0, type: EN10MB, MAC: 00:0c:29:d2:e0:49, IPv4: 192.168.56.104 Starting arp-scan 1.10.0 with 256 hosts (https://github.com/royhills/arp-scan) 192.168.56.1 0a:00:27:00:00:05 (Un…

OpenCV:開源計算機視覺的魔力之門

在當今這個信息爆炸的時代,圖像和視頻已經成為我們獲取和傳遞信息的主要方式之一。從社交媒體上的照片分享,到安防監控、自動駕駛等領域的圖像識別與處理,計算機視覺技術正日益改變著我們的生活。而在這場技術革命中,OpenCV(Open Source Computer Vision Library)這一開源…

Java JDBC JDBC事務管理 JDBC連接池(阿里巴巴Druid連接池、C3P0連接池) JDBC工具類

Java數據庫連接 Java DataBase Connectivity。JDBC 規范定義接口&#xff0c;具體的實現由各大數據庫廠商來實現。 JDBC可讓Java通過程序操作關系型數據庫&#xff0c;JDBC基于驅動程序實現與數據庫的連接與操作。 JDBC 是 Java 訪問數據庫的標準規范&#xff0c;真正怎么操作…

C++ 滑動窗口

例1 209. 長度最小的子數組 ①窗口大小不固定 ②求最小長度 -> ret INT_MAX ③數組內的值都大于0&#xff0c; 符合單調性&#xff08;sum nums[right] -> sum增大&#xff09; while里面符合條件&#xff0c;在里面更改ret 參考代碼 class Solution { public:i…

redis常見面試問題合集

什么是Redis&#xff1f; Redis是一個開源的、基于內存的數據結構存儲系統&#xff0c;它可以用作數據庫、緩存和消息隊列。Redis支持多種數據類型&#xff0c;包括字符串、列表、集合、有序集合和哈希表。 Redis支持的數據類型有哪些&#xff1f; Redis支持五種主要的數據類…

【LeetCode打卡】Day25|216.組合總和III、17.電話號碼的字母組合

學習目標&#xff1a; 216.組合總和III 17.電話號碼的字母組合 學習內容&#xff1a; 216.組合總和III 題目鏈接 &&文章講解 找出所有相加之和為 n 的 k 個數的組合&#xff0c;且滿足下列條件&#xff1a; 只使用數字1到9每個數字 最多使用一次 返回所有可能的有效…

集成測試之我的初步學習與總結

基本概念 將軟件集成起來后進行測試。 集成測試又叫子系統測試、組裝測試、部件測試等。集成測試主要是針對軟件高層設計進行測試&#xff0c;一般來說是以模塊和子系統為單位進行測試。 集成測試包含的層次 模塊內的集成&#xff0c;主要是測試模塊內各個接口間的交互集成…

我是如何系統自學python的,值得一看!

當然&#xff0c;我很樂意幫助你規劃一個系統的Python自學計劃。以下是我為你準備的一個簡潔、高效、實戰的Python自學指南&#xff1a; 第一步&#xff1a;基礎語法和數據結構 學習Python的基本語法&#xff0c;包括變量、數據類型、運算符、條件語句、循環語句等。理解Pyth…

day_12二叉樹理論基礎以及遍歷

第六章 二叉樹part01 今日內容&#xff1a; 理論基礎 遞歸遍歷 迭代遍歷 統一迭代 詳細布置 題目分類 二叉樹的種類 二叉樹有兩種主要的形式&#xff1a;滿二叉樹和完全二叉樹。 滿二叉樹 滿二叉樹&#xff1a;如果一棵二叉樹只有度為0的結點和度為2的結點&#xff0c;并…

java ThreadPoolExecutor 線程池

優點 ThreadPoolExecutor 提供了強大的靈活性和自定義參數的能力&#xff0c;可以根據實際需求來靈活配置線程池的行為。 位置 java.util.concurrent 包下 構造函數 public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit,…

進程與線程:通過實際生活來解析計算機的基本運作單位

進程與線程 進程與線程&#xff1a;詳細解析計算機的基本運作單位1. 進程&#xff1a;獨立的執行環境1.1 進程的特點&#xff1a; 2. 線程&#xff1a;輕量級的執行單元2.1 線程的特點&#xff1a; 3. 區別和聯系4. 表格 進程與線程&#xff1a;詳細解析計算機的基本運作單位 在…

Unity鉸鏈四桿機構設計和運動仿真

一、效果圖 設定好各邊長度和轉速后&#xff0c;點擊【設置并啟動】&#xff0c;自動生成一個機構模型&#xff0c;并按照原理進行運轉 二、鉸鏈四桿機構介紹 機架&#xff1a;A和D是固定位置&#xff0c;叫做機架。 曲柄&#xff1a;B點繞A點旋轉&#xff0c;構成曲柄。 連…

990-22產品經理:The benefits of business analytics 業務分析的優勢

Turning data into pound isn’t just something for big corporations now. Thanks to relatively inexpensive software and easy-to-use, drag-and-drop tools, pulling data and analysing it – with the goal of growing your business – has never been more uncomplic…

英語學習資源分享

鍵盤俠的單詞記憶軟件&#xff1a; Qwerty Learner — 為鍵盤工作者設計的單詞與肌肉記憶鍛煉軟件https://qwerty.kaiyi.cool/ 經濟學人、紐約客等英語外刊雜志下載&#xff1a;若github無法進入可以試試下載VPN插件&#xff08;在瀏覽器中安裝免費的VPN插件&#xff0c;個人推…

重拾C++之菜鳥刷算法第4篇---哈希表

一些理論知識 哈希函數是一種映射關系&#xff0c;根據關鍵詞key&#xff0c;經過一定函數關系得到元素的位置。 常見的哈希函數構造方法 直接定址法 除留余數法 疊加法 隨機數法 哈希沖突 不同關鍵字通過相同哈希函數計算出相同的哈希地址&#xff0c;該種現象稱為哈希…

視頻匯聚/存儲/壓縮/診斷平臺EasyCVR視頻聯網整合方案應用特點

隨著科技的不斷發展&#xff0c;監控視頻在各個領域的應用越來越廣泛。為了更好地管理和利用這些視頻資源&#xff0c;視頻聯網與整合的需求也越來越多。通過視頻聯網技術將不同地理位置或不同設備的視頻資源進行整合&#xff0c;實現實時共享和集中管理。視頻聯網整合方案的應…

6、云原生安全之falco的規則解讀(部分)(下)

文章目錄 3、規則解析記錄3.21、檢測是否有非特權用戶成功執行userfaultfd系統調用3.22、監控容器內通過curl/wget的下載行為3.23、檢測容器內修改release_agent文件的場景(無論修改成功與否)3.24、檢測Java進程通過網絡加載class類文件的行為,該規則用于檢測log4j的應急3.2…

Linux運維_Bash腳本_編譯安裝GNU-Tools

Linux運維_Bash腳本_編譯安裝GNU-Tools Bash (Bourne Again Shell) 是一個解釋器&#xff0c;負責處理 Unix 系統命令行上的命令。它是由 Brian Fox 編寫的免費軟件&#xff0c;并于 1989 年發布的免費軟件&#xff0c;作為 Sh (Bourne Shell) 的替代品。 您可以在 Linux 和 …

2024最新算法:鸚鵡優化算法(Parrot optimizer,PO)求解23個基準函數

一、鸚鵡優化算法 鸚鵡優化算法&#xff08;Parrot optimizer&#xff0c;PO&#xff09;由Junbo Lian等人于2024年提出的一種高效的元啟發式算法&#xff0c;該算法從馴養的鸚鵡中觀察到的覓食、停留、交流和對陌生人行為的恐懼中汲取靈感。這些行為被封裝在四個不同的公式中…

C++_紅黑樹

目錄 1、紅黑樹的規則 2、紅黑樹節點的定義 3、紅黑樹插入節點的調整操作 3.1 情況一 3.2 情況二 3.3 情況三 4、紅黑樹的實現 結語 前言&#xff1a; 在C中&#xff0c;紅黑樹是二叉搜索樹的另一種優化版本&#xff0c;他與AVL樹的區別在于保持樹的平衡方式不同&…