Skip to content

Commit 11044cb

Browse files
committed
[fix] Same VNode shouldn't share DOM nodes (fix #4)
1 parent 067b11e commit 11044cb

File tree

3 files changed

+17
-7
lines changed

3 files changed

+17
-7
lines changed

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "dom-renderer",
3-
"version": "2.4.3",
3+
"version": "2.4.4",
44
"license": "LGPL-3.0-or-later",
55
"author": "[email protected]",
66
"description": "A light-weight DOM Renderer supports Web components standard & TypeScript language",

source/dist/DOMRenderer.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,7 @@ export class DOMRenderer {
122122
for (const { ref, node } of newList) ref?.(node);
123123
}
124124

125-
handleCustomEvent(node: EventTarget, event: string) {
125+
protected handleCustomEvent(node: EventTarget, event: string) {
126126
var handler: EventListener;
127127

128128
Object.defineProperty(node, `on${event}`, {
@@ -176,7 +176,7 @@ export class DOMRenderer {
176176
this.updateChildren(
177177
oldVNode.node as ParentNode,
178178
oldVNode.children || [],
179-
newVNode.children || []
179+
(newVNode.children = newVNode.children?.map(vNode => new VNode(vNode)) || [])
180180
);
181181
newVNode.node = oldVNode.node;
182182

test/jsx-runtime.spec.tsx

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -144,15 +144,25 @@ describe('JSX runtime', () => {
144144
});
145145

146146
it('should not share a real DOM with the same VDOM', () => {
147-
const sameVDOM = <a />;
147+
const oldVDOM = <a>old</a>;
148148

149149
renderer.render(
150150
<>
151-
<nav>{sameVDOM}</nav>
152-
<nav>{sameVDOM}</nav>
151+
<nav>{oldVDOM}</nav>
152+
<nav>{oldVDOM}</nav>
153153
</>
154154
);
155-
expect(document.body.innerHTML).toBe('<nav><a></a></nav><nav><a></a></nav>');
155+
expect(document.body.innerHTML).toBe('<nav><a>old</a></nav><nav><a>old</a></nav>');
156+
157+
const newVDOM = <a>new</a>;
158+
159+
renderer.render(
160+
<>
161+
<nav>{newVDOM}</nav>
162+
<nav>{newVDOM}</nav>
163+
</>
164+
);
165+
expect(document.body.innerHTML).toBe('<nav><a>new</a></nav><nav><a>new</a></nav>');
156166
});
157167

158168
it('should handle Nested children arrays', () => {

0 commit comments

Comments
 (0)