effect.rs 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. #![allow(unused, non_upper_case_globals, non_snake_case)]
  2. use std::collections::HashMap;
  3. use std::rc::Rc;
  4. use std::cell::RefCell;
  5. use dioxus::prelude::*;
  6. use dioxus_core::ElementId;
  7. use dioxus_signals::*;
  8. #[tokio::test]
  9. async fn effects_rerun() {
  10. #[derive(Default)]
  11. struct RunCounter {
  12. component: usize,
  13. effect: usize,
  14. }
  15. let counter = Rc::new(RefCell::new(RunCounter::default()));
  16. let mut dom = VirtualDom::new_with_props(
  17. |counter: Rc<RefCell<RunCounter>>| {
  18. counter.borrow_mut().component += 1;
  19. let mut signal = use_signal(|| 0);
  20. use_effect({
  21. to_owned![counter];
  22. move || {
  23. counter.borrow_mut().effect += 1;
  24. // This will subscribe the effect to the signal
  25. println!("Signal: {:?}", signal);
  26. // Stop the wait for work manually
  27. needs_update();
  28. }
  29. });
  30. signal += 1;
  31. rsx! {
  32. div {}
  33. }
  34. },
  35. counter.clone(),
  36. );
  37. dom.rebuild_in_place();
  38. dom.wait_for_work().await;
  39. let current_counter = counter.borrow();
  40. assert_eq!(current_counter.component, 1);
  41. assert_eq!(current_counter.effect, 1);
  42. }