Loaders

#[load] handlers fetch server data before a page renders — the Flow equivalent of route loaders.

Define a loader

#[derive(Clone, Serialize, Deserialize)]
struct HomeData {
    title: String,
}

#[load]
async fn home(req: &FlowRequest) -> HomeData {
    HomeData { title: "Welcome".into() }
}

Consume in pages

pub fn page(_req: FlowRequest) -> View {
    let data = use_home_load();
    view! {
        <h1>{data.title.clone()}</h1>
    }
}

With try_use_load

pub fn page(_req: FlowRequest) -> View {
    let data = match try_use_load::<HomeData>("home") {
        Ok(d) => d,
        Err(e) => return error_page(&FlowError::Loader(e)),
    };
    view! { <h1>{data.title.clone()}</h1> }
}

LoadValue

  • LoadValue::Ok(T) — data ready
  • LoadValue::Err(LoaderError) — loader failed
  • LoadValue::Pending — deferred streaming (see Streaming)

FlowRequest access

#[load]
async fn profile(req: &FlowRequest) -> ProfileData {
    let id = req.param("id").unwrap_or("0");
    db::profile(id).await
}