rendering.rs 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. use dioxus::prelude::*;
  2. use dioxus_desktop::DesktopContext;
  3. #[path = "./utils.rs"]
  4. mod utils;
  5. fn main() {
  6. utils::check_app_exits(check_html_renders);
  7. }
  8. fn use_inner_html(id: &'static str) -> Option<String> {
  9. let mut value = use_signal(|| None as Option<String>);
  10. use_effect(move || {
  11. spawn(async move {
  12. tokio::time::sleep(std::time::Duration::from_millis(500)).await;
  13. let res = eval(&format!(
  14. r#"let element = document.getElementById('{}');
  15. return element.innerHTML"#,
  16. id
  17. ))
  18. .await
  19. .unwrap();
  20. if let Some(html) = res.as_str() {
  21. println!("html: {}", html);
  22. value.set(Some(html.to_string()));
  23. }
  24. });
  25. });
  26. value()
  27. }
  28. const EXPECTED_HTML: &str = r#"<div style="width: 100px; height: 100px; color: rgb(0, 0, 0);" id="5"><input type="checkbox"><h1>text</h1><div><p>hello world</p></div></div>"#;
  29. fn check_html_renders() -> Element {
  30. let inner_html = use_inner_html("main_div");
  31. let desktop_context: DesktopContext = consume_context();
  32. if let Some(raw_html) = inner_html {
  33. println!("{}", raw_html);
  34. let fragment = &raw_html;
  35. let expected = EXPECTED_HTML;
  36. assert_eq!(raw_html, EXPECTED_HTML);
  37. if fragment == expected {
  38. println!("html matches");
  39. desktop_context.close();
  40. }
  41. }
  42. let dyn_value = 0;
  43. let dyn_element = rsx! { div { dangerous_inner_html: "<p>hello world</p>" } };
  44. rsx! {
  45. div { id: "main_div",
  46. div {
  47. width: "100px",
  48. height: "100px",
  49. color: "rgb({dyn_value}, {dyn_value}, {dyn_value})",
  50. id: 5,
  51. input { "type": "checkbox" }
  52. h1 { "text" }
  53. {dyn_element}
  54. }
  55. }
  56. }
  57. }