vue中的派發事件與廣播事件,及廣播事件應用于哪些場景和一個表單驗證例子

在 Vue 2.X 中,$dispatch 和 $broadcast 方法已經被廢棄。官方認為基于組件樹結構的事件流方式難以理解,并且在組件結構擴展時容易變得脆弱。因此,Vue 2.X 推薦使用其他方式來實現組件間的通信,例如通過 $emit 和 $on 方法,或者使用事件總線(Event Bus)

子組件向上派發事件 ,然后父組件會收到來自子組件發來的信息

<div id="app"><div><my-fade></my-fade></div>    
</div>
<script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.13/vue.js"></script>
<script>//子組件const ChildComponent={template:`<div><h4>子組件</h4><button @click="dispatchEvent">派發事件</button></div>`,	//模板,創建一個點擊事件引用模式中的方法dispatchEventmethods:{//事件函數dispatchEvent(){//設置或叫創建自定義事件 custom-event,第2個是傳遞自定義事件的參數,傳遞給handleCustomEvent(message)this.$emit('custom-event','Hello my vue,this is from child');}}};const ParentComponent={//在模板中將子組件嵌入其中,并創建自定義custom-event事件綁定函數handleCustomEventtemplate:`<div><h3>父組件</h3><p>接收到消息:{{message}}</p><child-component @custom-event="handleCustomEvent"></child-component></div>`,data(){return {message:''};},methods:{//這里的參數message就是自定義事件中custom-event的參數handleCustomEvent(message){this.message=message;console.log(this.message);}},components:{// 在父組件中注冊子組件'child-component':ChildComponent}    };const app=new Vue({el:"#app",components:{'my-fade':ParentComponent}});
</script>

以下是派發事件,及父組件廣播給所有子組件

<div id="app"><parent-component></parent-component>
</div>
<script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.13/vue.js"></script>
<script>//設置子組件const ChildComponent={template:`<div><h3>子組件</h3><p>接收到消息:{{message}}</p></div>    `,data(){return {message:''};},methods:{//主要作為是觸發自定義事件時設置message的值handleBroadcast(message){this.message=message;}},mounted(){//$on主要用途即為監聽自定義事件this.$on('broadcast-event',this.handleBroadcast);},//在組件消毀前移除監聽beforeDestroy(){this.$off('broadcast-event',this.handleBroadcast);}};//設置父組件const ParentComponent={template:`<div><h3>父組件</h3><button @click="broadcastEvent">廣播事件</button><child-component></child-component>	//嵌入子組件</div>`,components:{//在父組件中注冊子組件'child-component':ChildComponent},methods:{broadcastEvent(){this.$children.forEach((child)=>{if(child.handleBroadcast){//設置自定義事件broadcast-event,并傳遞hello from Parent這個參數child.$emit('broadcast-event','Hello from Parent')}})}}    };const app=new Vue({el:"#app",components:{'parent-component':ParentComponent}})
</script>

廣播事件的典型使用場景

  • 表單驗證

場景描述:在復雜的表單中,可能有多個子組件負責不同的表單字段驗證。父組件可以通過廣播事件通知所有子組件進行驗證操作。
實現方式:父組件觸發一個廣播事件(如 validate),所有子組件監聽該事件并執行各自的驗證邏輯。

  • 更新狀態

場景描述:父組件需要更新多個子組件的狀態,例如在購物車頁面中,父組件需要通知所有子組件更新商品數量或價格。
實現方式:父組件廣播一個事件(如 update-cart),子組件監聽該事件并根據傳遞的數據更新自身狀態。

  • 動態數據同步

場景描述:在多級嵌套的組件結構中,父組件需要將動態數據同步到多個子組件中。
實現方式:父組件通過廣播事件將數據傳遞給所有子組件,子組件接收數據并更新視圖。

  • UI 狀態更新

場景描述:父組件需要統一更新多個子組件的 UI 狀態,例如在多級菜單中,父組件需要通知所有子菜單項更新顯示狀態。
實現方式:父組件廣播一個事件(如 toggle-menu),子組件監聽該事件并根據傳遞的參數更新顯示狀態。

  • 數據刷新

