Improving the performance of DOM node creation
This commit is contained in:
parent
6fedf2c71a
commit
02337c2d74
|
@ -252,7 +252,11 @@ impl Dom {
|
|||
}
|
||||
|
||||
|
||||
// TODO create HTML / SVG specific versions of this ?
|
||||
#[inline]
|
||||
pub fn create_element<A>(name: &str) -> A where A: JsCast {
|
||||
document().create_element(name).unwrap_throw().dyn_into().unwrap_throw()
|
||||
}
|
||||
|
||||
#[inline]
|
||||
pub fn create_element_ns<A>(name: &str, namespace: &str) -> A where A: JsCast {
|
||||
document().create_element_ns(Some(namespace), name).unwrap_throw().dyn_into().unwrap_throw()
|
||||
|
|
|
@ -13,23 +13,27 @@ macro_rules! __internal_builder_method {
|
|||
}
|
||||
|
||||
|
||||
#[doc(hidden)]
|
||||
#[macro_export]
|
||||
macro_rules! builder {
|
||||
($namespace:expr, $default:ty, $kind:expr => $t:ty) => {
|
||||
$crate::builder!($namespace, $default, $kind => $t, {})
|
||||
macro_rules! __internal_builder {
|
||||
($default:ty, $name:ident => $make:expr, $kind:expr => $t:ty) => {
|
||||
$crate::__internal_builder!($default, $name => $make, $kind => $t, {})
|
||||
};
|
||||
($namespace:expr, $default:ty, $kind:expr => $t:ty, { $($methods:tt)* }) => {{
|
||||
let a: $t = $crate::create_element_ns($kind, $namespace);
|
||||
($default:ty, $name:ident => $make:expr, $kind:expr => $t:ty, { $($methods:tt)* }) => {{
|
||||
let a: $t = {
|
||||
let $name = $kind;
|
||||
$make
|
||||
};
|
||||
let b = $crate::DomBuilder::new(a);
|
||||
let c = $crate::__internal_builder_method!(b, $($methods)*);
|
||||
$crate::DomBuilder::into_dom(c)
|
||||
}};
|
||||
|
||||
($namespace:expr, $default:ty, $kind:expr) => {
|
||||
$crate::builder!($namespace, $default, $kind => $default)
|
||||
($default:ty, $name:ident => $make:expr, $kind:expr) => {
|
||||
$crate::__internal_builder!($default, $name => $make, $kind => $default)
|
||||
};
|
||||
($namespace:expr, $default:ty, $kind:expr, { $($methods:tt)* }) => {
|
||||
$crate::builder!($namespace, $default, $kind => $default, { $($methods)* })
|
||||
($default:ty, $name:ident => $make:expr, $kind:expr, { $($methods:tt)* }) => {
|
||||
$crate::__internal_builder!($default, $name => $make, $kind => $default, { $($methods)* })
|
||||
};
|
||||
}
|
||||
|
||||
|
@ -37,7 +41,7 @@ macro_rules! builder {
|
|||
#[macro_export]
|
||||
macro_rules! html {
|
||||
($($args:tt)+) => {
|
||||
$crate::builder!($crate::HTML_NAMESPACE, $crate::HtmlElement, $($args)+)
|
||||
$crate::__internal_builder!($crate::HtmlElement, kind => $crate::create_element(kind), $($args)+)
|
||||
};
|
||||
}
|
||||
|
||||
|
@ -45,7 +49,7 @@ macro_rules! html {
|
|||
#[macro_export]
|
||||
macro_rules! svg {
|
||||
($($args:tt)+) => {
|
||||
$crate::builder!($crate::SVG_NAMESPACE, $crate::SvgElement, $($args)+)
|
||||
$crate::__internal_builder!($crate::SvgElement, kind => $crate::create_element_ns(kind, $crate::SVG_NAMESPACE), $($args)+)
|
||||
};
|
||||
}
|
||||
|
||||
|
|
|
@ -145,6 +145,7 @@ pub(crate) fn insert_children_signal_vec<A>(element: Node, callbacks: &mut Callb
|
|||
|
||||
let mut has_inserts = false;
|
||||
|
||||
// TODO is it worth it to use fragments ?
|
||||
let fragment = document().create_document_fragment();
|
||||
|
||||
for dom in state.children.iter_mut() {
|
||||
|
|
Loading…
Reference in New Issue