事件

Tauri事件系统是一个多生产者多消费者的通信基元,允许在前端和后端之间传递消息。它类似于命令系统,但必须在事件处理程序中写入有效载荷类型检查,而且它简化了后端与前端之间的通信,工作方式类似于通道。

Tauri 应用程序可以监听和发出全局事件和窗口特定事件。前台和后台的使用方法如下。

前台

事件系统可通过 @tauri-apps/api 软件包的eventwindow模块在前端访问。

全局事件

要使用全局事件通道,请导入event模块并使用 emitlisten 函数:


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");
}