【Vue】組件自定義事件 TodoList 自定義事件數據傳輸

目錄

一、綁定

二、解綁

組件自定義事件總結

TodoList案例對數據傳輸事件的修改

總結不易~ 本章節對我有很大收獲, 希望對你也是!!!


本章節素材已上傳Gitee:yihaohhh/我愛Vue - Gitee.com

前面我們學習的clikc、keyup……等一系列為js內置的事件(給HTML元素用的),現在我們就要學習組件的自定義事件(給組件用的!)!

一、綁定

現在想一個問題,把子元素傳給父元素有幾種辦法!

按照我們的進度, 現在只會通過props方法來得到App的函數然后進行傳參這一種辦法進行

那么現在就來介紹第二種辦法:組件自定義事件_綁定

  • v-on:事件名="方法" 就是監聽子組件觸發的自定義事件。這個事件得由子組件用 $emit('事件名') 發出來。?
  • 給誰綁定事件 就找誰觸發 ?給Student組件的實例對象
  • 通過父組件給子組件綁定一個自定義事件實現:子給父傳遞數據 (第一種寫法 使用@或者v-on)
    <!-- <Student v-on:atwhuc="getStudentName"/> --><Student @atwhuc="getStudentName"/>

大白話就是:“你每次喊一聲 atwhuc,我就立刻執行 getStudentName() 這個方法。你喊一次我就干一次,喊十次我就干十次。” 這個事件綁定在Student組件上

Student組件:

