123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105 |
- #![allow(unused, non_upper_case_globals, non_snake_case)]
- use std::cell::RefCell;
- use std::collections::HashMap;
- use std::rc::Rc;
- use std::time::Duration;
- use dioxus::prelude::*;
- use dioxus_core::ElementId;
- use dioxus_signals::*;
- #[tokio::test]
- async fn effects_rerun() {
- #[derive(Default)]
- struct RunCounter {
- component: usize,
- effect: usize,
- }
- let counter = Rc::new(RefCell::new(RunCounter::default()));
- let mut dom = VirtualDom::new_with_props(
- |counter: Rc<RefCell<RunCounter>>| {
- counter.borrow_mut().component += 1;
- let mut signal = use_signal(|| 0);
- use_effect({
- to_owned![counter];
- move || {
- counter.borrow_mut().effect += 1;
- // This will subscribe the effect to the signal
- println!("Signal: {:?}", signal);
- // Stop the wait for work manually
- needs_update();
- }
- });
- signal += 1;
- rsx! {
- div {}
- }
- },
- counter.clone(),
- );
- dom.rebuild_in_place();
- tokio::select! {
- _ = dom.wait_for_work() => {}
- _ = tokio::time::sleep(Duration::from_millis(500)) => panic!("timed out")
- };
- let current_counter = counter.borrow();
- assert_eq!(current_counter.component, 1);
- assert_eq!(current_counter.effect, 1);
- }
- // https://github.com/DioxusLabs/dioxus/issues/2347
- // Effects should rerun when the signal changes if there are no changes to the component
- #[tokio::test]
- async fn effects_rerun_without_rerender() {
- #[derive(Default)]
- struct RunCounter {
- component: usize,
- effect: usize,
- }
- let counter = Rc::new(RefCell::new(RunCounter::default()));
- let mut dom = VirtualDom::new_with_props(
- |counter: Rc<RefCell<RunCounter>>| {
- counter.borrow_mut().component += 1;
- println!("component {}", counter.borrow().component);
- let mut signal = use_signal(|| 0);
- use_effect({
- to_owned![counter];
- move || {
- counter.borrow_mut().effect += 1;
- // This will subscribe the effect to the signal
- println!("Signal: {}", signal);
- }
- });
- use_future(move || async move {
- for i in 0..10 {
- tokio::time::sleep(std::time::Duration::from_millis(10)).await;
- println!("future {}", i);
- signal += 1;
- }
- });
- rsx! {
- div {}
- }
- },
- counter.clone(),
- );
- dom.rebuild_in_place();
- tokio::select! {
- _ = dom.wait_for_work() => {}
- _ = tokio::time::sleep(Duration::from_millis(500)) => {}
- };
- let current_counter = counter.borrow();
- assert_eq!(current_counter.component, 1);
- assert_eq!(current_counter.effect, 11);
- }
|