diff options
author | Hayleigh Thompson <me@hayleigh.dev> | 2024-03-11 05:48:53 +0100 |
---|---|---|
committer | Hayleigh Thompson <me@hayleigh.dev> | 2024-03-12 08:04:11 +0100 |
commit | c0042287511c6aaa3447f9ffc38a095add939a25 (patch) | |
tree | 3a1c2629299bedc8babf35a35cfad697639467e8 /src/vdom.ffi.mjs | |
parent | 1e6354995552ff44d1527874c36ccb7de3b45f28 (diff) | |
download | lustre-c0042287511c6aaa3447f9ffc38a095add939a25.tar.gz lustre-c0042287511c6aaa3447f9ffc38a095add939a25.zip |
:recycle: Add a 'Map' vdom node for more efficient msg mapping.
Diffstat (limited to 'src/vdom.ffi.mjs')
-rw-r--r-- | src/vdom.ffi.mjs | 9 |
1 files changed, 6 insertions, 3 deletions
diff --git a/src/vdom.ffi.mjs b/src/vdom.ffi.mjs index 3a6e5a1..0e5cd70 100644 --- a/src/vdom.ffi.mjs +++ b/src/vdom.ffi.mjs @@ -1,7 +1,10 @@ import { Empty } from "./gleam.mjs"; -import { map as result_map } from "../gleam_stdlib/gleam/result.mjs"; export function morph(prev, curr, dispatch, parent) { + if (curr?.subtree) { + return morph(prev, curr.subtree(), dispatch, parent); + } + // The current node is an `Element` and the previous DOM node is also a DOM // element. if (curr?.tag && prev?.nodeType === 1) { @@ -296,7 +299,7 @@ function morphAttr(el, name, value, dispatch) { if (el.hasAttribute(name)) break; const event = name.slice(15).toLowerCase(); - const handler = (e) => dispatch(serverEventHandler(e)); + const handler = dispatch(serverEventHandler); if (el.$lustre[`${name}Handler`]) { el.removeEventListener(event, el.$lustre[`${name}Handler`]); @@ -328,7 +331,7 @@ function morphAttr(el, name, value, dispatch) { if (el.$lustre[name] === value) break; const event = name.slice(2).toLowerCase(); - const handler = (e) => result_map(value(e), dispatch); + const handler = dispatch(value); if (el.$lustre[`${name}Handler`]) { el.removeEventListener(event, el.$lustre[`${name}Handler`]); |