📡 invoke 命令
前端通过 invoke 调用 Rust 命令:
Rust 定义命令
rust
// src-tauri/src/lib.rs
#[tauri::command]
fn greet(name: &str) -> String {
format!("Hello, {}!", name)
}
#[tauri::command]
async fn fetch_data(url: String) -> Result {
// 异步操作
Ok("data".to_string())
}
// 注册命令
fn main() {
tauri::Builder::default()
.invoke_handler(tauri::generate_handler![greet, fetch_data])
.run(tauri::generate_context!())
.expect("error while running tauri application");
}
前端调用
typescript
import { invoke } from '@tauri-apps/api/core';
// 同步调用
const greeting = await invoke('greet', { name: 'World' });
console.log(greeting); // "Hello, World!"
// 异步调用
try {
const data = await invoke('fetch_data', { url: 'https://api.example.com' });
console.log(data);
} catch (error) {
console.error(error);
}
📨 事件系统
双向事件通信,支持广播和定向发送。
前端监听事件
typescript
import { listen } from '@tauri-apps/api/event';
// 监听事件
const unlisten = await listen('my-event', (event) => {
console.log('Received:', event.payload);
});
// 取消监听
unlisten();
Rust 发送事件
rust
use tauri::Manager;
#[tauri::command]
fn send_event(app: tauri::AppHandle) {
// 广播到所有窗口
app.emit("my-event", "Hello from Rust").unwrap();
// 发送到特定窗口
app.get_webview_window("main")
.unwrap()
.emit("my-event", "Hello").unwrap();
}
前端发送事件
typescript
import { emit } from '@tauri-apps/api/event';
// 发送事件
await emit('my-event', { data: 'from frontend' });
📊 状态管理
在 Rust 端管理应用状态,跨命令共享。
rust
use std::sync::Mutex;
use tauri::State;
struct AppState {
counter: Mutex,
}
#[tauri::command]
fn increment(state: State) -> i32 {
let mut counter = state.counter.lock().unwrap();
*counter += 1;
*counter
}
fn main() {
tauri::Builder::default()
.manage(AppState {
counter: Mutex::new(0),
})
.invoke_handler(tauri::generate_handler![increment])
.run(tauri::generate_context!())
.expect("error");
}
🔄 数据类型
IPC 支持的数据类型:
| Rust | JavaScript |
|---|---|
| String, &str | string |
| i32, i64, f64 | number |
| bool | boolean |
| Vec<T> | Array |
| HashMap<K, V> | Object |
| Option<T> | T | null |
| Result<T, E> | Promise |