Skip to content

Commit 15e20a6

Browse files
authored
Merge pull request #7574 from QwikDev/v2-track-infinity-loop
fix: infinity loop while tracking element ref
2 parents e24338a + 8fbbe3e commit 15e20a6

File tree

4 files changed

+40
-1
lines changed

4 files changed

+40
-1
lines changed

.changeset/cold-moons-follow.md

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'@qwik.dev/core': patch
3+
---
4+
5+
fix: infinity loop while tracking element ref

packages/qwik/src/core/tests/ref.spec.tsx

+32
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
import {
22
Fragment as Component,
3+
Fragment as Signal,
34
component$,
45
createContextId,
56
useContext,
67
useContextProvider,
78
useSignal,
89
useStore,
10+
useTask$,
911
useVisibleTask$,
1012
} from '@qwik.dev/core';
1113
import { domRender, ssrRenderToDom, trigger } from '@qwik.dev/core/testing';
@@ -232,4 +234,34 @@ describe.each([
232234
</Component>
233235
);
234236
});
237+
238+
it('should track element ref', async () => {
239+
const Cmp = component$(() => {
240+
const element = useSignal<HTMLDivElement>();
241+
const signal = useSignal(0);
242+
243+
useTask$(({ track }) => {
244+
track(element);
245+
signal.value++;
246+
});
247+
248+
return (
249+
<div>
250+
<div ref={element}>Test</div>
251+
{signal.value}
252+
</div>
253+
);
254+
});
255+
256+
const { vNode } = await render(<Cmp />, { debug });
257+
258+
expect(vNode).toMatchVDOM(
259+
<Component>
260+
<div>
261+
<div>Test</div>
262+
<Signal>1</Signal>
263+
</div>
264+
</Component>
265+
);
266+
});
235267
});

packages/qwik/src/server/qwik-types.ts

+1
Original file line numberDiff line numberDiff line change
@@ -32,3 +32,4 @@ export type {
3232
export type { ResolvedManifest, SymbolMapper } from '../optimizer/src/types';
3333
export type { SymbolToChunkResolver } from '../core/ssr/ssr-types';
3434
export type { NodePropData } from '../core/reactive-primitives/subscription-data';
35+
export type { SignalImpl } from '../core/reactive-primitives/impl/signal-impl';

packages/qwik/src/server/ssr-container.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ import {
6262
type JSXOutput,
6363
type QRLInternal,
6464
type SerializationContext,
65+
type SignalImpl,
6566
type SsrAttrKey,
6667
type SsrAttrValue,
6768
type SsrAttrs,
@@ -1150,7 +1151,7 @@ class SSRContainer extends _SharedContainer implements ISSRContainer {
11501151
if (key === 'ref') {
11511152
const lastNode = this.getLastNode();
11521153
if (isSignal(value)) {
1153-
value.value = new DomRef(lastNode);
1154+
(value as SignalImpl<unknown>).$untrackedValue$ = new DomRef(lastNode);
11541155
continue;
11551156
} else if (typeof value === 'function') {
11561157
value(new DomRef(lastNode));

0 commit comments

Comments
 (0)