server_future.rs 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. use dioxus::prelude::*;
  2. fn main() {
  3. launch(app);
  4. }
  5. fn app() -> Element {
  6. let val = use_server_future(fetch_users).suspend()?;
  7. rsx! {
  8. h1 { "Users" }
  9. }
  10. }
  11. #[component]
  12. fn ClientComponent(name: Signal<i32>, id: i64) -> Element {
  13. rsx! {
  14. div { "Name: {name}, ID: {id}" }
  15. button {
  16. onclick: move |_| async move {
  17. // Optimistically change the name on the client
  18. name.set("new name".to_string());
  19. // Change the name on the server
  20. change_name(id, "new name".to_string()).await;
  21. // And then re-fetch the user list
  22. revalidate(user_list);
  23. },
  24. "Change name"
  25. }
  26. }
  27. }
  28. #[derive(Table)]
  29. struct Users {
  30. name: String,
  31. age: i32,
  32. }
  33. #[server]
  34. async fn fetch_users() -> Result<Element> {
  35. let users = get_users().await?;
  36. Ok(rsx! {
  37. for user in users {
  38. ClientComponent {
  39. name: user.name,
  40. id: user.id,
  41. }
  42. }
  43. })
  44. }
  45. #[server]
  46. async fn change_name(id: i64, new_name: String) -> Result<()> {
  47. // Send a request to the server to change the name
  48. }