dioxus/examples/suspense.rs

74 lines
2.5 KiB
Rust
Raw Normal View History

//! Suspense in Dioxus
//!
2024-01-16 19:18:46 +00:00
//! Currently, `rsx!` does not accept futures as values. To achieve the functionality
//! of suspense, we need to make a new component that performs its own suspense
//! handling.
//!
//! In this example, we render the `Doggo` component which starts a future that
//! will cause it to fetch a random dog image from the Dog API. Since the data
//! is not ready immediately, we render some loading text.
//!
2023-07-25 19:30:08 +00:00
//! We can achieve the majority of suspense functionality by composing "suspenseful"
//! primitives in our own custom components.
2024-01-20 00:36:40 +00:00
use dioxus::desktop::{Config, LogicalSize, WindowBuilder};
use dioxus::prelude::*;
fn main() {
2024-01-18 20:32:01 +00:00
LaunchBuilder::desktop()
.with_cfg(
Config::new().with_window(
WindowBuilder::new()
.with_title("Doggo Fetcher")
.with_inner_size(LogicalSize::new(600.0, 800.0)),
),
2024-01-15 21:06:05 +00:00
)
2024-01-18 20:32:01 +00:00
.launch(app)
}
fn app() -> Element {
2024-01-16 19:18:46 +00:00
rsx! {
div {
h1 { "Dogs are very important" }
p {
2022-02-21 20:39:47 +00:00
"The dog or domestic dog (Canis familiaris[4][5] or Canis lupus familiaris[5])"
"is a domesticated descendant of the wolf which is characterized by an upturning tail."
"The dog derived from an ancient, extinct wolf,[6][7] and the modern grey wolf is the"
"dog's nearest living relative.[8] The dog was the first species to be domesticated,[9][8]"
2022-01-03 05:46:06 +00:00
"by huntergatherers over 15,000 years ago,[7] before the development of agriculture.[1]"
}
h3 { "Illustrious Dog Photo" }
Doggo {}
}
2024-01-14 05:12:21 +00:00
}
}
/// This component will re-render when the future has finished
/// Suspense is achieved my moving the future into only the component that
/// actually renders the data.
#[component]
fn Doggo() -> Element {
2024-02-05 19:59:50 +00:00
let mut fut = use_resource(move || async move {
2024-01-15 21:06:05 +00:00
#[derive(serde::Deserialize)]
struct DogApi {
message: String,
}
reqwest::get("https://dog.ceo/api/breeds/image/random/")
.await
.unwrap()
.json::<DogApi>()
.await
});
2024-03-08 16:32:57 +00:00
match fut.read_unchecked().as_ref() {
2024-01-16 19:18:46 +00:00
Some(Ok(resp)) => rsx! {
button { onclick: move |_| fut.restart(), "Click to fetch another doggo" }
div { img { max_width: "500px", max_height: "500px", src: "{resp.message}" } }
},
2024-01-16 19:18:46 +00:00
Some(Err(_)) => rsx! { div { "loading dogs failed" } },
None => rsx! { div { "loading dogs..." } },
2024-01-14 05:12:21 +00:00
}
}