more fullstack cleanups: loaders serialize, ServeConfig only (#4785)

* some opinionated cleanups in dioxus-server

* add serialize to loader

* add `result` to Resource

* clippy

* fix

* writable memos, resources, `onmount`, `.pending`, and `.value()` on actions

* fix compile issues

* fix typo
This commit is contained in:
Jonathan Kelley authored and GitHub committed 2025-10-14 17:34:52 -07:00
1 parent a3e40a5ea2
commit 7102bc3b6a
33 files changed
+2085 -672

No files matched your search

+3 -3
View File
@@ -105,9 +105,9 @@ fn app() -> Element {
"Fetch User Info"
}
pre { "Logged in: {login.result():?}" }
pre { "User name: {user_name.result():?}" }
pre { "Permissions: {permissions.result():?}" }
pre { "Logged in: {login.value():?}" }
pre { "User name: {user_name.value():?}" }
pre { "Permissions: {permissions.value():?}" }
}
}
}
+1 -1
View File
@@ -22,7 +22,7 @@ fn app() -> Element {
}
}
div {
match breed.result() {
match breed.value() {
None => rsx! { div { "Click the button to fetch a dog!" } },
Some(Err(_e)) => rsx! { div { "Failed to fetch a dog, please try again." } },
Some(Ok(res)) => rsx! { img { max_width: "500px", max_height: "500px", src: "{res}" } },
+6 -6
View File
@@ -72,12 +72,12 @@ fn main() {
pre { "Dog data: {dog_data.value():#?}" }
pre { "IP data: {ip_data.value():#?}" }
pre { "Custom encoded data: {custom_data.value():#?}" }
pre { "Error data: {error_data.result():#?}" }
pre { "Typed error data: {typed_error_data.result():#?}" }
pre { "HTTP 400 data: {http_error_data.result():#?}" }
pre { "HTTP 400 (context) data: {http_error_context_data.result():#?}" }
pre { "Dog error data: {dog_data_err.result():#?}" }
pre { "Throws ok data: {throws_ok_data.result():#?}" }
pre { "Error data: {error_data.value():#?}" }
pre { "Typed error data: {typed_error_data.value():#?}" }
pre { "HTTP 400 data: {http_error_data.value():#?}" }
pre { "HTTP 400 (context) data: {http_error_context_data.value():#?}" }
pre { "Dog error data: {dog_data_err.value():#?}" }
pre { "Throws ok data: {throws_ok_data.value():#?}" }
}
}
});
+1 -1
View File
@@ -21,7 +21,7 @@ fn app() -> Element {
rsx! {
h1 { "Header Map Example" }
button { onclick: move |_| headers.call(), "Get Headers" }
if let Some(Ok(headers)) = headers.result() {
if let Some(Ok(headers)) = headers.value() {
p { "Response from server:" }
pre { "{headers}" }
} else {
@@ -38,7 +38,7 @@ fn app() -> Element {
div { style: "margin: 1rem 0;",
h2 { "Server Greeting" }
button { onclick: move |_| message.call("World".to_string(), 30), "Get Server Greeting" }
if message.is_pending() {
if message.pending() {
p { "Loading..." }
}
p { "{message:#?}" }
+1 -1
View File
@@ -34,7 +34,7 @@ fn app() -> Element {
},
"Get Sensitive Data",
}
pre { "Response from locked API: {fetch_sensitive.result():?}"}
pre { "Response from locked API: {fetch_sensitive.value():?}"}
form {
onsubmit: move |evt: FormEvent| async move {
// Prevent the browser from navigating away.
+1 -1
View File
@@ -37,7 +37,7 @@ fn app() -> Element {
rsx! {
h1 { "Fullstack Middleware Example" }
button { onclick: move |_| per_route.call(), "Fetch Data" }
pre { "{per_route.result():#?}" }
pre { "{per_route.value():#?}" }
}
}
+7 -7
View File
@@ -174,13 +174,13 @@ fn app() -> Element {
"Clear results"
}
pre { "Echo result: {echo_action.result():#?}" }
pre { "Chat result: {chat_action.result():#?}" }
pre { "Dog data: {dog_data.result():#?}" }
pre { "Custom data: {custom_data.result():#?}" }
pre { "Anonymous: {anonymous_action.result():#?}" }
pre { "Custom anonymous: {custom_anonymous_action.result():#?}" }
pre { "Custom response: {custom_response_action.result():#?}" }
pre { "Echo result: {echo_action.value():#?}" }
pre { "Chat result: {chat_action.value():#?}" }
pre { "Dog data: {dog_data.value():#?}" }
pre { "Custom data: {custom_data.value():#?}" }
pre { "Anonymous: {anonymous_action.value():#?}" }
pre { "Custom anonymous: {custom_anonymous_action.value():#?}" }
pre { "Custom response: {custom_response_action.value():#?}" }
}
}
}
+4 -4
View File
@@ -108,13 +108,13 @@ fn app() -> Element {
rsx! {
div {
button { onclick: move |_| users.call(), "Get Users" }
pre { "{users.result():?}" }
pre { "{users.value():?}" }
button { onclick: move |_| messages.call(), "Get Messages" }
pre { "{messages.result():?}" }
pre { "{messages.value():?}" }
button { onclick: move |_| broadcast.call(), "Broadcast Message" }
pre { "{broadcast.result():?}" }
pre { "{broadcast.value():?}" }
button { onclick: move |_| add.call(), "Add Message" }
pre { "{add.result():?}" }
pre { "{add.value():?}" }
}
}
}
+2 -2
View File
@@ -36,12 +36,12 @@ fn Home() -> Element {
}
#[component]
fn Post(id: u32) -> Element {
fn Post(id: ReadSignal<u32>) -> Element {
// You can return `HttpError` to return a specific HTTP status code and message.
// `404 Not Found` will cause the server to return a 404 status code.
//
// `use_loader` will suspend the server-side rendering until the future resolves.
let post_data = use_loader(move || get_post(id))?;
let post_data = use_loader(move || get_post(id()))?;
rsx! {
h1 { "Post {id}" }
@@ -80,7 +80,7 @@ fn app() -> Element {
},
"Drop files here"
}
pre { "{upload_as_file_upload.result():?}" }
pre { "{upload_as_file_upload.value():?}" }
}
div {
@@ -99,9 +99,9 @@ fn app() -> Element {
div {
h3 { "Download a file from the server" }
button { onclick: move |_| download_file.call(), "Download file" }
if let Some(Ok(content)) = &download_file.result() {
if let Some(Ok(content)) = &download_file.value() {
pre { "{content}" }
} else if let Some(Err(e)) = &download_file.result() {
} else if let Some(Err(e)) = &download_file.value() {
pre { "Error downloading file: {e}" }
}
}