dioxus-knowledge-patch
Dioxus 0.5+ Knowledge Patch
Claude's baseline knowledge covers Dioxus through 0.4.x. This skill provides features from 0.5 (2024) onwards.
Quick Reference
Component Syntax (0.5+)
| Old (0.4) | New (0.5+) |
|---|---|
fn App(cx: Scope) -> Element |
fn App() -> Element |
cx.use_hook() |
use_signal(), use_memo() |
use_state, use_ref |
Signal<T> (always Copy) |
| Per-platform launchers | dioxus::launch(App) |
Signals
| Operation | Syntax |
|---|---|
| Create | let count = use_signal(|| 0); |
| Read (subscribes) | count.read() or count() |
| Read (no subscribe) | count.peek() |
| Write | count.write(), count.set(5), count += 1 |
| Global | static THEME: GlobalSignal<T> = GlobalSignal::new(|| ...) |
| Mapped | user.map(|u| &u.name) |
See references/signals-hooks.md for hooks, effects, resources, coroutines.
RSX Syntax
| Pattern | Example |
|---|---|
| Conditional | if show { Header {} } |
| Conditional attr | class: if active { "active" } |
| List with key | for item in items { li { key: "{item.id}", ... } } |
| Children prop | fn Card(children: Element) -> Element |
| Optional prop | #[props(default)] disabled: bool |
| Prop into | #[props(into)] id: String |
See references/rsx-patterns.md for attributes, events, prop spreading.
Assets (0.6+)
const LOGO: Asset = asset!("/assets/logo.png");
const HERO: Asset = asset!("/hero.png", ImageAssetOptions::new()
.format(ImageFormat::Avif).preload(true));
const STYLES: Asset = asset!("/app.css", CssAssetOptions::new().minify(true));
Server Functions (0.7+)
| Feature | Syntax |
|---|---|
| Basic | #[server] async fn get_data() -> Result<T> |
| Route params | #[get("/api/users/{id}")] async fn get_user(id: u32) |
| Query params | #[get("/search?query")] async fn search(query: String) |
| Middleware | #[server] #[middleware(AuthLayer)] |
| Extractors | async fn auth(headers: HeaderMap, cookies: Cookies) |
See references/fullstack.md for WebSocket, SSR, streaming, server config.
Router
#[derive(Routable, Clone, PartialEq)]
enum Route {
#[route("/")]
Home {},
#[route("/user/:id")]
User { id: u32 },
#[route("/files/:..path")] // Catch-all
Files { path: Vec<String> },
}
See references/router.md for layouts, navigation, nested routes.
CLI Commands
| Command | Purpose |
|---|---|
dx serve |
Dev server with hot-reload |
dx serve --platform ios |
iOS simulator |
dx build --release |
Production build |
dx bundle |
Package for distribution |
dx serve --wasm-split |
Route-based code splitting |
See references/cli-desktop.md for desktop config, platform args.
Reference Files
| File | Contents |
|---|---|
signals-hooks.md |
Signals, use_memo, use_effect, use_resource, context |
rsx-patterns.md |
RSX syntax, props, events, conditionals, lists |
fullstack.md |
Server functions, SSR, WebSocket, extractors |
router.md |
Routes, layouts, navigation, parameters |
cli-desktop.md |
CLI commands, desktop config, platforms |
Critical Knowledge
Element is Result (0.6+)
Use ? anywhere - propagates to ErrorBoundary:
#[component]
fn Profile(id: u32) -> Element {
let user = get_user(id)?; // Early return on error
rsx! { "{user.name}" }
}
Suspense for Async
rsx! {
SuspenseBoundary {
fallback: |_| rsx! { "Loading..." },
AsyncChild {}
}
}
fn AsyncChild() -> Element {
let data = use_resource(fetch_data).suspend()?;
rsx! { "{data}" }
}
Document Head
use dioxus::document::{Title, Link, Meta};
rsx! {
Title { "My Page" }
Meta { name: "description", content: "..." }
Link { rel: "stylesheet", href: asset!("/style.css") }
}
Stores for Nested State (0.7+)
#[derive(Store)]
struct AppState {
users: BTreeMap<String, User>,
}
#[component]
fn UserList(state: Store<AppState>) -> Element {
let users = state.users();
rsx! {
for (id, user) in users.iter() {
UserRow { key: "{id}", user } // Only changed items re-render
}
}
}
CSS Modules (0.7.3+)
css_module!(Styles = "/styles.module.css", AssetOptions::css_module());
rsx! {
div { class: Styles::container, // Typed, compile-checked
p { class: Styles::title, "Hello" }
}
}
Fullstack Server Setup
use axum::Router;
use dioxus::prelude::*;
#[tokio::main]
async fn main() {
let app = Router::new()
.serve_static_assets("dist")
.serve_dioxus_application(ServeConfig::new(), App);
let listener = tokio::net::TcpListener::bind("0.0.0.0:3000").await.unwrap();
axum::serve(listener, app).await.unwrap();
}
Reactivity Gotchas
Memos in attributes don't subscribe properly:
// BAD: Won't update
let style = use_memo(move || format!("color: {}", color()));
rsx! { div { style: style } }
// GOOD: Direct signal read
rsx! { div { style: format!("color: {}", color()) } }
Use individual CSS properties:
// GOOD: Proper reactivity
rsx! {
p {
font_weight: if bold() { "bold" } else { "normal" },
text_align: "{align}",
}
}
Hot-Reload Boundaries
Instant reload: Literal values, text, formatted segments, attribute order, template structure
Requires rebuild: Rust logic, component structure, control flow conditions, struct field changes