#dioxus #state #同步 #异步

dxoixus-query

针对 Dioxus 的完全类型化、异步、可重用缓存的州管理 🧬

9 个不稳定版本 (4 个破坏性变更)

0.5.1 2024年6月23日
0.5.0 2024年6月22日
0.4.0 2023年12月16日
0.3.2 2023年9月10日
0.1.1 2023年8月5日

#319 in GUI

Download history 3/week @ 2024-05-31 2/week @ 2024-06-07 298/week @ 2024-06-21 39/week @ 2024-06-28 54/week @ 2024-07-05 75/week @ 2024-07-12 5/week @ 2024-07-19 27/week @ 2024-07-26 45/week @ 2024-08-02 35/week @ 2024-08-09

每月下载量 114

MIT 许可证

37KB
632

Discord Server

dxoixus-query 🦀⚡

针对 Dioxus 的完全类型化、异步、可重用缓存的州管理。灵感来自 TanStack Query

请参阅 文档 或加入 Discord

⚠️ 工作正在进行中 ⚠️

支持

  • Dioxus v0.5 🧬
  • 所有渲染器(web桌面freya 等)
  • WASM 和本地目标

安装

安装最新版本

cargo add dioxus-query

示例

cargo run --example simple

使用方法

#[derive(Clone, PartialEq, Eq, Hash)]
enum QueryKey {
    User(usize),
}

#[derive(Debug)]
enum QueryError {
    UserNotFound(usize),
    Unknown
}

#[derive(PartialEq, Debug)]
enum QueryValue {
    UserName(String),
}

async fn fetch_user(keys: Vec<QueryKey>) -> QueryResult<QueryValue, QueryError> {
    if let Some(QueryKey::User(id)) = keys.first() {
        println!("Fetching user {id}");
        sleep(Duration::from_millis(1000)).await;
        match id {
            0 => Ok(QueryValue::UserName("Marc".to_string())),
            _ => Err(QueryError::UserNotFound(*id)),
        }
        .into()
    } else {
        QueryResult::Err(QueryError::Unknown)
    }
}

#[allow(non_snake_case)]
#[component]
fn User(id: usize) -> Element {
   let value = use_get_query([QueryKey::User(id)], fetch_user);

    rsx!( p { "{value.result().value():?}" } )
}

fn app() -> Element {
    use_init_query_client::<QueryValue, QueryError, QueryKey>();
    let client = use_query_client::<QueryValue, QueryError, QueryKey>();

    let onclick = move |_| {
         client.invalidate_query(QueryKey::User(0));
    };

    rsx!(
        User { id: 0 }
        button { onclick, label { "Refresh" } }
    )
}

特性

  • 渲染器无关
  • 查询和突变
  • 类型化突变、查询键、错误和值
  • 手动无效查询
  • 键更改时无效查询
  • 查询并发和批处理
  • 并发突变

待办事项

  • 测试
  • 文档
  • 实际示例

MIT 许可证

依赖项

~4–12MB
~126K SLoC