router.rs 945 B

1234567891011121314151617181920212223242526272829303132333435363738
  1. use dioxus_core::Element;
  2. use dioxus_core as dioxus;
  3. use dioxus_core::prelude::*;
  4. use dioxus_core_macro::*;
  5. use dioxus_html as dioxus_elements;
  6. use crate::RouterService;
  7. #[derive(Props)]
  8. pub struct RouterProps<'a> {
  9. children: Element<'a>,
  10. #[props(default)]
  11. onchange: EventHandler<'a, String>,
  12. }
  13. #[allow(non_snake_case)]
  14. pub fn Router<'a>(cx: Scope<'a, RouterProps<'a>>) -> Element {
  15. log::debug!("running router {:?}", cx.scope_id());
  16. let svc = cx.use_hook(|_| {
  17. let update = cx.schedule_update_any();
  18. cx.provide_context(RouterService::new(update, cx.scope_id()))
  19. });
  20. let any_pending = svc.pending_events.borrow().len() > 0;
  21. svc.pending_events.borrow_mut().clear();
  22. if any_pending {
  23. let location = svc.current_location();
  24. let path = location.path();
  25. cx.props.onchange.call(path.to_string());
  26. }
  27. cx.render(rsx!(
  28. div { &cx.props.children }
  29. ))
  30. }