Effects

Derived state and side effects. Use macros for client replay; plain functions for SSR-only work.

computed! — client + SSR

let first = use_signal("Ada".into());
let last = use_signal("Lovelace".into());

let full_name = computed!([first, last], move || {
    format!("{} {}", first.get(), last.get())
});

view! { <p>{full_name}</p> }

effect! — client side effects

let query = use_signal(String::new());

effect!([query], move || {
    let q = query.get();
    // Runs on SSR and replays in the browser when query changes
    println!("query changed: {q}");
});

use_effect / use_computed — SSR only

Plain use_effect() and use_computed() run during server render. For browser replay, use computed! and effect! (rs2js-translated).

debounce!

let search = use_signal(String::new());
debounce!([search], 300, move || {
    // Fires 300ms after search stops changing (client + SSR)
});