shared_state.rs 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. #![allow(non_snake_case)]
  2. use std::collections::HashMap;
  3. use dioxus::prelude::*;
  4. fn main() {
  5. dioxus_desktop::launch(App);
  6. }
  7. #[derive(Default)]
  8. struct CoolData {
  9. data: HashMap<usize, String>,
  10. }
  11. impl CoolData {
  12. pub fn new(data: HashMap<usize, String>) -> Self {
  13. Self { data }
  14. }
  15. pub fn view(&self, id: &usize) -> Option<&String> {
  16. self.data.get(id)
  17. }
  18. pub fn set(&mut self, id: usize, data: String) {
  19. self.data.insert(id, data);
  20. }
  21. }
  22. #[rustfmt::skip]
  23. pub fn App(cx: Scope) -> Element {
  24. use_shared_state_provider(cx, || CoolData::new(HashMap::from([
  25. (0, "Hello, World!".to_string()),
  26. (1, "Dioxus is amazing!".to_string())
  27. ])));
  28. render!(
  29. DataEditor {
  30. id: 0
  31. }
  32. DataEditor {
  33. id: 1
  34. }
  35. DataView {
  36. id: 0
  37. }
  38. DataView {
  39. id: 1
  40. }
  41. )
  42. }
  43. #[inline_props]
  44. fn DataEditor(cx: Scope, id: usize) -> Element {
  45. let cool_data = use_shared_state::<CoolData>(cx).unwrap().read();
  46. let my_data = &cool_data.view(id).unwrap();
  47. render!(p {
  48. "{my_data}"
  49. })
  50. }
  51. #[inline_props]
  52. fn DataView(cx: Scope, id: usize) -> Element {
  53. let cool_data = use_shared_state::<CoolData>(cx).unwrap();
  54. let oninput = |e: FormEvent| cool_data.write().set(*id, e.value.clone());
  55. let cool_data = cool_data.read();
  56. let my_data = &cool_data.view(id).unwrap();
  57. render!(input {
  58. oninput: oninput,
  59. value: "{my_data}"
  60. })
  61. }