dioxus_query/lib.rs
1//! # dioxus-query
2//! **Fully-typed, async, reusable state management and synchronization** for [Dioxus 🧬](https://dioxuslabs.com/).
3//! ## Usage
4//!
5//! ```rust
6//! #[derive(Clone, PartialEq, Eq, Hash)]
7//! enum QueryKey {
8//! User(usize),
9//! }
10//!
11//! #[derive(Clone, PartialEq, Eq, Hash, Debug)]
12//! enum QueryError {
13//! UserNotFound(usize),
14//! Unknown
15//! }
16//!
17//! #[derive(Clone, PartialEq, Eq, Hash, Debug)]
18//! enum QueryValue {
19//! UserName(String),
20//! }
21//!
22//! async fn fetch_user(keys: Vec<QueryKey>) -> QueryResult<QueryValue, QueryError> {
23//! if let Some(QueryKey::User(id)) = keys.first() {
24//! println!("Fetching user {id}");
25//! sleep(Duration::from_millis(1000)).await;
26//! match id {
27//! 0 => Ok(QueryValue::UserName("Marc".to_string())),
28//! _ => Err(QueryError::UserNotFound(*id)),
29//! }
30//! .into()
31//! } else {
32//! QueryResult::Err(QueryError::Unknown)
33//! }
34//! }
35//!
36//! #[allow(non_snake_case)]
37//! #[component]
38//! fn User(id: usize) -> Element {
39//! let value = use_get_query(QueryKey::User(id)], fetch_user);
40//!
41//! rsx!( p { "{value.result().value():?}" } )
42//! }
43//!
44//!
45//! fn app() -> Element {
46//! let client = use_query_client::<QueryValue, QueryError, QueryKey>();
47//!
48//! let onclick = move |_| {
49//! client.invalidate_query(QueryKey::User(0));
50//! };
51//!
52//! rsx!(
53//! User { id: 0 }
54//! button { onclick, label { "Refresh" } }
55//! )
56//! }
57//! ```
58//!
59
60mod cached_result;
61mod result;
62mod use_mutation;
63mod use_query;
64mod use_query_client;
65
66pub mod prelude {
67 pub use crate::cached_result::*;
68 pub use crate::result::*;
69 pub use crate::use_mutation::*;
70 pub use crate::use_query::*;
71 pub use crate::use_query_client::*;
72 pub use futures_util;
73}