suspense.rs 906 B

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. use dioxus::prelude::*;
  2. #[test]
  3. fn it_works() {
  4. // wait just a moment, not enough time for the boundary to resolve
  5. tokio::runtime::Builder::new_current_thread()
  6. .build()
  7. .unwrap()
  8. .block_on(async {
  9. let mut dom = VirtualDom::new(app);
  10. _ = dom.rebuild();
  11. dom.wait_for_suspense().await;
  12. let out = dioxus_ssr::pre_render(&dom);
  13. assert_eq!(out, "<div>Waiting for... child</div>");
  14. dbg!(out);
  15. });
  16. }
  17. fn app(cx: Scope) -> Element {
  18. cx.render(rsx!(
  19. div {
  20. "Waiting for... "
  21. suspended_child {}
  22. }
  23. ))
  24. }
  25. fn suspended_child(cx: Scope) -> Element {
  26. let val = use_state(cx, || 0);
  27. if **val < 3 {
  28. let mut val = val.clone();
  29. cx.spawn(async move {
  30. val += 1;
  31. });
  32. cx.suspend()?;
  33. }
  34. render!("child")
  35. }