errors.rs 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. #![allow(non_snake_case)]
  2. use dioxus::prelude::*;
  3. use dioxus_signals::{use_signal, use_signal_sync, Signal};
  4. use generational_box::SyncStorage;
  5. fn main() {
  6. dioxus_desktop::launch(app);
  7. }
  8. #[derive(Clone, Copy)]
  9. enum ErrorComponent {
  10. Read,
  11. ReadMut,
  12. ReadDropped,
  13. }
  14. fn app(cx: Scope) -> Element {
  15. let error = use_signal(cx, || None);
  16. render! {
  17. match *error() {
  18. Some(ErrorComponent::Read) => render! { Read {} },
  19. Some(ErrorComponent::ReadMut) => render! { ReadMut {} },
  20. Some(ErrorComponent::ReadDropped) => render! { ReadDropped {} },
  21. None => render! {
  22. button {
  23. onclick: move |_| error.set(Some(ErrorComponent::Read)),
  24. "Read"
  25. }
  26. button {
  27. onclick: move |_| error.set(Some(ErrorComponent::ReadMut)),
  28. "ReadMut"
  29. }
  30. button {
  31. onclick: move |_| error.set(Some(ErrorComponent::ReadDropped)),
  32. "ReadDropped"
  33. }
  34. }
  35. }
  36. }
  37. }
  38. fn Read(cx: Scope) -> Element {
  39. let signal = use_signal_sync(cx, || 0);
  40. let _write = signal.write();
  41. let _read = signal.read();
  42. todo!()
  43. }
  44. fn ReadMut(cx: Scope) -> Element {
  45. let signal = use_signal_sync(cx, || 0);
  46. let _read = signal.read();
  47. let _write = signal.write();
  48. todo!()
  49. }
  50. fn ReadDropped(cx: Scope) -> Element {
  51. let signal = use_signal_sync(cx, || None);
  52. if cx.generation() < 4 {
  53. cx.needs_update();
  54. }
  55. render! {
  56. if let Some(value) = &*signal() {
  57. render!{"{value:?}"}
  58. } else {
  59. render! {
  60. ReadDroppedSignalChild { parent_signal: signal }
  61. }
  62. }
  63. }
  64. }
  65. #[component]
  66. fn ReadDroppedSignalChild(
  67. cx: Scope,
  68. parent_signal: Signal<Option<Signal<i32, SyncStorage>>, SyncStorage>,
  69. ) -> Element {
  70. let signal = use_signal_sync(cx, || 0);
  71. cx.use_hook(move || {
  72. parent_signal.set(Some(signal));
  73. });
  74. render! {
  75. "{signal}"
  76. }
  77. }