Skip to content

Commit 364937f

Browse files
committed
fix: diffing text node and virtual
1 parent 5f1c26b commit 364937f

File tree

4 files changed

+26
-11
lines changed

4 files changed

+26
-11
lines changed

packages/qwik/src/core/client/vnode-diff.ts

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1163,11 +1163,8 @@ export const vnode_diff = (
11631163
function expectVirtual(type: VirtualType, jsxKey: string | null) {
11641164
const checkKey = type === VirtualType.Fragment;
11651165
const currentKey = getKey(vCurrent);
1166-
const isSameNode =
1167-
vCurrent &&
1168-
vnode_isVirtualVNode(vCurrent) &&
1169-
currentKey === jsxKey &&
1170-
(checkKey ? !!jsxKey : true);
1166+
const currentIsVirtual = vCurrent && vnode_isVirtualVNode(vCurrent);
1167+
const isSameNode = currentIsVirtual && currentKey === jsxKey && (checkKey ? !!jsxKey : true);
11711168

11721169
if (isSameNode) {
11731170
// All is good.
@@ -1186,7 +1183,7 @@ export const vnode_diff = (
11861183
isDev && (vNewNode as VirtualVNode).setProp(DEBUG_TYPE, type);
11871184
};
11881185
// For fragments without a key, always create a new virtual node (ensures rerender semantics)
1189-
if (checkKey && jsxKey === null) {
1186+
if (jsxKey === null) {
11901187
createNew();
11911188
return;
11921189
}

packages/qwik/src/core/client/vnode-diff.unit.tsx

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { Fragment, _fnSignal, _jsxSorted, component$ } from '@qwik.dev/core';
1+
import { Fragment, _fnSignal, _jsxSorted, component$, type JSXOutput } from '@qwik.dev/core';
22
import { vnode_fromJSX } from '@qwik.dev/core/testing';
33
import { describe, expect, it } from 'vitest';
44
import type { SignalImpl } from '../reactive-primitives/impl/signal-impl';
@@ -534,6 +534,19 @@ describe('vNode-diff', () => {
534534
expect(vNode).toMatchVDOM(test);
535535
expect(fragment).not.toBe(vnode_getFirstChild(vNode!));
536536
});
537+
538+
it('should render fragment if only text was available', async () => {
539+
const { vParent, container } = vnode_fromJSX('1');
540+
const test = Promise.resolve('2') as unknown as JSXOutput; //_jsxSorted(Fragment, {}, null, ['1'], 0, null);
541+
542+
await vnode_diff(container, test, vParent, null);
543+
vnode_applyJournal(container.$journal$);
544+
expect(vParent).toMatchVDOM(
545+
<body>
546+
<Fragment>2</Fragment>
547+
</body>
548+
);
549+
});
537550
});
538551
describe('attributes', () => {
539552
describe('const props', () => {

packages/qwik/src/core/tests/use-visible-task.spec.tsx

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import {
44
createContextId,
55
Fragment,
66
Fragment as Projection,
7+
Fragment as Awaited,
78
Fragment as Signal,
89
type Signal as SignalType,
910
Slot,
@@ -728,9 +729,9 @@ describe.each([
728729
<Component ssr-required>
729730
<p>
730731
Should have a number: "
731-
<Fragment ssr-required>
732-
<Signal ssr-required>{'2'}</Signal>
733-
</Fragment>
732+
<Signal ssr-required>
733+
<Awaited ssr-required>{'2'}</Awaited>
734+
</Signal>
734735
"
735736
</p>
736737
</Component>

packages/qwik/src/testing/vdom-diff.unit-util.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import type {
1212
JSXNodeInternal,
1313
ClientContainer,
1414
} from '@qwik.dev/core/internal';
15-
import { expect, vi } from 'vitest';
15+
import { expect } from 'vitest';
1616
import {
1717
vnode_applyJournal,
1818
vnode_getAttrKeys,
@@ -420,6 +420,10 @@ export function walkJSX(
420420
processChild(jsx.children);
421421
}
422422
apply.leave(jsx);
423+
} else if (typeof jsx === 'string') {
424+
apply.text(jsx);
425+
} else if (typeof jsx === 'number') {
426+
apply.text(String(jsx));
423427
} else {
424428
throw new Error('unsupported: ' + jsx);
425429
}

0 commit comments

Comments
 (0)