main.rs 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  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::{
  10. launch::{self, LaunchBuilder},
  11. prelude::*,
  12. };
  13. use serde::{Deserialize, Serialize};
  14. #[derive(Props, PartialEq, Debug, Default, Serialize, Deserialize, Clone)]
  15. struct AppProps {
  16. count: i32,
  17. }
  18. fn app(cx: Scope<AppProps>) -> Element {
  19. let state =
  20. use_server_future(cx, (), |()| async move { get_server_data().await.unwrap() })?.value();
  21. let mut count = use_state(cx, || 0);
  22. let text = use_state(cx, || "...".to_string());
  23. let eval = use_eval(cx);
  24. cx.render(rsx! {
  25. div {
  26. "Server state: {state}"
  27. }
  28. h1 { "High-Five counter: {count}" }
  29. button { onclick: move |_| count += 1, "Up high!" }
  30. button { onclick: move |_| count -= 1, "Down low!" }
  31. button {
  32. onclick: move |_| {
  33. to_owned![text];
  34. async move {
  35. if let Ok(data) = get_server_data().await {
  36. println!("Client received: {}", data);
  37. text.set(data.clone());
  38. post_server_data(data).await.unwrap();
  39. }
  40. }
  41. },
  42. "Run a server function!"
  43. }
  44. "Server said: {text}"
  45. })
  46. }
  47. #[server]
  48. async fn post_server_data(data: String) -> Result<(), ServerFnError> {
  49. let axum::extract::Host(host): axum::extract::Host = extract().await?;
  50. println!("Server received: {}", data);
  51. println!("{:?}", host);
  52. Ok(())
  53. }
  54. #[server]
  55. async fn get_server_data() -> Result<String, ServerFnError> {
  56. Ok(reqwest::get("https://httpbin.org/ip").await?.text().await?)
  57. }
  58. fn main() {
  59. #[cfg(feature = "web")]
  60. tracing_wasm::set_as_global_default();
  61. #[cfg(feature = "ssr")]
  62. tracing_subscriber::fmt::init();
  63. LaunchBuilder::new_with_props(app, AppProps { count: 0 }).launch()
  64. }