read_size.rs 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. //! Read the size of elements using the MountedData struct.
  2. //!
  3. //! Whenever an Element is finally mounted to the Dom, its data is available to be read.
  4. //! These fields can typically only be read asynchronously, since various renderers need to release the main thread to
  5. //! perform layout and painting.
  6. use std::rc::Rc;
  7. use dioxus::{html::geometry::euclid::Rect, prelude::*};
  8. fn main() {
  9. dioxus::launch(app);
  10. }
  11. fn app() -> Element {
  12. let mut div_element = use_signal(|| None as Option<Rc<MountedData>>);
  13. let mut dimensions = use_signal(Rect::zero);
  14. let read_dims = move |_| async move {
  15. let read = div_element.read();
  16. let client_rect = read.as_ref().map(|el| el.get_client_rect());
  17. if let Some(client_rect) = client_rect {
  18. if let Ok(rect) = client_rect.await {
  19. dimensions.set(rect);
  20. }
  21. }
  22. };
  23. rsx! {
  24. document::Link {
  25. rel: "stylesheet",
  26. href: asset!("/examples/assets/read_size.css"),
  27. }
  28. div {
  29. width: "50%",
  30. height: "50%",
  31. background_color: "red",
  32. onmounted: move |cx| div_element.set(Some(cx.data())),
  33. "This element is {dimensions():?}"
  34. }
  35. button { onclick: read_dims, "Read dimensions" }
  36. }
  37. }