事件
Tauri事件系统是一个多生产者多消费者的通信基元,允许在前端和后端之间传递消息。它类似于命令系统,但必须在事件处理程序中写入有效载荷类型检查,而且它简化了后端与前端之间的通信,工作方式类似于通道。
Tauri 应用程序可以监听和发出全局事件和窗口特定事件。前台和后台的使用方法如下。
前台
事件系统可通过 @tauri-apps/api
软件包的event
和window
模块在前端访问。
全局事件
要使用全局事件通道,请导入event
模块并使用 emit
和 listen
函数:
import { emit, listen } from '@tauri-apps/api/event'
// 监听 "click" 事件,并获取移除事件监听器的函数
// 还有一个 `once` 函数,用于订阅事件,并在第一个事件发生时自动取消订阅监听器
const unlisten = await listen('click', (event) => {
// event.event 是事件名称(如果您想使用一个回调 fn 来处理多种类型的事件,它将非常有用)。
// event.payload 是有效载荷对象
})
// 发出带有对象有效载荷的 `click` 事件
emit('click', {
theMessage: 'Tauri is awesome!',
})
窗口特定事件
窗口特定事件会在window
模块中暴露。
import { appWindow, WebviewWindow } from '@tauri-apps/api/window'
// 发出一个只有当前窗口可见的事件
appWindow.emit('event', { message: 'Tauri is awesome!' })
// 创建一个新的 webview 窗口,并仅向该窗口发出一个事件
const webview = new WebviewWindow('window')
webview.emit('event')
后台
在后台,全局事件通道在 App
结构中公开,特定于窗口的事件可以使用Window
特性来发布。
全局事件
use tauri::Manager;
// 有效载荷类型必须实现 `Serialize` 和 `Clone`。
#[derive(Clone, serde::Serialize)]
struct Payload {
message: String,
}
fn main() {
tauri::Builder::default()
.setup(|app| {
// 监听 "事件名称"(在任何窗口上发出)
let id = app.listen_global("event-name", |event| {
println!("got event-name with payload {:?}", event.payload());
});
// 使用 "listen_global "函数返回的 "id "取消对事件的监听
// `App`结构上也有一个 `once_global` 应用程序接口
app.unlisten(id);
// 向前端所有webview窗口发出 `event-name` 事件
app.emit_all("event-name", Payload { message: "Tauri is awesome!".into() }).unwrap();
Ok(())
})
.run(tauri::generate_context!())
.expect("failed to run app");
}
窗口特定事件
要使用特定于窗口的事件通道,可以通过命令处理程序或 get_window
函数获得一个Window
对象:
use tauri::{Manager, Window};
// payload类型必须实现 `Serialize` 和 `Clone`。
#[derive(Clone, serde::Serialize)]
struct Payload {
message: String,
}
// 启动命令的后台进程,并仅向使用命令的窗口发出周期性事件
#[tauri::command]
fn init_process(window: Window) {
std::thread::spawn(move || {
loop {
window.emit("event-name", Payload { message: "Tauri is awesome!".into() }).unwrap();
}
});
}
fn main() {
tauri::Builder::default()
.setup(|app| {
// 这里的 `main` 是窗口标签;它在创建窗口时或在 `tauri.conf.json` 中定义
// 默认值是 `main`,注意必须是唯一的
let main_window = app.get_window("main").unwrap();
// 监听`event-name`(在`main`窗口中发出)
let id = main_window.listen("event-name", |event| {
println!("got window event-name with payload {:?}", event.payload());
});
// 使用 "监听 "函数返回的 "id "取消监听事件
// `Window`结构中也有一个`once`应用程序接口
main_window.unlisten(id);
// 向 `main` 窗口发出 `event-name` 事件
main_window.emit("event-name", Payload { message: "Tauri is awesome!".into() }).unwrap();
Ok(())
})
.invoke_handler(tauri::generate_handler![init_process])
.run(tauri::generate_context!())
.expect("failed to run app");
}