<template><div class="student"><h1>{{ msg }}</h1><h2>學生姓名:{{ name }}</h2><h2>學生性別:{{ sex }}</h2><button @click="sendStudentName">把學生名給App</button></div>
</template><script>
export default {name:'Student',data() {return {msg:'我是一個武漢傳媒學院的學生',name:'張三',sex: '男' }},methods: {sendStudentName() {// 觸發Student的實例身上的atwhuc事件 // 該事件被觸發 就讓給方法傳入了this.$emit('atwhuc', this.name, 666, 888, 999)}}}
</script><style scoped>.student {background-color: orange;padding: 5px;margin-top: 30px;}
</style>

這一種寫法是通過在子組件中觸發 $emit('atwhuc', 數據) 來發送一個自定義事件 'atwhuc',父組件通過 @atwhuc="方法" 監聽這個事件,從而實現父子組件之間的傳值和通信

在子組件中用 $emit 是在向父組件發消息,這條消息就叫“自定義事件”。 有通知的意思

📌 補充說明(理解更深一點):

  • 子組件不需要知道父組件的具體方法名,只管發事件(松耦合)。

  • 父組件監聽這個事件并調用自己的方法,同時可以接收 $emit 傳來的數據。

但是這么直接用,有點局限性,我們可以更靈活一點!

?通過父組件給子組件綁定一個自定義事件實現:子給父傳遞數據 (第二種寫法 使用ref)

? ? <Student ref="student"/>
  methods: {getSchoolName(name) {console.log('App收到了學校名', name)},getStudentName(name, ...params) {// params 是一個數組console.log('App被調用!', name, params)}},  
// 放一個生命周期鉤子mounted() {// 靈活性強 setTimeout(() => {this.$refs.student.$on('atwhuc', this.getStudentName)}, 3000)this.$refs.student.$on('atwhuc', this.getStudentName) // 綁定自定義事件// 只觸發一次this.$refs.student.$once('atwhuc', this.getStudentName) // 綁定自定義事件(一次性)}

this.$refs.student:

  • 就是你在 HTML 里寫的 <Student ref="student" />,
  • 相當于你給這個組件起了個小名,方便后面找到它。

$on 當……時:

  • $on('atwhuc', this.getStudentName):
  • 是你在監聽這個組件有沒有“發出”一個叫 atwhuc 的信號。
  • 如果發了,那就去執行 getStudentName 這個方法。

二、解綁

對于事件的解綁 也是通過實踐綁定來通過函數調用完成!

    <button @click="unbind">解綁atwhuc事件</button>
    unbind() {this.$off('atwhuc') // 只適用于解綁一個自定義事件// emitter.off 代替 $off// $on	emitter.on// $emit	emitter.emit}

可以發現this.$off? 只能進行單個事件的解綁

解綁多個事件,用一個數組進行存儲事件!

    this.$off(['atwhuc', 'demo']) 

更暴力的辦法, 全部都解綁!?

      this.$off() // 全部都解綁 

銷毀當前組件的全部實例

    <button @click="death">銷毀當前Student組件的實例(vc)</button>
    death() {this.$destroy() // 銷毀了當前的組件實例 銷毀后 所有Student實例的自定義事件全都不奏效了}

?本章節素材已上傳Gitee:yihaohhh/我愛Vue - Gitee.com?

組件自定義事件總結

想要把Student子組件的name傳給父組件 可以用函數來接受Student的name值, 然后更新App組件的studentName的值

這是可行的!

<h1>{{ msg }}, 學生姓名是:{{ studentName }}</h1>
    getStudentName(name, ...params) {// params 是一個數組console.log('App被調用!', name, params),this.studentName = name},
    this.$refs.student.$on('atwhuc', function(name, ...params) {console.log('App被調用!', name, params),this.studentName = name}) // 綁定自定義事件

用ref也是可行的!

    <Student ref="student"/>mounted() {this.$refs.student.$on('atwhuc', this.getStudentName) // 綁定}

但是當我們將getStudentName注釋掉之后直接在生命周期鉤子里面寫回調函數發現this.studentName卻不能被賦值了!

    this.$refs.student.$on('atwhuc', function(name, ...params) {console.log('App被調用!', name, params),this.studentName = name}) // 綁定自定義事件

點擊后不起作用,但是控制臺仍然會被執行!

那么我們就重新對this進行打印,來進行觀察!

    this.$refs.student.$on('atwhuc', function(name, ...params) {console.log('App被調用!', name, params),console.log(this)this.studentName = name}) // 綁定自定義事件

能夠發現這些都是Student組件中才存在的, 只能說明 這個this就不是指向App組件的this ,而是Student組件的this

說明Vue的底層就是說明誰觸發了‘atwhuc’這個事件, 那么這個事件的回調就會指向誰

那么就說明當我們寫成箭頭函數的時候:這個this就又重新回到了App組件上

    this.$refs.student.$on('atwhuc', (name, ...params)=> {console.log('App被調用!', name, params),console.log(this)this.studentName = name}) // 綁定自定義事件

那么組件可以用自定義事件,能不能用原生事件呢???點擊事件呢??

    <Student ref="student" @click="show"/>
    show() {alert(123)}

可以發現其實并沒效果! 原因就是這么寫Vue就自動默認把click當作是一個自定義事件,要觸發自定義事件,就必須要在Student組件上用$emit,就會進行觸發了!

    sendStudentName() {// 觸發Student的實例身上的atwhuc事件 // 該事件被觸發 就讓給方法傳入了this.$emit('atwhuc', this.name, 666, 888, 999)this.$emit('demo') // 自定義事件名this.$emit('click')},

那么我們只需要添加一個修飾符,就可以讓Vue明白我們這是一種原生事件, .native

    <Student ref="student" @click.native="show"/>

  1. 一種組件間通信的方式,適用于:<strong style="color:red">子組件 ===> 父組件</strong>

  2. 使用場景:A是父組件,B是子組件,B想給A傳數據,那么就要在A中給B綁定自定義事件(<span style="color:red">事件的回調在A中</span>)。

  3. 綁定自定義事件:

    1. 第一種方式,在父組件中:<Demo @atguigu="test"/><Demo v-on:atguigu="test"/>

    2. 第二種方式,在父組件中:

        <Demo ref="demo"/>......mounted(){this.$refs.xxx.$on('atguigu',this.test)}
    3. 若想讓自定義事件只能觸發一次,可以使用once修飾符,或$once方法。

      觸發自定義事件:this.$emit('atguigu',數據)

  4. 解綁自定義事件this.$off('atguigu')

  5. 組件上也可以綁定原生DOM事件,需要使用native修飾符。

  6. 注意:通過this.$refs.xxx.$on('atguigu',回調)綁定自定義事件時,回調<span style="color:red">要么配置在methods中</span>,<span style="color:red">要么用箭頭函數</span>,否則this指向會出問題!

?本章節素材已上傳Gitee:yihaohhh/我愛Vue - Gitee.com?

TodoList案例對數據傳輸事件的修改

對于子組件給父組件進行數據傳輸,就可以不在需要用props來傳遞一個函數,然后進行數據傳輸, 可以直接采用$emit來觸發父組件的自定義事件

那么同理,框起來的全部都是傳入的函數, 都是可以將props改寫為$emit來進行數據傳輸,而todos是一個數據不能修改為函數進行傳遞,就不能用$emit來進行修改

都可以換種方式來獲取自定義事件~

總結不易~ 本章節對我有很大收獲, 希望對你也是!!!

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

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

相關文章

Windows遠程連接MySQL報錯,本地navicat能連接MySQL

一、報錯 telnet 119.87.111.79 3306??“無法打開到主機的連接。在端口 3306: 連接失敗”?? 表明無法通過 TCP 協議連接到目標服務器的 3306 端口。 二、目的 &#xff08;1&#xff09;??Telnet 測試的目的?? Telnet 僅用于測試 ??TCP 端口是否開放??&#xff…

電池管理系統BMS三級架構——BMU、BCU和BAU詳解

儲能電站的電池管理系統&#xff08;BMS&#xff09;通常采用三級架構&#xff1a;從控&#xff08;BMU&#xff09;、主控&#xff08;BCU&#xff09;、總控&#xff08;BAU&#xff09;。這種分層設計實現了電池模組、簇、堆的分級管理和控制&#xff0c;確保系統運行的安全…

C++ 基礎復習

基礎復習 1.const引用為什么能引用臨時對象2.內聯函數的額外作用3. nullptr 1.const引用為什么能引用臨時對象 臨時對象&#xff08;Temporary Object&#xff09;是在表達式求值過程中隱式創建的對象&#xff0c;例如&#xff1a; 函數返回非引用類型的值 類型轉換&#xff0…

AI的出現,是否能替代IT從業者?

闡述觀點&#xff1a;AI 的出現不會完全替代 IT 從業者&#xff0c;但會深刻改變 IT 行業的工作方式和崗位結構。 AI 不會完全替代 IT 從業者的原因 AI 本身需要人來開發與維護 AI 模型、系統架構、數據管道等都需要 IT 專業人員來構建和優化。 例如&#xff1a;AI 工程師、M…

【服務器通信-socket】——int socket(int domain, int type, int protocol);

#include <sys/types.h> #include <sys/socket.h> int socket(int domain, int type, int protocol); domain: AF_INET 這是大多數用來產生socket的協議&#xff0c;使用TCP或UDP來傳輸&#xff0c;用IPv4的地址 AF_INET6 與上面類似&#xff0c;不過是來用IPv6的地…

Python基本環境搭配

Python3 環境搭建 | 菜鳥教程 里面有直接跳轉 Fitten Code 按下 Tab 鍵接受所有補全建議&#xff1a; 按下 Ctrl→ 鍵(mac系統為Command→)接收單個詞補全建議&#xff1a; 用戶可通過點擊左上角工具欄中的Fitten Code – 開始對話或者使用快捷鍵CtrlAltC(mac系統為Contr…

C++負載均衡遠程調用學習之HOOK注冊機制

目錄 1.larV0.7-hook流程的說明 2.larV0.7-TCP_server集成鏈接HOOK函數 3.larV0.7-TCP_client集成鏈接HOOK注冊功能 1.larV0.7-hook流程的說明 ### 7.1 數據庫表相關查詢方法實現 ? 我們先實現一些基本的數據表達查詢方法&#xff1a; > lars_dns/src/dns_rout…

Rust 與 Golang 深度對決:從語法到應用場景的全方位解析

一、引言 在軟件開發的快速發展浪潮中&#xff0c;Rust 和 Golang&#xff08;Go 語言&#xff09;脫穎而出&#xff0c;成為開發者熱議的編程語言。Rust 憑借強大的內存安全性與卓越的性能備受贊譽&#xff0c;Golang 則以簡潔的語法和出色的并發處理能力贏得開發者青睞。本文…

C++負載均衡遠程調用學習之訂閱功能與發布功能

目錄 1.lars-DnsV0.1回顧 2.Lars-DnsV0.2-訂閱功能的訂閱模塊分析 3.Lars-DnsV0.2-訂閱模塊的類的單例創建及方法屬性初始化 4.Lars-DnsV0.2-發布功能的實現 5.Lars-DnsV0.2-發布功能的總結 6.Lars-DnsV0.2-訂閱流程復習 7.Lars-DnsV0.2-訂閱模塊的集成 8.Lars-DnsV0.2訂…

SurfSense開源程序是NotebookLM / Perplexity / Glean的開源替代品,連接到外部來源,如搜索引擎

?一、軟件介紹 文末提供程序和源碼下載 雖然 NotebookLM 和 Perplexity 等工具令人印象深刻&#xff0c;并且對于對任何主題/查詢進行研究都非常有效&#xff0c;但 SurfSense 通過與你的個人知識庫集成來提升這種能力。它是一個高度可定制的 AI 研究代理&#xff0c;連接到外…

基于OpenTelemetry的分布式鏈路追蹤Trace?實現(PHP篇)

目錄 引言一、OpenTelemetry是一套可觀測性標準協議二、分布式追蹤&#xff08;?Trace?&#xff09;是OpenTelemetry的核心功能之一三、OpenTelemetry的架構原理四、OpenTelemetry的分布式追蹤&#xff08;?Trace?&#xff09;實踐1、準備PHP環境2、下載SDK3、編寫實例代碼…

探索智能體的記憶:類型、策略和應用

AI Agent 中的記憶&#xff1a;類型、策略和應用 記憶實現是使智能體能夠保持上下文、從過去的交互中學習并做出明智決策的關鍵組成部分。與人類記憶非常相似&#xff0c;智能體記憶允許 AI 系統隨時間存儲、檢索和利用信息&#xff0c;從而為用戶創造更連貫和個性化的體驗。 …

leetcode 2395. Find Subarrays With Equal Sum

題目描述 代碼&#xff1a; class Solution { public:bool findSubarrays(vector<int>& nums) {int len nums.size();if(len <2)return false;unordered_set<int> table;int sum 0;for(int i 1;i < len;i){sum nums[i-1]nums[i];if(table.contains(…

Kubernetes(k8s)學習筆記(七)--KubeSphere 最小化安裝

前情提要 可視化操作面板對于開發、運維絕對是提升工作效率的一大利器&#xff0c;因此很有必要搭建一套可視化操作來管理Kubernetes。 可視化面板有多種&#xff1a; 1.Kubernetes官方提供的默認面板&#xff1a;dashboard&#xff0c;用處不大&#xff0c;放棄&#xff1b…

MCP連接Agent:AI時代的TCP/IP

介紹 2023年&#xff0c;生成式AI爆發。2024年&#xff0c;智能體&#xff08;Agent&#xff09;接棒成為AI新焦點。2025年&#xff0c;智能體似乎已經要開始爆發了。目前的智能體更像一個“單機App”&#xff1a;彼此不了解、無法通信&#xff0c;更不能協作。類似互聯網早期…

交換機工作原理(MAC地址表、VLAN)

目錄 一、交換機的基本工作原理 數據幀的轉發 MAC地址表的作用 交換機的轉發方式 二、VLAN&#xff08;虛擬局域網&#xff09; VLAN的定義 VLAN的作用 VLAN的實現方式 VLAN的幀標記 VLAN的通信 三、交換機與VLAN的結合 四、交換機與VLAN的實際應用場景 交換機是局…

eFish-SBC-RK3576工控板外部RTC測試操作指南

備注&#xff1a; 1&#xff09;測試時一定要接電池&#xff0c;否則外部RTC斷電后無法工作導致測試失敗&#xff1b; 2&#xff09;如果連接了網絡&#xff0c;系統會自動同步NTP時鐘&#xff0c;所以需要關閉自動同步時鐘。 關閉自動同步NTP時鐘方法&#xff1a; 先查看是…

淘寶按圖搜索商品(拍立淘)Java 爬蟲實戰指南

在電商領域&#xff0c;按圖搜索商品功能為用戶提供了更直觀、便捷的購物體驗。淘寶的拍立淘功能更是憑借其強大的圖像識別技術&#xff0c;成為許多開發者和商家關注的焦點。本文將詳細介紹如何利用 Java 爬蟲技術實現淘寶按圖搜索商品功能&#xff0c;包括注冊賬號、上傳圖片…

【Redis】List類型

文章目錄 List的特點介紹lpush&#xff0c;lpushx&#xff0c;rpush&#xff0c;rpushx命令lrange命令lpop和rpoplindex命令linsert命令llen命令lrem 命令ltrim命令lset命令阻塞版本的命令blpop和brpop 命令小結list的內部編碼List的應用場景 List的特點介紹 列表相當于一個數…

QT:qt5調用打開exe程序并獲取調用按鈕控件實例2025.5.7

為實現在 VS2015 的 Qt 開發環境下打開外部 exe&#xff0c;列出其界面按鈕控件的序號與文本名&#xff0c;然后點擊包含特定文本的按鈕控件。以下是更新后的代碼&#xff1a; #include <QCoreApplication> #include <QProcess> #include <QDebug> #include…