You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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}>>`

原因分析

  1. 自定义Hook命名不规范:Yew要求自定义Hook的函数名必须以use_开头,否则Yew不会将其识别为Hook。此时调用use_state返回的不是实际的状态句柄UseStateHandle,而是Hook内部的不透明类型,该类型没有.get()方法。
  2. 冗余状态声明:代码中已经通过参数传入了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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 02:05:10