diff --git a/packages/core/src/virtual_dom.rs b/packages/core/src/virtual_dom.rs index 8bbb0b86b..a953d3404 100644 --- a/packages/core/src/virtual_dom.rs +++ b/packages/core/src/virtual_dom.rs @@ -507,6 +507,23 @@ impl VirtualDom { } } } + + fn mark_dirty_scope(&mut self, scope_id: ScopeId) { + let scopes = &self.scopes; + if let Some(scope) = scopes.get_scope(scope_id) { + let height = scope.height; + let id = scope_id.0; + if let Err(index) = self.dirty_scopes.binary_search_by(|new| { + let scope = scopes.get_scope(*new).unwrap(); + let new_height = scope.height; + let new_id = &scope.scope_id(); + height.cmp(&new_height).then(new_id.0.cmp(&id)) + }) { + self.dirty_scopes.insert(index, scope_id); + log::info!("mark_dirty_scope: {:?}", self.dirty_scopes); + } + } + } } impl Drop for VirtualDom { diff --git a/packages/hooks/Cargo.toml b/packages/hooks/Cargo.toml index 41c4d2854..a9cfa340d 100644 --- a/packages/hooks/Cargo.toml +++ b/packages/hooks/Cargo.toml @@ -14,7 +14,7 @@ keywords = ["dom", "ui", "gui", "react", "wasm"] [dependencies] dioxus-core = { path = "../../packages/core", version = "^0.2.1" } futures-channel = "0.3.21" -log = { version = "0.4" } +log = "0.4" [dev-dependencies] diff --git a/packages/web/Cargo.toml b/packages/web/Cargo.toml index 1a121072b..7d8e6a3cc 100644 --- a/packages/web/Cargo.toml +++ b/packages/web/Cargo.toml @@ -20,7 +20,7 @@ dioxus-interpreter-js = { path = "../interpreter", version = "^0.2.1", features js-sys = "0.3.56" wasm-bindgen = { version = "0.2.79", features = ["enable-interning"] } wasm-bindgen-futures = "0.4.29" -log = { version = "0.4.14" } +log = "0.4.14" rustc-hash = "1.1.0" console_error_panic_hook = { version = "0.1.7", optional = true } once_cell = "1.9.0" @@ -28,7 +28,6 @@ anyhow = "1.0.53" gloo-timers = { version = "0.2.3", features = ["futures"] } futures-util = "0.3.19" smallstr = "0.2.0" -serde-wasm-bindgen = "0.4.2" futures-channel = "0.3.21" serde_json = { version = "1.0" } @@ -78,12 +77,13 @@ features = [ ] [features] -default = ["panic_hook"] +default = ["panic_hook", "hydrate"] panic_hook = ["console_error_panic_hook"] - +hydrate = [] [dev-dependencies] dioxus = { path = "../dioxus" } wasm-bindgen-test = "0.3.29" dioxus-ssr = { path = "../ssr" } wasm-logger = "0.2.0" +dioxus-web = { path = "." } diff --git a/packages/web/src/dom.rs b/packages/web/src/dom.rs index 6e6137fde..98e89ee47 100644 --- a/packages/web/src/dom.rs +++ b/packages/web/src/dom.rs @@ -12,7 +12,7 @@ use dioxus_html::event_bubbles; use dioxus_interpreter_js::Interpreter; use js_sys::Function; use std::{any::Any, rc::Rc, sync::Arc}; -use wasm_bindgen::{closure::Closure, JsCast}; +use wasm_bindgen::{closure::Closure, JsCast, JsValue}; use web_sys::{Document, Element, Event, HtmlElement}; use crate::Config; @@ -148,11 +148,11 @@ impl WebsysDom { } DomEdit::CreateTextNode { text, root } => { - let text = serde_wasm_bindgen::to_value(text).unwrap(); + let text = JsValue::from_str(text); self.interpreter.CreateTextNode(text, root) } DomEdit::SetText { root, text } => { - let text = serde_wasm_bindgen::to_value(text).unwrap(); + let text = JsValue::from_str(text); self.interpreter.SetText(root, text) } DomEdit::SetAttribute { @@ -161,7 +161,7 @@ impl WebsysDom { value, ns, } => { - let value = serde_wasm_bindgen::to_value(&value).unwrap(); + let value = JsValue::from_str(&value.to_string()); self.interpreter.SetAttribute(root, field, value, ns) } DomEdit::CloneNode { id, new_id } => self.interpreter.CloneNode(id, new_id), diff --git a/packages/web/src/lib.rs b/packages/web/src/lib.rs index b37d29c1f..4c0831ef5 100644 --- a/packages/web/src/lib.rs +++ b/packages/web/src/lib.rs @@ -67,6 +67,7 @@ mod cfg; mod dom; #[cfg(any(feature = "hot-reload", debug_assertions))] mod hot_reload; +#[cfg(feature = "hydrate")] mod rehydrate; // mod ric_raf; mod util; @@ -164,7 +165,8 @@ where pub async fn run_with_props(root: Component, root_props: T, cfg: Config) { let mut dom = VirtualDom::new_with_props(root, root_props); - if cfg!(feature = "panic_hook") && cfg.default_panic_hook { + #[cfg(feature = "panic_hook")] + if cfg.default_panic_hook { console_error_panic_hook::set_once(); } @@ -194,6 +196,8 @@ pub async fn run_with_props(root: Component, root_props: T // it's a waste to produce edits just to get the vdom loaded let _ = dom.rebuild(); + #[cfg(feature = "hydrate")] + #[allow(unused_variables)] if let Err(err) = websys_dom.rehydrate(&dom) { log::error!( "Rehydration failed {:?}. Rebuild DOM into element from scratch",