場景描述:在數據列表中,父組件需要通知所有子組件刷新數據,例如在用戶管理頁面中,父組件需要通知所有子組件重新加載用戶數據。
實現方式:父組件廣播一個事件(如 refresh-data),子組件監聽該事件并調用數據加載方法。

  • 示例:表單驗證場景

假設有一個表單,包含多個子組件,每個子組件負責一個表單字段的驗證。父組件需要在提交表單時觸發所有子組件的驗證邏輯。

<div id="app"><form-component></form-component>
</div>
<script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.13/vue.js"></script>
<script>const FieldComponent={//從父組件中獲取到field,pwd,pwd2他們的值//@blur失去焦點時觸發props:['field','pwd','pwd2'],template:`<div><label :for="field.id">{{field.label}}</label><input :id="field.id" v-model="field.value" :type="field.type" :name="field.id" @blur="validateField" autocomplete="false"><span v-if="field.error" style="color:red;">{{field.error}}</span></div>`,methods:{//驗證函數validateField(){if(!this.field.value){this.field.error='此字段必填';}else{switch(this.field.id){case 'username':if(this.field.value.length<4 || this.field.value>21){this.field.error='用戶名字符在4-21之間';}else{this.field.error='';}break;case 'pwd':let regex=/[A-Z]/g;if(this.field.value.length<6 || !regex.test(this.field.value)){this.field.error='密碼必須大于6個字符,并包含大寫字母';}else{this.field.error='';console.log(this.field.value);//設置自定義更新事件,即pwd更新時觸發this.$emit('update:pwd',this.field.value);}    break;case  'pwd2':if(this.field.value != this.pwd){this.field.error='兩次密碼不一致';}else{this.field.error='';} break;case 'email':if(!this.field.value.includes('@')){this.field.error='郵箱不正確';}else{this.field.error='';}   break;}}}},mounted(){//監聽自定義validate事件,并觸發驗證函數this.$on('validate',this.validateField);},//在消毀前注銷掉事件beforDestroy(){this.$off('validate',this.validateField);}    };const FormComponent={//父組件模板,嵌入子組件<field-component 并循環fields數據//@update:pwd即自定義更新事件,getPwd為函數用于設置pwd更新后的值,也可以直接寫成@update:pwd="pwd=$event"template:`<form @submit.prevent="submitForm"><field-component v-for="field in fields" :key="field.id" :field="field" :pwd="pwd" :pwd2="pwd2" @update:pwd="getPwd"></field-component><button type='submit'>提交</button></form>    `,components:{//注冊字段子組伯'field-component':FieldComponent} ,data(){return{fields:[{id:'username',label:'用戶:',type:'text',value:'',error:''},{id:'pwd',label:'密碼:',type:'password',value:'',error:''},{id:'pwd2',label:'重復:',type:'password',value:'',error:''},{id:'email',label:'郵箱:',type:'email',value:'',error:''}],pwd:'',	//pwd,pwd2主要作用是為了在驗證他們是否相等時使用pwd2:''}},methods:{//在提交時觸發的函數submitForm(){this.$children.forEach((child)=>{if(child.validateField){//在子組件中觸發自定義的驗證函數child.$emit('validate');}});//如果在有一個field.error為真,即會大子組件字段中顯示const hasErrors=this.fields.some((field)=>field.error);if(!hasErrors){alert('表單提交成功');}},getPwd(val){this.pwd=val;}}   }const app=new Vue({el:"#app",components:{'form-component':FormComponent}});
</script>
  1. @update:pwd:

@ 是 Vue 中用于監聽事件的簡寫符號。
update:pwd 是一個自定義事件名稱。update 是一個常見的前綴,用于表示數據更新的事件,而 pwd 是具體的字段名。

  1. pwd = $event:

pwd 是父組件 FormComponent 中定義的數據屬性。
e v e n t 是 V u e 中的一個特殊變量,表示事件觸發時傳遞的參數。在這里, event 是 Vue 中的一個特殊變量,表示事件觸發時傳遞的參數。在這里, eventVue中的一個特殊變量,表示事件觸發時傳遞的參數。在這里,event 是子組件 FieldComponent 通過 $emit(‘update:pwd’, this.field.value) 發出的值。
pwd = $event 是一個表達式,表示將子組件發出的值賦值給父組件的 pwd 屬性。

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

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

相關文章

阿里云事件總線 EventBridge 正式商業化,構建智能化時代的企業級云上事件樞紐

作者&#xff1a;肯夢、稚柳 產品演進歷程&#xff1a;在技術浪潮中的成長之路 早在 2018 年&#xff0c;Gartner 評估報告便將事件驅動模型&#xff08;Event-Driven Model&#xff09;列為十大戰略技術趨勢之一&#xff0c;指出事件驅動架構&#xff08;EDA&#xff0c;Eve…

《前端面試題:BFC(塊級格式化上下文)》

前端BFC完全指南&#xff1a;布局魔法與面試必備 &#x1f38b; 端午安康&#xff01; 各位前端探險家&#xff0c;端午節快樂&#xff01;&#x1f96e; 愿你的代碼如龍舟競渡般乘風破浪&#xff0c;樣式如香糯粽子般完美包裹&#xff01;今天我們來解鎖CSS中的布局魔法——B…

dvwa10——XSS(DOM)

XSS攻擊&#xff1a; DOM型XSS 只在瀏覽器前端攻擊觸發&#xff1a;修改url片段代碼不存儲 反射型XSS 經過服務器攻擊觸發&#xff1a;可能通過提交惡意表單&#xff0c;連接觸發代碼不存儲 存儲型XSS 經由服務器攻擊觸發&#xff1a;可能通過提交惡意表單&#xff0c;連…

跨平臺資源下載工具:res-downloader 的使用體驗

一款基于 Go Wails 的跨平臺資源下載工具&#xff0c;簡潔易用&#xff0c;支持多種資源嗅探與下載。res-downloader 一款開源免費的下載軟件(開源無毒、放心使用)&#xff01;支持Win10、Win11、Mac系統.支持視頻、音頻、圖片、m3u8等網絡資源下載.支持視頻號、小程序、抖音、…

AOSP CachedAppOptimizer中的凍結和內存壓縮功能

AOSP CachedAppOptimizer&#xff1a;應用進程長期處于 Cached 狀態的內存壓縮和凍結優化管控 凍結和內存壓縮兩個功能獨立觸發&#xff0c;可以單獨觸發也可以組合觸發&#xff0c;默認順序&#xff1a;先壓縮&#xff0c;后凍結 public class OomAdjuster { protected b…

相機--相機成像原理和基礎概念

教程 成像原理 基礎概念 焦距&#xff08;物理焦距&#xff09; 鏡頭的光學中心到感光元件之間的距離&#xff0c;用f表示&#xff0c;單位&#xff1a;mm&#xff1b;。 像素焦距 相機內參矩陣中的 fx? 和 fy? 是將物理焦距轉換到像素坐標系的產物&#xff0c;可能不同。…

Vue3項目實現WPS文件預覽和內容回填功能

技術方案背景&#xff1a;根據項目需要&#xff0c;要實現在線查看、在線編輯文檔&#xff0c;并且進行內容的快速回填&#xff0c;根據這一項目背景&#xff0c;最終采用WPS的API來實現&#xff0c;接下來我們一起來實現項目功能。 1.首先需要先準備好測試使用的文檔&#xf…

匯編語言學習(三)——DoxBox中debug的使用

目錄 一、安裝DoxBox&#xff0c;并下載匯編工具&#xff08;MASM文件&#xff09; 二、debug是什么 三、debug中的命令 一、安裝DoxBox&#xff0c;并下載匯編工具&#xff08;MASM文件&#xff09; 鏈接&#xff1a; https://pan.baidu.com/s/1IbyJj-JIkl_oMOJmkKiaGQ?pw…

關于DDOS

DDOS是一門沒什么技術含量的東西&#xff0c;其本質而言是通過大量數據報文&#xff0c;發送到目標受害主機IP地址上&#xff0c;導致目標主機無法繼續服務&#xff08;俗稱&#xff1a;拒絕服務&#xff09; DDOS灰產人期望達成的預期目標&#xff0c;幾乎都是只要把對面打到 …

Modbus轉Ethernet IP網關助力羅克韋爾PLC數據交互

在工業自動化領域&#xff0c;Modbus協議是一種廣泛應用的串行通信協議&#xff0c;它定義了主站和從站之間的通信規則和數據格式。羅克韋爾PLC是一種可編程的邏輯控制器&#xff0c;通過Modbus協議實現與其他設備之間的數據交互。然而&#xff0c;隨著以太網技術的普及和發展&…

C# winform教程(二)----button

一、button的使用方法 主要使用方法幾乎都在屬性內&#xff0c;我們操作也在這個界面 二、作用 用戶點擊時觸發事件&#xff0c;事件有很多種&#xff0c;可以根據需要選擇。 三、常用屬性 雖然屬性很多&#xff0c;但是常用的并不多 3.常用屬性 名稱內容含義AutoSize自動調…

【 java 基礎問題 第二篇 】

目錄 1.深拷貝和淺拷貝 1.1.區別 定義 定義 1.2.實現深拷貝的方式 2.泛型 2.1.定義 2.2.作用 3.對象 3.1.創建對象的方式 3.2.對象回收 3.3. 獲取私有成員 4.反射 4.1.定義 4.2.特性 4.3.原理 5.異常 5.1.異常的種類 5.2.處理異常的方法 6.Object 6.1.等于與…

Kafka 入門指南與一鍵部署

Kafka 介紹 想象一下你正在運營一個大型電商平臺&#xff0c;每秒都有成千上萬的用戶瀏覽商品、下單、支付&#xff0c;同時后臺系統還在記錄用戶行為、更新庫存、處理物流信息。這些海量、持續產生的數據就像奔騰不息的河流&#xff0c;你需要一個強大、可靠且實時的系統來接…

湖北理元理律師事務所:企業債務重組的風險控制方法論

一、擔保鏈破解&#xff1a;阻斷債務傳染的核心技術 2023年武漢某建材公司案例&#xff1a; 原始債務結構&#xff1a; A公司&#xff08;主債務人&#xff09;欠款200萬 ↓ B公司&#xff08;擔保人&#xff09;←連帶責任觸發執行 ↓ C公司&#xff08;B公司擔…

如何在CloudCompare中打開pcd文件

你只需要將pcd文件的路徑改在全英文路徑下&#xff0c;CloudCompare就可以打開。若含中文&#xff0c;就會報錯&#xff1a;

中醫的十問歌和脈象分類

中醫核心理論框架如下 診斷技術如下 本文主要介紹問診和切診。 十問歌的“十”是虛指&#xff0c;實際包含12個核心問題&#xff0c;脈象28種中常見僅10余種&#xff0c;重點解釋脈診的物理本質&#xff08;血流動力學觸覺感知&#xff09; 以下是中醫十問歌的完整內容及脈…

基于智能代理人工智能(Agentic AI)對沖基金模擬系統:模范巴菲特、凱西·伍德的投資策略

股票市場涉及眾多統計數據和模式。股票交易基于研究和數據驅動的決策。人工智能的使用可以實現流程自動化&#xff0c;讓投資者在研究上花費更少的時間&#xff0c;同時提高準確性。這使他們能夠更加專注于監督實際交易和服務客戶。 頂尖對沖基金經理發揮著至關重要的作用&…

大二下期末

一.Numpy&#xff08;Numerical Python&#xff09; Numpy庫是Python用于科學計算的基礎包&#xff0c;也是大量Python數學和科學計算包的基礎。不少數據處理和分析包都是在Numpy的基礎上開發的&#xff0c;如后面介紹的Pandas包。 Numpy的核心基礎是ndarray&#xff08;N-di…

D3ctf-web-d3invitation單題wp

#注入 #用kali構造憑證訪問MinIO服務器 #用mc帶臨時憑證訪問遠程Minion的儲存桶 還有一個 minio 服務的api&#xff0c;我們后面要用 /static/js/tools.js function generateInvitation(user_id, avatarFile) {if (avatarFile) {object_name avatarFile.name;genSTSCreds(ob…

基于 Vue 和 Spring Boot 實現滑塊驗證碼的機器驗證

基于 Vue 和 Spring Boot 實現滑塊驗證碼的機器驗證 需求概述技術選型前端實現1. 引入組件2. 修改后端請求URL3. 新增機器驗證頁面4.首頁調用驗證組件 后端實現流程梳理具體實現1. 引入依賴2. 增加yml配置3. 代碼實現4.跨域配置&#xff08;可選&#xff09; 實現效果二次驗證的…