如何在Tauri与Yew前端间传递对象?返回None问题求助
解决Tauri+Yew中命令返回结构体前端获取为None的问题
问题原因
你之前返回String类型时,as_string()可以直接提取字符串值,但现在返回的是实现了Serialize的Data结构体,Tauri会把它序列化为JSON对象而非字符串。此时用as_string()去解析JSON对象,自然会得到None,因为它不是字符串类型。
解决方案
前端需要定义对应的数据结构,将Tauri返回的JsValue反序列化为该结构体,而不是尝试转成字符串。
1. 前端定义对应结构体
在Yew的前端代码中,定义和后端Data对应的结构体,并派生Deserialize trait:
use serde::Deserialize; #[derive(Debug, Deserialize)] struct Data { demo: String, }
2. 修改invoke调用代码
将返回的JsValue转换为定义好的Data结构体,而不是调用as_string():
use wasm_bindgen::JsValue; use serde::Deserialize; // ... 其他业务代码 new_msg = invoke( "greet", to_value(&GreetArgs { name: &*name }).unwrap(), ).await; // 将JsValue反序列化为Data结构体 let data: Data = serde_wasm_bindgen::from_value(new_msg).unwrap(); // 正常访问结构体字段 log(&data.demo);
补充说明
- 确保前端依赖中已添加
serde-wasm-bindgencrate,它负责在JsValue和Rust类型之间完成序列化/反序列化操作。 - 如果不需要强类型约束,也可以用
js_sys::Object直接访问属性,但定义对应结构体是更安全、易维护的做法。
内容的提问来源于stack exchange,提问作者grmmgrmm
相关产品推荐
相关产品推荐

