Yew自定义Hook中use_state调用get()报错E0599的解决方案咨询
Yew自定义Hook调用
.get()报错的解决方案 问题场景
尝试实现一个Yew自定义Hook,代码如下:
pub fn get_toggle_key(v: Vec<Video>, video_index: UseStateHandle<usize>) -> Callback<KeyboardEvent> { let videos = v.clone(); let current_video_index = video_index; let current_video_index = use_state(|| 0); Callback::from(move |event: KeyboardEvent| { if event.key() == "w" || event.key() == "s" { let current_index = current_video_index.get(); //... 更多代码 ...
调用.get()时出现编译错误:
error[E0599]: no method named `get` found for opaque type `impl Hook<Output = yew::UseStateHandle<{integer}>> + '_` in the current scope --> src/components/organisms/keydown_logic.rs:16:53 | 16 | let current_index = current_video_index.get(); | ^^^ method not found in `impl Hook<Output = UseStateHandle<{integer}>>`
原因分析
- 自定义Hook命名不规范:Yew要求自定义Hook的函数名必须以
use_开头,否则Yew不会将其识别为Hook。此时调用use_state返回的不是实际的状态句柄UseStateHandle,而是Hook内部的不透明类型,该类型没有.get()方法。 - 冗余状态声明:代码中已经通过参数传入了
UseStateHandle<usize>类型的video_index,却又重新调用use_state(|| 0)覆盖变量,既造成冗余,又导致后续无法正确获取状态值。
解决方案
1. 修正自定义Hook命名
将函数名改为以use_开头,确保Yew识别其为合法自定义Hook:
pub fn use_toggle_key(v: Vec<Video>, video_index: UseStateHandle<usize>) -> Callback<KeyboardEvent> { // ... 后续代码 ... }
2. 移除冗余的use_state调用
直接使用传入的video_index状态句柄即可:
pub fn use_toggle_key(v: Vec<Video>, video_index: UseStateHandle<usize>) -> Callback<KeyboardEvent> { let videos = v.clone(); let current_video_index = video_index; Callback::from(move |event: KeyboardEvent| { if event.key() == "w" || event.key() == "s" { let current_index = current_video_index.get(); // ... 后续逻辑代码 ... } }) }
补充说明
如果确实需要在自定义Hook内部维护独立状态,只要函数名符合use_前缀规则,use_state就会正确返回UseStateHandle,此时可以正常调用.get()和.set()方法操作状态。
内容的提问来源于stack exchange,提问作者Martin Schultz Kristensen
相关产品推荐
相关产品推荐

