From f43ac85df909aa99ee637bb014cd6179e683e46b Mon Sep 17 00:00:00 2001 From: Equal Ma Date: Tue, 12 Sep 2023 23:03:36 +0800 Subject: [PATCH] wip --- crates/frender-csr-web/src/renderer.rs | 49 ++++++-------- crates/frender-html-simple/src/component.rs | 73 +++++++++++---------- crates/frender-html/src/elements/str.rs | 4 +- crates/frender-html/src/renderer.rs | 33 ++++------ 4 files changed, 72 insertions(+), 87 deletions(-) diff --git a/crates/frender-csr-web/src/renderer.rs b/crates/frender-csr-web/src/renderer.rs index 0fd2db02..2c0d00e8 100644 --- a/crates/frender-csr-web/src/renderer.rs +++ b/crates/frender-csr-web/src/renderer.rs @@ -1,9 +1,6 @@ use std::borrow::Cow; -use frender_html::{ - renderer::{CreateElementOfType, RenderTextFrom}, - RenderHtml, -}; +use frender_html::{renderer::RenderTextFrom, RenderHtml}; use wasm_bindgen::{JsCast, UnwrapThrowExt}; use crate::try_behavior::{TryBehavior, TryWithTryBehavior}; @@ -172,35 +169,20 @@ impl RenderTextFrom = Node>, E> - CreateElementOfType for Renderer<'_, TB> -where - E: JsCast, -{ - fn create_element_of_type( - &mut self, - ) -> ::Element - where - Self: RenderHtml, - { - let element = self - .document - .create_element(ET::INTRINSIC_COMPONENT_TAG) - .unwrap_with_behavior(&mut self.try_behavior); - Node( - element - .dyn_into() - .unwrap_with_behavior(&mut self.try_behavior), - ) - } -} - impl RenderHtml for Renderer<'_, TB> { type EventListenerId = gloo_events::EventListener; type Event = web_sys::Event; type Text = Node; type div = Node; + + fn div(&mut self) -> Self::div { + let element = self + .document + .create_element(::INTRINSIC_COMPONENT_TAG) + .unwrap_with_behavior(&mut self.try_behavior); + Node(element.unchecked_into()) + } } pub struct Node(N); @@ -214,12 +196,19 @@ mod node { impl<'a, TB: TryBehavior> Renderer<'a, TB> { fn readd_node(&mut self, node: &web_sys::Node, force_reposition: bool) { + web_sys::console::log_3(&"readd_node".into(), node, &force_reposition.into()); if force_reposition { match &self.next_node_position { - NextNodePosition::FirstChildOf(parent) => parent - .prepend_with_node_1(node) - .unwrap_with_behavior(&mut self.try_behavior), + NextNodePosition::FirstChildOf(parent) => { + web_sys::console::log_2(&"FirstChildOf".into(), parent); + + parent + .prepend_with_node_1(node) + .unwrap_with_behavior(&mut self.try_behavior) + } NextNodePosition::InsertAfter(pre) => { + web_sys::console::log_2(&"InsertAfter".into(), pre); + pre.parent_node() .unwrap() .insert_before(node, pre.next_sibling().as_ref()) diff --git a/crates/frender-html-simple/src/component.rs b/crates/frender-html-simple/src/component.rs index 73f2f1ca..9de19f9f 100644 --- a/crates/frender-html-simple/src/component.rs +++ b/crates/frender-html-simple/src/component.rs @@ -74,7 +74,7 @@ pub trait ElementWithChildren { mod imp { use frender_csr::element::intrinsic::ElementAndMounted; use frender_html::{ - renderer::{node_behaviors, CreateElementOfType}, + renderer::{node_behaviors, CreateElement}, Element, ElementOfType, IntrinsicComponent, RenderHtml, RenderState, UpdateElementNonReactive, }; @@ -206,34 +206,33 @@ mod imp { children, attributes, } = P::into_element_props(self.1); - if let Some(element_and_mounted) = render_state.element_and_mounted { - update_element_maybe_reposition( - element_and_mounted, - renderer, - |element, renderer| { - ::update_element_non_reactive( - attributes, - renderer, - element, - props_state.attrs_state, - ); - >::children_render_update( + + let element_and_mounted = + render_state + .element_and_mounted + .get_or_insert_with(|| ElementAndMounted { + element: ::create_element(renderer), + mounted: false, + }); + + update_element_maybe_reposition( + element_and_mounted, + renderer, + |element, renderer| { + ::update_element_non_reactive( + attributes, + renderer, + element, + props_state.attrs_state, + ); + >::children_render_update( children, renderer, props_state.children_render_state, ) - }, - force_reposition, - ) - } else { - *render_state.element_and_mounted = Some(ElementAndMounted { - element: - >::create_element_of_type( - renderer, - ), - mounted: true, - }); - } + }, + force_reposition, + ) } } @@ -248,22 +247,24 @@ mod imp { ) { let ElementAndMounted { element, mounted } = element_and_mounted; - { - element.move_cursor_at_the_first_child_of_self(renderer); - update(element, renderer); - }; - if *mounted && !force_reposition { - element.move_cursor_after_self(renderer); + // element.move_cursor_after_self(renderer); } else { - if *mounted && element.cursor_is_at_self(renderer) { - element.move_cursor_after_self(renderer); - return; - } + // if *mounted && element.cursor_is_at_self(renderer) { + // element.move_cursor_after_self(renderer); + // return; + // } - element.readd_self(renderer, force_reposition); + element.readd_self(renderer, true); *mounted = true; } + + { + element.move_cursor_at_the_first_child_of_self(renderer); + update(element, renderer); + }; + + element.move_cursor_after_self(renderer); } } diff --git a/crates/frender-html/src/elements/str.rs b/crates/frender-html/src/elements/str.rs index 54400ad2..9061eef5 100644 --- a/crates/frender-html/src/elements/str.rs +++ b/crates/frender-html/src/elements/str.rs @@ -160,8 +160,10 @@ impl State { pub fn initialize_with_str, S>(data: S, renderer: &mut R) -> Self where S: RenderingStr, + Text: crate::renderer::node_behaviors::Node, { - let text = renderer.render_text_from(&*data); + let mut text = renderer.render_text_from(&*data); + text.readd_self(renderer, true); State { node: text, cache: S::create_cache(data), diff --git a/crates/frender-html/src/renderer.rs b/crates/frender-html/src/renderer.rs index 084443fc..5dbf1be4 100644 --- a/crates/frender-html/src/renderer.rs +++ b/crates/frender-html/src/renderer.rs @@ -12,7 +12,7 @@ macro_rules! define_node_type_traits { } ) => { pub trait $node_type_trait - : HasIntrinsicComponentTag + : HasIntrinsicComponentTag + CreateElement $(+ $super_trait)? { type $node_trait: crate::renderer::node_behaviors::$node_trait $(+ crate::Identity::$super_trait_element>)? @@ -58,6 +58,7 @@ macro_rules! define_nodes_types { ) => { $($( type $tags: crate::renderer::node_behaviors::$node_trait; + fn $tags(&mut self) -> Self::$tags; )*)? expand! { if ($($sub_mods)*) { @@ -79,6 +80,12 @@ macro_rules! define_element_type { const INTRINSIC_COMPONENT_TAG: &'static str = stringify!($tag); } + impl crate::renderer::CreateElement for $tag { + fn create_element(renderer: &mut R) -> crate::ElementOfType { + renderer.$tag() + } + } + $( impl super::$super_trait for $tag { type $super_trait_element = R::$tag; @@ -159,9 +166,6 @@ macro_rules! trait_create_element { macro_rules! define { ( - $vis_create_element:vis trait $trait_create_element:ident { - } - #[alias($element_type_traits:ident)] $vis_element_types:vis mod $element_types:ident { $($element_types_defs:tt)* @@ -171,11 +175,6 @@ macro_rules! define { $($render_html_items:tt)* } ) => { - trait_create_element! { - [$vis_create_element trait $trait_create_element] - {$($element_types_defs)*} - [] - } define_node_type_traits! { $($element_types_defs)* } $vis_element_types mod $element_types { mod_element_types! { $($element_types_defs)* } @@ -210,8 +209,6 @@ pub mod element_types { } define!( - pub trait CreateElement {} - #[alias(element_type_traits)] pub mod element_types { mod Element { @@ -240,8 +237,7 @@ define!( + RenderTextFrom + RenderTextFrom + RenderTextFrom - + RenderTextFrom - + CreateElement], + + RenderTextFrom], ) { #![allow(non_camel_case_types)] @@ -266,17 +262,14 @@ pub trait HasIntrinsicComponentTag { const INTRINSIC_COMPONENT_TAG: &'static str; } -pub trait CreateElementOfType { - fn create_element_of_type(&mut self) -> ET::Element +pub trait CreateElement { + fn create_element(renderer: &mut R) -> Self::Element where - Self: RenderHtml; + Self: ElementType; } pub trait RenderTextFrom { - // let text = dom_ctx.document.create_text_node(&data); - // dom_ctx - // .next_node_position - // .add_node(Cow::Owned(text.clone().into())); + /// should not move cursor fn render_text_from(&mut self, v: &V) -> Text; fn update_text_from(&mut self, text: &mut Text, v: &V); }