From db58f74fab6f2404d0a1485b072519a7b34a29bc Mon Sep 17 00:00:00 2001 From: Barney Date: Sat, 25 Jun 2022 17:58:55 +0100 Subject: [PATCH 1/2] Inline component functionality --- render/render.js | 5 +++ render/tests/test-inlineComponent.js | 46 ++++++++++++++++++++++++++++ 2 files changed, 51 insertions(+) create mode 100644 render/tests/test-inlineComponent.js diff --git a/render/render.js b/render/render.js index 75a950b27..f80920bb2 100644 --- a/render/render.js +++ b/render/render.js @@ -411,6 +411,11 @@ module.exports = function($window) { } else updateComponent(parent, old, vnode, hooks, nextSibling, ns) } + else if(typeof oldTag === "function" && oldTag.toString() === tag.toString()) { + vnode.state = old.state + + updateComponent(parent, old, vnode, hooks, nextSibling, ns) + } else { removeNode(parent, old) createNode(parent, vnode, hooks, ns, nextSibling) diff --git a/render/tests/test-inlineComponent.js b/render/tests/test-inlineComponent.js new file mode 100644 index 000000000..f9b896898 --- /dev/null +++ b/render/tests/test-inlineComponent.js @@ -0,0 +1,46 @@ +"use strict" + +var o = require("ospec") +var window = require("../../test-utils/browserMock")() + +if (typeof global !== "undefined") { + global.window = window + global.document = window.document + global.requestAnimationFrame = function(callback){callback()} +} + +var m = require("../../index") + +o.spec("inline component", function() { + o.beforeEach(function() { + m.render(document.body, null) + }) + + o("allows closure components to be identified by source equality", function(){ + var oninit = o.spy() + var view = o.spy() + var onremove = o.spy() + + m.mount(document.body, { + view: function() { + return m(function Component() { + return { + oninit, + onremove, + view: function() { + view() + + return "" + }, + } + }) + } + }) + + m.redraw() + + o(oninit.callCount).equals(1)("1 initialisation") + o(view.callCount).equals(2)("2 view executions") + o(onremove.callCount).equals(0)("0 teardowns") + }) +}) \ No newline at end of file From 3ccf6f78d62a970d4c00f23af8cecaf46900dece Mon Sep 17 00:00:00 2001 From: Barney Date: Mon, 27 Jun 2022 15:24:54 +0100 Subject: [PATCH 2/2] Bundler can't parse multiple exports per module --- render/domFor.js | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/render/domFor.js b/render/domFor.js index f01c1e2b9..705a510b0 100644 --- a/render/domFor.js +++ b/render/domFor.js @@ -1,18 +1,22 @@ "use strict" var delayedRemoval = new WeakMap -module.exports.delayedRemoval = delayedRemoval -module.exports.domFor = function *domFor({dom, domSize}, {generation} = {}) { +function *domFor({dom, domSize}, {generation} = {}) { if (dom != null) do { const {nextSibling} = dom - + if (delayedRemoval.get(dom) === generation) { yield dom domSize-- } - + dom = nextSibling } while (domSize) } + +module.exports = { + delayedRemoval: delayedRemoval, + domFor: domFor, +} \ No newline at end of file