Vue3 中使用 Element Plus 實現自定義按鈕的 ElNotification 提示框

在 Vue3 項目中,我們經常會用到 ElNotification 作為消息提醒組件,尤其是在異步操作、任務完成或用戶需要交互確認時。然而,Element Plus 默認的 Notification 是非交互式的,不能直接嵌入按鈕或事件。

今天我們來實現一個帶自定義按鈕和點擊事件的 Notification 提示框,并且支持手動關閉。

? 目標效果

我們希望實現這樣的功能:

  • 彈出一個固定的通知框(duration: false
  • 內容中嵌入自定義按鈕
  • 點擊按鈕后執行事件回調,并關閉該通知框

📦 技術棧

  • Vue 3 Composition API
  • Element Plus
  • 渲染自定義內容:h() 渲染函數
  • 引用通知對象:ref + id 進行映射管理

? 實現方案

1. 基礎代碼結構

<script setup lang="ts">
import { ElNotification } from 'element-plus'
import { ref, h } from 'vue'// 存儲所有通知實例
const notify = ref<Record<string, any>>({})// 觸發通知
const fc = () => {const id = Math.random().toString()const closeNotification = () => {notify.value[id]?.close()delete notify.value[id]}notify.value[id] = ElNotification({type: 'warning',title: '提醒',duration: 0,dangerouslyUseHTMLString: true,message: h('div', [h('p', {}, '消息內容'),h('p',{style: 'width: 250px; display: flex; justify-content: space-between;',},[h('a',{style: 'color: #409EFF; cursor: pointer;',onClick: closeNotification,},'確定'),]),]),})
}
</script>

🔍 核心邏輯說明

關鍵點說明
notify.value存儲所有當前激活的通知框引用,方便后續關閉
Math.random().toString()用作唯一 key 區分多個通知(可換成 UUID)
h()Vue 的渲染函數,用于嵌入 HTML/組件內容
dangerouslyUseHTMLString: trueh() 沖突,寫錯會無效;這里只是保留展示形式建議使用 h() 就不加它
duration: 0通知不會自動關閉,用戶需點擊按鈕關閉
onClick: closeNotification點擊按鈕時關閉對應通知框

🧠 可擴展思路

  1. 多個按鈕場景

    h('button', { onClick: handleReject }, '拒絕')
    h('button', { onClick: handleAccept }, '接受')
    
  2. 替換為組件
    使用 defineComponent 包一層小組件傳給 message

  3. 支持通知唯一性
    通知已存在就不再重復彈出,避免重復提醒

  4. 封裝為 composable

    const useNotification = () => {const notifyMap = ref({})const show = (opts: { message: string; onClick: Fn }) => { ... }return { show }
    }
    

🧪 實際應用場景

  • 后臺審批通知:“你有一條待處理任務”
  • 導出提示:“導出任務正在生成,點擊查看”
  • 會話提醒:“對話超時,點擊繼續會話”

🔚 小結

Element Plus 的 ElNotification 雖然是用于展示型通知,但通過 h() 渲染函數可以實現非常靈活的交互內容。借助 Vue3 的組合式 API,我們還能輕松實現批量通知管理、動態事件綁定,極大提升了用戶體驗與可維護性。

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

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

相關文章

下載webrtc M114版本源碼只能使用外網googlesource源-命令版

聲網、國內源都不行&#xff0c;只能外網googlesource源&#xff01;&#xff01;&#xff01; 二、創建 Ubuntu 容器&#xff08;帶目錄掛載&#xff09; 拉取Ubuntu鏡像 docker pull ubuntu:22.04創建并啟動容器&#xff08;掛載Windows目錄到容器&#xff09; docker run -i…

Linux運維新手的修煉手扎之第21天

Nginx服務和Tomcat服務1 負載均衡語法格式&#xff1a;upstream[一個或多個]rootubuntu24-13:~# vim /etc/nginx/conf.d/vhost.confupstream group1 {server 10.0.0.16;}upstream group2 {server 10.0.0.14;}server {listen 80;server_name sswang1.magedu.com;location / {pro…

TrOCR: 基于Transformer的光學字符識別方法,使用預訓練模型

溫馨提示&#xff1a; 本篇文章已同步至"AI專題精講" TrOCR: 基于Transformer的光學字符識別方法&#xff0c;使用預訓練模型 摘要 文本識別是文檔數字化中的一個長期研究問題。現有方法通常基于CNN進行圖像理解&#xff0c;基于RNN進行字符級文本生成。此外&#…

西門子工業軟件全球高級副總裁兼大中華區董事總經理梁乃明先生一行到訪庭田科技

概要2025年6月&#xff0c;西門子工業軟件全球高級副總裁兼大中華區董事總經理梁乃明先生一行到訪我司。庭田科技總經理聶春文攜銷售團隊對西門子代表團表示熱烈歡迎&#xff0c;并就當前業務發展方向及未來行業聚焦領域與代表團展開深入交流。 聶春文總經理及銷售團隊陪同西門…

在 Jenkins 中使用 SSH 部署密鑰

本文檔介紹了如何在 Jenkins 中配置 SSH 部署密鑰&#xff0c;以便更穩定地拉取 Git 倉庫代碼&#xff0c;避免常見的 RPC 錯誤。 1. 背景 在使用 Jenkins 進行持續集成時&#xff0c;常常需要從 Git 倉庫拉取代碼。如果使用 HTTP/HTTPS 協議&#xff0c;有時會遇到 RPC 錯誤&…

小紅書采集工具:無水印圖片一鍵獲取,同步采集筆記與評論

我用python語言開發了一款名為“爬xhs圖片軟件”的工具&#xff0c;該工具不僅能采集圖片&#xff0c;還可獲取筆記數據、評論數據等內容。 軟件界面長這個樣子&#xff1a; 采集到的圖片&#xff1a;演示視頻&#xff1a;https://live.csdn.net/v/485813介紹文章、想你所想&am…

Java行為型模式---命令模式

命令模式基礎概念命令模式&#xff08;Command Pattern&#xff09;是一種行為型設計模式&#xff0c;其核心思想是將請求封裝為一個對象&#xff0c;從而使你可以用不同的請求對客戶進行參數化&#xff0c;對請求排隊或記錄請求日志&#xff0c;以及支持可撤銷的操作。命令模式…

Android性能優化之包體積優化

一、包體積組成與瓶頸分析 1. 典型 APK 結構占比 #mermaid-svg-KEUQMlEifvHlk1CV {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-KEUQMlEifvHlk1CV .error-icon{fill:#552222;}#mermaid-svg-KEUQMlEifvHlk1CV .erro…

開源Web播放器推薦與選型指南

Video.js3&#xff1a;是市面上最流行的免費、開源 HTML5 視頻播放器之一。可用于直播和點播&#xff0c;支持 HLS、DASH、WebM 和 MP4 等多種格式。它可高度自定義&#xff0c;開源社區中有很多皮膚可供選用&#xff0c;還可通過插件配置 Multi - DRM、廣告插入、字幕等功能&a…

sql注入以及Python二分查找

sql注入 /level1.php?name<script>alert(1)</script> "><script>alert(1)</script> οnclickalert(1) " οnclick"alert(1) "><a href"javascript:alert(1)"> "><a HrEf"javascript:alert…

Coze智能體開發實戰-旅游助手

智能體第1步&#xff1a;創建智能體第2步&#xff1a;設置開場白您好&#xff0c;我是廣州長隆野生動物園旅游助手&#xff0c;有什么能夠幫您&#xff1f;1.景點講解 2.行程規劃 3.天氣查詢 4.酒店查詢第3步&#xff1a;創建工作流第4步&#xff1a;添加“意圖識別”行程規劃第…

51c視覺~合集13

自己的原文哦~ https://blog.51cto.com/whaosoft/11685452 #GKGNet 多標簽分類遇上圖卷積網絡ViG 本文提出了第一個完全圖卷積模型&#xff0c;基于分組K近鄰的圖卷積網絡GKGNet&#xff0c;該模型在靈活且統一的圖結構中&#xff0c;同時建模語義標簽嵌入與圖像塊之…

子數組的最大累加和問題(8)0718

題目給定一個數組arr&#xff0c;返回子數組的最大累加和。例如&#xff0c;arr[1,-2,3,5,-2,6,-1],所有的子數組中&#xff0c;[3,5,-2,6]可以累加出最大的和12&#xff0c;所以返回12.解答如果arr中沒有正數&#xff0c;產生的最大累加和一定是數組中的最大值。如果arr中有正…

LINUX例行性工作(計劃任務)實驗操作 ---at和crontab以及系統級別的計劃任務

1.atd和crond兩個任務管理程序的區別at命令是在指定的時間下只能執行一次任務&#xff1b;crontab命令是可以循環重復&#xff08;周期性&#xff09;的執行定時任務&#xff0c;與windows中的計劃任務有些類似.2.指定在2024/08/15 09:00將時間寫入testmail.txt文件中[rootmast…

二進制寫入與文本寫入的本質區別:系統視角下的文件操作

目錄 一、核心概念 二、二進制寫入 1、特點 2、使用場景 3、二進制寫入整數 12345 的詳細解析示例 1. 變量聲明與初始化 2. 文件打開 3. 二進制寫入 4. 文件關閉 二進制表示分析 文件內容 重要注意事項 三、文本寫入 1、特點 2、使用場景 3、文本模式寫入整數的…

在ComfyUI中CLIP Text Encode (Prompt)和CLIPTextEncodeFlux的區別

CLIP Text Encode (Prompt)CLIPTextEncodeFlux在 ComfyUI 中對 token 支持長度是否相同的詳細技術對比&#xff1a;1、 CLIP Text Encode (Prompt)通常來自&#xff1a;ComfyUI 官方自帶 CLIPTextEncode 節點。特點&#xff1a; ? 使用 OpenAI CLIP 模型&#xff08;ViT-L/14 …

Qt窗口(1)-菜單欄

Qt窗口 概念簡述 與QWidget的區別&#xff1a; QWidget更多是作為一個窗口的一部分 基本結構構成&#xff1a;以Xshell舉例子比較菜單欄和工具欄&#xff1a; 菜單欄&#xff1a;工具欄&#xff1a;工具欄本質是把菜單欄中一些比較常用的選項&#xff0c;直接放到工具欄中&…

弱網測試

使用軟件MAC端&#xff1a;Network Link ConditioneriOS端&#xff1a;設置->開發者->網絡鏈接調節器相關參數帶寬單位為Kbps&#xff0c;丟包率單位是百分比&#xff0c;延遲單位是msDownlink Bandwidth &#xff08;輸入寬帶&#xff09;&#xff1a;設備從服務器接收數…

Nuxt 4.0 深度解析:從架構革新到實戰遷移 [特殊字符]

引言&#xff1a;Vue生態的"瑞士軍刀"又升級了&#xff01; 如果把前端框架比作超級英雄&#xff0c;Nuxt.js 絕對是Vue陣營里最全能的那位——就像鋼鐵俠的戰甲不斷迭代升級&#xff0c;Nuxt也從最初的SSR解決方案&#xff0c;進化成了如今的全棧開發框架。2025年&a…

【Linux內核模塊】模塊參數詳解

玩過智能家居的朋友都知道&#xff0c;一盞智能燈通常有亮度調節、色溫切換的功能 —— 這些可調節的選項讓設備更靈活。其實 Linux 內核模塊也有類似的調節旋鈕&#xff0c;今天要聊的模塊參數。它能讓你在加載模塊時動態配置參數&#xff0c;不用改代碼就能實現功能切換&…