Skip to content

Commit 6e29af3

Browse files
committed
fix: change implementation to vNode field on element
1 parent 6d1345f commit 6e29af3

File tree

4 files changed

+19
-8
lines changed

4 files changed

+19
-8
lines changed

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -741,11 +741,13 @@ export const vnode_diff = (
741741
}
742742
const vNode = (vNewNode || vCurrent) as ElementVNode;
743743

744+
const element = vNode[ElementVNodeProps.element] as QElement;
745+
element.vNode = new WeakRef(vNode);
746+
744747
needsQDispatchEventPatch =
745748
setBulkProps(vNode, jsxAttrs, currentFile) || needsQDispatchEventPatch;
746749
if (needsQDispatchEventPatch) {
747750
// Event handler needs to be patched onto the element.
748-
const element = vNode[ElementVNodeProps.element] as QElement;
749751
if (!element.qDispatchEvent) {
750752
element.qDispatchEvent = (event: Event, scope: QwikLoaderEventScope) => {
751753
const eventName = event.type;

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

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,13 @@ import { isDev } from '@qwik.dev/core/build';
121121
import { qwikDebugToString } from '../debug';
122122
import { assertDefined, assertEqual, assertFalse, assertTrue } from '../shared/error/assert';
123123
import { QError, qError } from '../shared/error/error';
124-
import { DEBUG_TYPE, QContainerValue, VirtualType, VirtualTypeName } from '../shared/types';
124+
import {
125+
DEBUG_TYPE,
126+
QContainerValue,
127+
VirtualType,
128+
VirtualTypeName,
129+
type QElement,
130+
} from '../shared/types';
125131
import { isText } from '../shared/utils/element';
126132
import {
127133
dangerouslySetInnerHTML,
@@ -210,6 +216,7 @@ export const vnode_newElement = (element: Element, elementName: string): Element
210216
assertTrue(vnode_isElementVNode(vnode), 'Incorrect format of ElementVNode.');
211217
assertFalse(vnode_isTextVNode(vnode), 'Incorrect format of ElementVNode.');
212218
assertFalse(vnode_isVirtualVNode(vnode), 'Incorrect format of ElementVNode.');
219+
(element as QElement).vNode = new WeakRef(vnode);
213220
return vnode;
214221
};
215222

@@ -228,6 +235,7 @@ export const vnode_newUnMaterializedElement = (element: Element): ElementVNode =
228235
assertTrue(vnode_isElementVNode(vnode), 'Incorrect format of ElementVNode.');
229236
assertFalse(vnode_isTextVNode(vnode), 'Incorrect format of ElementVNode.');
230237
assertFalse(vnode_isVirtualVNode(vnode), 'Incorrect format of ElementVNode.');
238+
(element as QElement).vNode = new WeakRef(vnode);
231239
return vnode;
232240
};
233241

@@ -670,6 +678,11 @@ export const vnode_locate = (rootVNode: ElementVNode, id: string | Element): VNo
670678
refElement = qVNodeRefs.get(elementOffset)!;
671679
} else {
672680
refElement = id;
681+
682+
const vNode = (refElement as QElement).vNode?.deref();
683+
if (vNode) {
684+
return vNode;
685+
}
673686
}
674687
assertDefined(refElement, 'Missing refElement.');
675688
if (!vnode_isVNode(refElement)) {

packages/qwik/src/core/shared/types.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ export type HostElement = VNode | ISsrNode;
5656

5757
export interface QElement extends HTMLElement {
5858
qDispatchEvent?: (event: Event, scope: QwikLoaderEventScope) => boolean;
59+
vNode?: WeakRef<VNode>;
5960
}
6061

6162
export type qWindow = Window & {

packages/qwik/src/core/use/use-core.ts

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -146,12 +146,7 @@ export function invokeApply<FN extends (...args: any) => any>(
146146

147147
export const newInvokeContextFromTuple = ([element, event, url]: InvokeTuple) => {
148148
const domContainer = getDomContainer(element);
149-
let hostElement: HostElement | undefined = undefined;
150-
try {
151-
hostElement = vnode_locate(domContainer.rootVNode, element);
152-
} catch (_) {
153-
// ignore
154-
}
149+
const hostElement = vnode_locate(domContainer.rootVNode, element);
155150
const locale = domContainer.$locale$;
156151
locale && setLocale(locale);
157152
return newInvokeContext(locale, hostElement, element, event, url);

0 commit comments

Comments
 (0)