fix dioxus ssr
This commit is contained in:
1 parent
dc58212508
commit
4a1a00b0f0
27 files changed
+143
-141
No files matched your search
@@ -74,9 +74,9 @@ pub(crate) mod innerlude {
|
||||
pub use crate::innerlude::{
|
||||
fc_to_builder, generation, once, schedule_update, schedule_update_any, vdom_is_rendering,
|
||||
AnyValue, Attribute, AttributeValue, CapturedError, Component, DynamicNode, Element, ElementId,
|
||||
Event, Fragment, IntoDynNode, Mutation, MutationsVec, Properties, ScopeId, Task, Template,
|
||||
TemplateAttribute, TemplateNode, VComponent, VNode, VNodeInner, VPlaceholder, VText,
|
||||
VirtualDom, WriteMutations,
|
||||
Event, Fragment, IntoDynNode, Mutation, MutationsVec, NoOpMutations, Properties, RenderReturn,
|
||||
ScopeId, Task, Template, TemplateAttribute, TemplateNode, VComponent, VNode, VNodeInner,
|
||||
VPlaceholder, VText, VirtualDom, WriteMutations,
|
||||
};
|
||||
|
||||
/// The purpose of this module is to alleviate imports of many common types
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
use crate::any_props::{BoxedAnyProps, VProps};
|
||||
use crate::innerlude::{ElementRef, EventHandler, MountId};
|
||||
use crate::Properties;
|
||||
use crate::innerlude::{ElementRef, EventHandler, MountId, ScopeState};
|
||||
use crate::{arena::ElementId, Element, Event};
|
||||
use crate::{Properties, VirtualDom};
|
||||
use std::ops::Deref;
|
||||
use std::rc::Rc;
|
||||
use std::vec;
|
||||
@@ -20,7 +20,7 @@ pub type TemplateId = &'static str;
|
||||
///
|
||||
/// Dioxus will do its best to immediately resolve any async components into a regular Element, but as an implementor
|
||||
/// you might need to handle the case where there's no node immediately ready.
|
||||
pub(crate) enum RenderReturn {
|
||||
pub enum RenderReturn {
|
||||
/// A currently-available element
|
||||
Ready(VNode),
|
||||
|
||||
@@ -476,6 +476,24 @@ impl VComponent {
|
||||
props: BoxedAnyProps::new(vcomp),
|
||||
}
|
||||
}
|
||||
|
||||
/// Get the scope this node is mounted to if it's mounted
|
||||
///
|
||||
/// This is useful for rendering nodes outside of the VirtualDom, such as in SSR
|
||||
///
|
||||
/// Returns [`None`] if the node is not mounted
|
||||
pub fn mounted_scope<'a>(
|
||||
&self,
|
||||
dynamic_node_index: usize,
|
||||
vnode: &VNode,
|
||||
dom: &'a VirtualDom,
|
||||
) -> Option<&'a ScopeState> {
|
||||
let mount = vnode.mount.get().as_usize()?;
|
||||
|
||||
let scope_id = dom.mounts.get(mount)?.mounted_dynamic_nodes[dynamic_node_index];
|
||||
|
||||
dom.scopes.get(scope_id)
|
||||
}
|
||||
}
|
||||
|
||||
impl std::fmt::Debug for VComponent {
|
||||
|
||||
@@ -27,10 +27,10 @@ impl ScopeId {
|
||||
pub const ROOT: ScopeId = ScopeId(0);
|
||||
}
|
||||
|
||||
/// A component's state separate from its props.
|
||||
/// A component's rendered state.
|
||||
///
|
||||
/// This struct exists to provide a common interface for all scopes without relying on generics.
|
||||
pub(crate) struct ScopeState {
|
||||
/// This state erases the type of the component's props. It is used to store the state of a component in the runtime.
|
||||
pub struct ScopeState {
|
||||
pub(crate) runtime: Rc<Runtime>,
|
||||
pub(crate) context_id: ScopeId,
|
||||
|
||||
|
||||
@@ -293,7 +293,7 @@ impl VirtualDom {
|
||||
/// Get the state for any scope given its ID
|
||||
///
|
||||
/// This is useful for inserting or removing contexts from a scope, or rendering out its root node
|
||||
pub(crate) fn get_scope(&self, id: ScopeId) -> Option<&ScopeState> {
|
||||
pub fn get_scope(&self, id: ScopeId) -> Option<&ScopeState> {
|
||||
self.scopes.get(id.0)
|
||||
}
|
||||
|
||||
|
||||
@@ -62,7 +62,7 @@ fn keyed_diffing_out_of_order_adds() {
|
||||
cx.render(rsx!(order.iter().map(|i| rsx!(div { key: "{i}" }))))
|
||||
});
|
||||
|
||||
_ = dom.rebuild();
|
||||
_ = dom.rebuild(&mut dioxus_core::NoOpMutations);
|
||||
|
||||
dom.mark_dirty(ScopeId::ROOT);
|
||||
assert_eq!(
|
||||
@@ -88,7 +88,7 @@ fn keyed_diffing_out_of_order_adds_3() {
|
||||
cx.render(rsx!(order.iter().map(|i| rsx!(div { key: "{i}" }))))
|
||||
});
|
||||
|
||||
_ = dom.rebuild();
|
||||
_ = dom.rebuild(&mut dioxus_core::NoOpMutations);
|
||||
|
||||
dom.mark_dirty(ScopeId::ROOT);
|
||||
assert_eq!(
|
||||
@@ -114,7 +114,7 @@ fn keyed_diffing_out_of_order_adds_4() {
|
||||
cx.render(rsx!(order.iter().map(|i| rsx!(div { key: "{i}" }))))
|
||||
});
|
||||
|
||||
_ = dom.rebuild();
|
||||
_ = dom.rebuild(&mut dioxus_core::NoOpMutations);
|
||||
|
||||
dom.mark_dirty(ScopeId::ROOT);
|
||||
assert_eq!(
|
||||
@@ -140,7 +140,7 @@ fn keyed_diffing_out_of_order_adds_5() {
|
||||
cx.render(rsx!(order.iter().map(|i| rsx!(div { key: "{i}" }))))
|
||||
});
|
||||
|
||||
_ = dom.rebuild();
|
||||
_ = dom.rebuild(&mut dioxus_core::NoOpMutations);
|
||||
|
||||
dom.mark_dirty(ScopeId::ROOT);
|
||||
assert_eq!(
|
||||
@@ -165,7 +165,7 @@ fn keyed_diffing_additions() {
|
||||
cx.render(rsx!(order.iter().map(|i| rsx!(div { key: "{i}" }))))
|
||||
});
|
||||
|
||||
_ = dom.rebuild();
|
||||
_ = dom.rebuild(&mut dioxus_core::NoOpMutations);
|
||||
|
||||
dom.mark_dirty(ScopeId::ROOT);
|
||||
assert_eq!(
|
||||
@@ -190,7 +190,7 @@ fn keyed_diffing_additions_and_moves_on_ends() {
|
||||
cx.render(rsx!(order.iter().map(|i| rsx!(div { key: "{i}" }))))
|
||||
});
|
||||
|
||||
_ = dom.rebuild();
|
||||
_ = dom.rebuild(&mut dioxus_core::NoOpMutations);
|
||||
|
||||
dom.mark_dirty(ScopeId::ROOT);
|
||||
assert_eq!(
|
||||
@@ -219,7 +219,7 @@ fn keyed_diffing_additions_and_moves_in_middle() {
|
||||
cx.render(rsx!(order.iter().map(|i| rsx!(div { key: "{i}" }))))
|
||||
});
|
||||
|
||||
_ = dom.rebuild();
|
||||
_ = dom.rebuild(&mut dioxus_core::NoOpMutations);
|
||||
|
||||
// LIS: 4, 5, 6
|
||||
dom.mark_dirty(ScopeId::ROOT);
|
||||
@@ -253,7 +253,7 @@ fn controlled_keyed_diffing_out_of_order() {
|
||||
cx.render(rsx!(order.iter().map(|i| rsx!(div { key: "{i}" }))))
|
||||
});
|
||||
|
||||
_ = dom.rebuild();
|
||||
_ = dom.rebuild(&mut dioxus_core::NoOpMutations);
|
||||
|
||||
// LIS: 5, 6
|
||||
dom.mark_dirty(ScopeId::ROOT);
|
||||
@@ -287,7 +287,7 @@ fn controlled_keyed_diffing_out_of_order_max_test() {
|
||||
cx.render(rsx!(order.iter().map(|i| rsx!(div { key: "{i}" }))))
|
||||
});
|
||||
|
||||
_ = dom.rebuild();
|
||||
_ = dom.rebuild(&mut dioxus_core::NoOpMutations);
|
||||
|
||||
dom.mark_dirty(ScopeId::ROOT);
|
||||
assert_eq!(
|
||||
@@ -316,7 +316,7 @@ fn remove_list() {
|
||||
cx.render(rsx!(order.iter().map(|i| rsx!(div { key: "{i}" }))))
|
||||
});
|
||||
|
||||
_ = dom.rebuild();
|
||||
_ = dom.rebuild(&mut dioxus_core::NoOpMutations);
|
||||
|
||||
dom.mark_dirty(ScopeId::ROOT);
|
||||
assert_eq!(
|
||||
@@ -341,7 +341,7 @@ fn no_common_keys() {
|
||||
cx.render(rsx!(order.iter().map(|i| rsx!(div { key: "{i}" }))))
|
||||
});
|
||||
|
||||
_ = dom.rebuild();
|
||||
_ = dom.rebuild(&mut dioxus_core::NoOpMutations);
|
||||
|
||||
dom.mark_dirty(ScopeId::ROOT);
|
||||
assert_eq!(
|
||||
|
||||
@@ -282,7 +282,7 @@ fn two_equal_fragments_are_equal_static() {
|
||||
})
|
||||
});
|
||||
|
||||
_ = dom.rebuild();
|
||||
_ = dom.rebuild(&mut dioxus_core::NoOpMutations);
|
||||
assert!(dom.render_immediate().edits.is_empty());
|
||||
}
|
||||
|
||||
@@ -296,7 +296,7 @@ fn two_equal_fragments_are_equal() {
|
||||
})
|
||||
});
|
||||
|
||||
_ = dom.rebuild();
|
||||
_ = dom.rebuild(&mut dioxus_core::NoOpMutations);
|
||||
assert!(dom.render_immediate().edits.is_empty());
|
||||
}
|
||||
|
||||
|
||||
@@ -5,7 +5,7 @@ use dioxus::prelude::*;
|
||||
#[test]
|
||||
fn catches_panic() {
|
||||
let mut dom = VirtualDom::new(app);
|
||||
_ = dom.rebuild();
|
||||
_ = dom.rebuild(&mut dioxus_core::NoOpMutations);
|
||||
}
|
||||
|
||||
fn app(cx: Scope) -> Element {
|
||||
|
||||
@@ -9,7 +9,7 @@ fn events_propagate() {
|
||||
set_event_converter(Box::new(dioxus_html::SerializedHtmlEventConverter));
|
||||
|
||||
let mut dom = VirtualDom::new(app);
|
||||
_ = dom.rebuild();
|
||||
_ = dom.rebuild(&mut dioxus_core::NoOpMutations);
|
||||
|
||||
// Top-level click is registered
|
||||
dom.handle_event(
|
||||
|
||||
@@ -24,7 +24,7 @@ fn manual_diffing() {
|
||||
let value = Arc::new(Mutex::new("Hello"));
|
||||
let mut dom = VirtualDom::new_with_props(app, AppProps { value: value.clone() });
|
||||
|
||||
let _ = dom.rebuild();
|
||||
let _ = dom.rebuild(&mut dioxus_core::NoOpMutations);
|
||||
|
||||
*value.lock().unwrap() = "goodbye";
|
||||
|
||||
@@ -56,7 +56,7 @@ fn events_generate() {
|
||||
};
|
||||
|
||||
let mut dom = VirtualDom::new(app);
|
||||
_ = dom.rebuild();
|
||||
_ = dom.rebuild(&mut dioxus_core::NoOpMutations);
|
||||
|
||||
dom.handle_event(
|
||||
"click",
|
||||
|
||||
@@ -9,7 +9,7 @@ fn miri_rollover() {
|
||||
set_event_converter(Box::new(SerializedHtmlEventConverter));
|
||||
let mut dom = VirtualDom::new(App);
|
||||
|
||||
_ = dom.rebuild();
|
||||
_ = dom.rebuild(&mut dioxus_core::NoOpMutations);
|
||||
|
||||
for _ in 0..3 {
|
||||
dom.handle_event(
|
||||
|
||||
@@ -11,7 +11,7 @@ fn app_drops() {
|
||||
|
||||
let mut dom = VirtualDom::new(App);
|
||||
|
||||
_ = dom.rebuild();
|
||||
_ = dom.rebuild(&mut dioxus_core::NoOpMutations);
|
||||
dom.mark_dirty(ScopeId::ROOT);
|
||||
_ = dom.render_immediate();
|
||||
}
|
||||
@@ -32,7 +32,7 @@ fn hooks_drop() {
|
||||
|
||||
let mut dom = VirtualDom::new(App);
|
||||
|
||||
_ = dom.rebuild();
|
||||
_ = dom.rebuild(&mut dioxus_core::NoOpMutations);
|
||||
dom.mark_dirty(ScopeId::ROOT);
|
||||
_ = dom.render_immediate();
|
||||
}
|
||||
@@ -61,7 +61,7 @@ fn contexts_drop() {
|
||||
|
||||
let mut dom = VirtualDom::new(App);
|
||||
|
||||
_ = dom.rebuild();
|
||||
_ = dom.rebuild(&mut dioxus_core::NoOpMutations);
|
||||
dom.mark_dirty(ScopeId::ROOT);
|
||||
_ = dom.render_immediate();
|
||||
}
|
||||
@@ -81,7 +81,7 @@ fn tasks_drop() {
|
||||
|
||||
let mut dom = VirtualDom::new(App);
|
||||
|
||||
_ = dom.rebuild();
|
||||
_ = dom.rebuild(&mut dioxus_core::NoOpMutations);
|
||||
dom.mark_dirty(ScopeId::ROOT);
|
||||
_ = dom.render_immediate();
|
||||
}
|
||||
@@ -95,7 +95,7 @@ fn root_props_drop() {
|
||||
RootProps("asdasd".to_string()),
|
||||
);
|
||||
|
||||
_ = dom.rebuild();
|
||||
_ = dom.rebuild(&mut dioxus_core::NoOpMutations);
|
||||
dom.mark_dirty(ScopeId::ROOT);
|
||||
_ = dom.render_immediate();
|
||||
}
|
||||
@@ -126,7 +126,7 @@ fn diffing_drops_old() {
|
||||
}
|
||||
|
||||
let mut dom = VirtualDom::new(App);
|
||||
_ = dom.rebuild();
|
||||
_ = dom.rebuild(&mut dioxus_core::NoOpMutations);
|
||||
dom.mark_dirty(ScopeId::ROOT);
|
||||
|
||||
_ = dom.render_immediate();
|
||||
|
||||
@@ -59,7 +59,7 @@ fn test_memory_leak() {
|
||||
|
||||
let mut dom = VirtualDom::new(app);
|
||||
|
||||
_ = dom.rebuild();
|
||||
_ = dom.rebuild(&mut dioxus_core::NoOpMutations);
|
||||
|
||||
for _ in 0..5 {
|
||||
dom.mark_dirty(ScopeId::ROOT);
|
||||
@@ -95,7 +95,7 @@ fn memo_works_properly() {
|
||||
|
||||
let mut dom = VirtualDom::new(app);
|
||||
|
||||
_ = dom.rebuild();
|
||||
_ = dom.rebuild(&mut dioxus_core::NoOpMutations);
|
||||
// todo!()
|
||||
// dom.hard_diff(ScopeId::ROOT);
|
||||
// dom.hard_diff(ScopeId::ROOT);
|
||||
@@ -127,7 +127,7 @@ fn free_works_on_root_hooks() {
|
||||
|
||||
let ptr = Rc::new("asdasd".to_string());
|
||||
let mut dom = VirtualDom::new_with_props(app, AppProps { inner: ptr.clone() });
|
||||
let _ = dom.rebuild();
|
||||
let _ = dom.rebuild(&mut dioxus_core::NoOpMutations);
|
||||
|
||||
// ptr gets cloned into props and then into the hook
|
||||
assert_eq!(Rc::strong_count(&ptr), 4);
|
||||
@@ -204,7 +204,7 @@ fn supports_async() {
|
||||
|
||||
rt.block_on(async {
|
||||
let mut dom = VirtualDom::new(app);
|
||||
let _ = dom.rebuild();
|
||||
let _ = dom.rebuild(&mut dioxus_core::NoOpMutations);
|
||||
|
||||
for _ in 0..10 {
|
||||
dom.wait_for_work().await;
|
||||
|
||||
@@ -9,7 +9,7 @@ fn it_works() {
|
||||
.unwrap()
|
||||
.block_on(async {
|
||||
let mut dom = VirtualDom::new(app);
|
||||
_ = dom.rebuild();
|
||||
_ = dom.rebuild(&mut dioxus_core::NoOpMutations);
|
||||
dom.wait_for_suspense().await;
|
||||
let out = dioxus_ssr::render(&dom);
|
||||
|
||||
|
||||
@@ -30,7 +30,7 @@ async fn it_works() {
|
||||
|
||||
let mut dom = VirtualDom::new(app);
|
||||
|
||||
let _ = dom.rebuild();
|
||||
let _ = dom.rebuild(&mut dioxus_core::NoOpMutations);
|
||||
|
||||
tokio::select! {
|
||||
_ = dom.wait_for_work() => {}
|
||||
|
||||
Reference in new issue
Block a user