在 Electron 应用开发中,系统通知(Notification
)是提高用户体验的重要手段。配合 Vue 路由实现“点击通知跳转到指定页面”,可以满足如消息提醒、任务完成、系统告警等多种业务场景。
本文将基于 electron-vite-vue 项目,介绍如何:
electron-vite-vue/
├── electron/
│ ├── main/
│ │ └── notification.ts ← 通知与点击逻辑
│ ├── preload/
│ │ └── index.ts ← 暴露 sendNotification API
├── src/
│ ├── App.vue ← 触发按钮
│ ├── router/index.ts ← 监听跳转
在 electron/main/notification.ts
中:
import { Notification, BrowserWindow, ipcMain } from 'electron'
export function setupNotification(win: BrowserWindow) {
ipcMain.on('notify-with-path', (_, { title, body, path }) => {
const notification = new Notification({
title,
body,
// @ts-ignore
data: path,
})
notification.on('click', () => {
if (win.isMinimized()) win.restore()
win.show()
win.focus()
const targetPath = notification.data
win.webContents.send('navigate-to', targetPath)
})
notification.show()
})
}
并在主入口中引入:
import { setupNotification } from './notification'
setupNotification(win)
在 electron/preload/index.ts
中:
contextBridge.exposeInMainWorld('electronAPI', {
sendNotification: (title: string, body: string, path: string) => {
ipcRenderer.send('notify-with-path', { title, body, path })
},
onNavigate: (cb: (path: string) => void) => {
ipcRenderer.on('navigate-to', (_, path) => cb(path))
}
})
App.vue
在 main.ts
或 App.vue
中:
import router from './router'
window.electronAPI.onNavigate((path) => {
router.push(path)
})
在首次发送通知前,可判断是否已有权限:
if (Notification.permission === 'granted') {
new Notification('标题', { body: '内容' })
} else if (Notification.permission !== 'denied') {
Notification.requestPermission().then(permission => {
if (permission === 'granted') {
new Notification('标题', { body: '内容' })
}
})
}
注意:Electron 无法跳转系统设置页面,需要用户手动开启通知权限。
通过上述封装,我们实现了:
该结构清晰、易扩展,适用于消息提醒、通知中心、工作流等 Electron 应用场景。
如需了解更多 Electron 通信结构封装,建议阅读:
Electron IPC 通信三层封装实践
欢迎点赞、收藏、分享