vue3 隨手筆記9--組件通信方式9/2--自定義事件

一、什么是自定義事件?

  • 自定義事件是 Vue 組件間通信的一種機制。
  • 子組件通過?this.$emit('事件名', 數據)?觸發一個事件。
  • 父組件監聽這個事件并執行相應的邏輯。

二、基本使用

準備工作

demo 繼續使用筆記8中的 鏈接為demo

在views文件夾下 創建新的文件夾為customevent

在customevent文件夾下

創建文件Parent.vue

<template><div class="props-text"><h1>custom event  自定義事件</h1><h1>我是父組件</h1></div>
</template>
<script setup></script><style scoped>
.props-text {
width: 400px;
height: 400px;
background-color: burlywood;
}
</style>

添加路由

import {createRouter , createWebHistory} from 'vue-router'
const routes = [{path: '/',name: 'index',component: () => import('@/views/index.vue')},{path: '/props',name: 'props',component: () => import('@/views/props/Parent.vue')},{path: '/customevent',name: 'customevent',component: () => import('@/views/customevent/Parent.vue')},]const router = createRouter({history: createWebHistory(),routes
})
export default router

在APP.vue 中 添加導航

<script setup></script><template>
<div class="com"><h1>各種Vue組件間通信/傳值</h1><div><h2 style="display: inline">演示:</h2>&nbsp;&nbsp;<router-link to="/">index</router-link>&nbsp;&nbsp;<router-link to="/props">props</router-link>&nbsp;&nbsp;<router-link to="/customevent">custom event</router-link>&nbsp;&nbsp;</div><br><router-view></router-view></div>
</template><style  scoped>.com {margin: 10px;}</style>
<style>.box {border: solid 1px #aaa;margin: 5px;padding: 5px;}
</style>

當父組件想給 子組件綁定一個原生dom事件時

創建子組件1

在customevent文件夾下

創建文件Child1.vue

<template><div><div class="child1"><div class="child1-title">Child1</div></div></div>
</template>
<script setup></script>
<style scoped>.child1{background-color: red;height: 100px;width: 100px;}.child1-title{color: white;}</style>

在父組件中 引用子組件1

<template><div class="props-text"><h1>custom event  自定義事件</h1><h1>我是父組件</h1><hr><!--vue2框架當中:這種寫法自定義事件,可以通過.native修飾符變為原生DOM事件vue3框架下面寫法其實即為原生DOM事件vue3:原生的DOM事件不管是放在標簽身上、組件標簽身上都是原生DOM事件 --><Child1 @click="handler2(1,2,$event)"></Child1></div>
</template>
<script setup>
import Child1 from './Child1.vue'const handler1 = () => {console.log('父組件點擊了')
}const handler2 = (a,b,$event) => {console.log(a,b,$event)
}
</script><style scoped>
.props-text {
width: 400px;
height: 400px;
background-color: burlywood;
}
</style>

效果展示:

此時handler2自定義事件? 點擊子組件任意地方 都可觸發

例如 在子組件1中 添加一個按鈕?

子組件代碼

<template><div><div class="child1"><div class="child1-title">Child1</div><button>點我也觸發</button></div></div>
</template>
<script setup></script>
<style scoped>.child1{background-color: red;height: 100px;width: 100px;}.child1-title{color: white;}</style>

?點擊按鈕時? 控制臺輸入的結果是一樣的

?當子組件想給父組件傳遞信息時? 使用自定義事件

創建子組件2

<template><div><div class="Child2"><div class="Child2-title">Child2</div><button @click="handler">點擊我觸發方法xxx</button></div></div>
</template>
<script setup>
//利用defineEmits方法返回函數觸發自定義事件
//defineEmits方法不需要引入直接使用
let $emit = defineEmits(['xxx'])const handler = ()=>{//第一個參數:事件類型 第二個|三個|N參數即為注入數據$emit('xxx','參數1','參數2');
}</script>
<style scoped>.Child2{background-color: red;height: 100px;width: 100px;}.Child2-title{color: white;}</style>

defineEmits 是 Vue 3 中用于在 Composition API(組合式 API)中定義組件所觸發的事件的一種方式,尤其是在使用 <script setup> 語法時非常常見。

作用:

defineEmits 允許你聲明一個組件可以向外觸發的自定義事件。它返回一個函數,你可以用這個函數來觸發事件并傳遞參數。

  • defineEmits?接收一個數組,數組中的每一項是組件會觸發的事件名。
  • emit?是一個函數,用于觸發這些事件,并傳遞數據。

父組件注入子組件2??

<template><div class="props-text"><h1>custom event  自定義事件</h1><h1>我是父組件</h1><hr><!--vue2框架當中:這種寫法自定義事件,可以通過.native修飾符變為原生DOM事件vue3框架下面寫法其實即為原生DOM事件vue3:原生的DOM事件不管是放在標簽身上、組件標簽身上都是原生DOM事件 --><Child1 @click="handler2(1,2,$event)"></Child1><hr><!-- 自定義事件  --><Child2 @xxx="handler3" @click="handler4"></Child2></div>
</template>
<script setup>
import Child1 from './Child1.vue'
import Child2 from './Child2.vue'const handler1 = () => {console.log('父組件點擊了')
}
const handler2 = (a,b,$event) => {console.log(a,b,$event)
}const handler3 = (paramsa,paramsb) => {console.log(paramsa,paramsb)
}const handler4 = () => {alert('Dom原生事件 被觸發了');
}</script><style scoped>
.props-text {
width: 400px;
height: 400px;
background-color: burlywood;
}
</style>

控制臺輸出

并且彈框? 彈框內容為? Dom原生事件 被觸發了?

如果你在組件2中 click添加到自定義事件 則click原生dom變成了自定義事件

子組件代碼

<template><div><div class="Child2"><div class="Child2-title">Child2</div><button @click="handler">點擊我觸發方法xxx</button></div></div>
</template>
<script setup>
//利用defineEmits方法返回函數觸發自定義事件
//defineEmits方法不需要引入直接使用
let $emit = defineEmits(['xxx','click'])const handler = ()=>{//第一個參數:事件類型 第二個|三個|N參數即為注入數據$emit('xxx','參數1','參數2');
}</script>
<style scoped>.Child2{background-color: red;height: 100px;width: 100px;}.Child2-title{color: white;}</style>

再次點擊父組件的時候 彈框沒有了

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

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

相關文章

深入理解Reactor調試模式:Hooks.onOperatorDebug() vs ReactorDebugAgent.init()

在現代Java開發中&#xff0c;調試Reactor流是確保應用程序性能和穩定性的關鍵步驟。Reactor調試模式提供了多種初始化方法&#xff0c;其中最常用的兩種是Hooks.onOperatorDebug()和ReactorDebugAgent.init()。本文將深入探討這兩種方法的區別&#xff0c;幫助開發者選擇最適合…

QT6 源(151)模型視圖架構里的表格窗體視圖 QTableWidget 篇一:先學習倆屬性以及 public 權限的公共成員函數,

&#xff08;1&#xff09;本篇的內容因為是子類&#xff0c;內容較視圖基類簡單了一些。又因為時間緊迫&#xff0c;不再詳細舉例了。詳細的測試可以滿足好奇心&#xff0c;也可以增強寫代碼的自信心。奈何時間不夠。不完美&#xff0c;就不完美了。以后有機會&#xff0c;再補…

ffmpeg 下載、安裝、配置、基本語法、避坑指南(覆蓋 Windows、macOS、Linux 平臺)

ffmpeg 下載、安裝、配置、基本語法、避坑指南&#xff08;覆蓋 Windows、macOS、Linux 平臺&#xff09; 本文是一篇面向初學者的超詳細 FFmpeg 教程&#xff0c;包括 FFmpeg 下載、安裝、配置、基本語法 與 避坑指南。覆蓋 Windows、macOS、Linux 平臺的安裝方式與 環境變量…

Kotlin 安裝使用教程

一、Kotlin 簡介 Kotlin 是 JetBrains 開發的一種現代、靜態類型的編程語言&#xff0c;完全兼容 Java&#xff0c;主要應用于 Android 開發、后端服務開發、前端 Web 開發&#xff08;Kotlin/JS&#xff09;和多平臺開發&#xff08;Kotlin Multiplatform&#xff09;。 二、…

day08-Elasticsearch

黑馬商城作為一個電商項目&#xff0c;商品的搜索肯定是訪問頻率最高的頁面之一。目前搜索功能是基于數據庫的模糊搜索來實現的&#xff0c;存在很多問題。 首先&#xff0c;查詢效率較低。 由于數據庫模糊查詢不走索引&#xff0c;在數據量較大的時候&#xff0c;查詢性能很…

transformers 筆記:自定義模型(配置+模型+注冊為AutoCLass+本地保存加載)

Transformers 模型設計上是可定制的。每個模型的代碼都包含在 Transformers 倉庫的 model 子文件夾中&#xff08;transformers/src/transformers/models at main huggingface/transformers&#xff09;&#xff0c;每個模型文件夾通常包含&#xff1a; modeling.py&#xff1…

Java工具類,對象List提取某個屬性為List,對象List轉為對象Map其中某個屬性作為Key值

Java工具類package org.common;import lombok.extern.slf4j.Slf4j;import java.util.*; import java.util.stream.Collectors;Slf4j public final class CollectorHelper {/*** param element* param propertyName* param <E>* return*/public static <E> List toL…

ATE FT ChangeKit學習總結-20250630

目錄 一、基本概念 二、主要特點 三、BOM LIST Shuttle Hot Plate Dock Plate Contactor 四、設計要點 五、參考文獻與鏈接 一、基本概念 Change Kit在半導體封裝測試領域中是一個重要的組件,它作為Handler(自動化分類機)的配套治具,在芯片測試過程中發揮著關鍵作…

【網絡協議安全】任務14:路由器DHCP_AAA_TELNET配置

本文檔將詳細介紹在華為 eNSP 仿真環境中&#xff0c;實現路由器 DHCP 服務器功能、AAA 認證以及 TELNET 遠程登錄配置的完整步驟&#xff0c;適用于華為 VRP 系統路由器。 一、配置目標 路由器作為 DHCP 服務器&#xff0c;為局域網內的設備自動分配 IP 地址、子網掩碼、網關…

深度探索:現代翻譯技術的核心算法與實踐(第一篇)

引言:翻譯技術的演進之路 從早期的基于規則的機器翻譯(RBMT)到統計機器翻譯(SMT),再到如今主導行業的神經機器翻譯(NMT),翻譯技術已經走過了漫長的發展道路。現代翻譯系統不僅能夠處理簡單的句子,還能理解上下文、識別領域術語,甚至捕捉微妙的文化差異。 本系列文章將帶…

玩轉Docker | 使用Docker部署NotepadMX筆記應用程序

玩轉Docker | 使用Docker部署NotepadMX筆記應用程序 前言一、NotepadMX介紹工具簡介主要特點二、系統要求環境要求環境檢查Docker版本檢查檢查操作系統版本三、部署NotepadMX服務下載NotepadMX鏡像編輯部署文件創建容器檢查容器狀態檢查服務端口安全設置四、訪問NotepadMX服務訪…

Web前端:not(否定偽類選擇器)

not&#xff08;否定偽類選擇器&#xff09;CSS中的 :not() 選擇器是?個否定偽類選擇器&#xff0c;它?于選擇不符合給定選擇器的元素。這是?種排除特定元素的?法&#xff0c;可以?來簡 化復雜的選擇器&#xff0c;提? CSS 規則的靈活性和精確性。:not() 選擇器的基本語法…

【BTC】比特幣網絡

目錄 一、比特幣網絡架構 1.1 節點加入與離開 二、消息傳播方式 三、交易處理機制 四、網絡傳播問題 五、實際應用問題及解決 本章節講比特幣網絡的工作原理&#xff0c;講解新創建的區塊是如何在比特幣網絡中傳播的。 一、比特幣網絡架構 比特幣工作在應用層&#xff…

Clickhouse 的歷史發展過程

20.5.3 開始支持多線程20.6.3 支持explainmysql 20.8 實時同步mysql&#x1f4cc; ?一、早期版本階段&#xff08;1.1.x系列&#xff09;??版本范圍?&#xff1a;1.1.54245&#xff08;2017-07&#xff09;→ 1.1.54394&#xff08;2018-07&#xff09;?核心特性?&#x…

玩轉n8n工作流教程(一):Windows系統本地部署n8n自動化工作流(n8n中文漢化)

在Windows系統下使用 Docker 本地部署N8N中文版的具體操作&#xff0c;進行了詳盡闡述&#xff0c;玩轉n8n工作流教程系列內容旨在手把手助力從0開始一步一步深入學習n8n工作流。想研究n8n工作流自動化的小伙伴們可以加個關注一起學起來。后續也會持續分享n8n自動化工作流各種玩…

mini-program01の系統認識微信小程序開發

一、官方下載并安裝 1、下載&#xff08;I選了穩定版&#xff09; https://developers.weixin.qq.com/miniprogram/dev/devtools/download.htmlhttps://developers.weixin.qq.com/miniprogram/dev/devtools/download.html 2、安裝&#xff08;A FEW MOMENT LATER&#xff09;…

如何將 Java 項目打包為可執行 JAR 文件

如何將 Java 項目打包為可執行 JAR 文件我將詳細介紹將 Java 項目打包為可執行 JAR 文件的完整流程&#xff0c;包括使用 IDE 和命令行兩種方法。方法一&#xff1a;使用 IntelliJ IDEA 打包步驟 1&#xff1a;配置項目結構打開項目點擊 File > Project Structure在 Project…

【Starrocks 異常解決】-- mysql flink sync to starrocks row error

1、異常信息 flink 1.20 starrocks 3.3.0 mysql 8.0 errorLog: Error: Target column count: 35 doesnt match source value column count: 28. Column separator: \t, Row delimiter: \n. Row: 2025-05-22 6 23400055 214 dssd 1 1 1928 mm2er 360 20000.00000000 1…

Jenkins 使用宿主機的Docker

背景&#xff1a;不想在Jenkins 內部安裝Docker,想直接使用Jenkins服務所在的系統安裝的docker當你在 Jenkins 中執行 docker 命令時&#xff0c;實際上是通過 Docker 客戶端與 Docker 守護進程進行通信。Docker 客戶端和守護進程之間的通信是通過一個名為 /var/run/docker.soc…

工具+服務雙驅動:創客匠人打造中醫IP差異化競爭力

一、技術工具場景化定制&#xff1a;中醫專業的可視化破圈在中醫IP同質化嚴重的行業現狀下&#xff0c;創客匠人以場景化技術工具破解專業傳播難題。系統內置的“體質測試”模塊可生成個性化調理報告&#xff0c;“案例庫”支持前后對比圖上傳&#xff0c;“直播問診”自動添加…