main.rs 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. //! Run with:
  2. //!
  3. //! ```sh
  4. //! dx build --features web --release
  5. //! cargo run --features ssr --release
  6. //! ```
  7. #![allow(non_snake_case, unused)]
  8. use dioxus::prelude::*;
  9. use dioxus_fullstack::{launch, prelude::*};
  10. use serde::{Deserialize, Serialize};
  11. #[derive(Props, PartialEq, Debug, Default, Serialize, Deserialize, Clone)]
  12. struct AppProps {
  13. count: i32,
  14. }
  15. fn app(cx: Scope<AppProps>) -> Element {
  16. let state =
  17. use_server_future(cx, (), |()| async move { get_server_data().await.unwrap() })?.value();
  18. let mut count = use_state(cx, || 0);
  19. let text = use_state(cx, || "...".to_string());
  20. cx.render(rsx! {
  21. div {
  22. "Server state: {state}"
  23. }
  24. h1 { "High-Five counter: {count}" }
  25. button { onclick: move |_| count += 1, "Up high!" }
  26. button { onclick: move |_| count -= 1, "Down low!" }
  27. button {
  28. onclick: move |_| {
  29. to_owned![text];
  30. async move {
  31. if let Ok(data) = get_server_data().await {
  32. println!("Client received: {}", data);
  33. text.set(data.clone());
  34. post_server_data(data).await.unwrap();
  35. }
  36. }
  37. },
  38. "Run a server function!"
  39. }
  40. "Server said: {text}"
  41. })
  42. }
  43. #[server(PostServerData)]
  44. async fn post_server_data(data: String) -> Result<(), ServerFnError> {
  45. println!("Server received: {}", data);
  46. Ok(())
  47. }
  48. #[server(GetServerData)]
  49. async fn get_server_data() -> Result<String, ServerFnError> {
  50. Ok(reqwest::get("https://httpbin.org/ip").await?.text().await?)
  51. }
  52. fn main() {
  53. #[cfg(feature = "web")]
  54. tracing_wasm::set_as_global_default();
  55. #[cfg(feature = "ssr")]
  56. tracing_subscriber::fmt::init();
  57. LaunchBuilder::new_with_props(app, AppProps { count: 0 }).launch()
  58. }