From d089f23943f3db1868ff6b6ed480157dd8f8222e Mon Sep 17 00:00:00 2001 From: teleskop150750 Date: Tue, 6 May 2025 13:31:01 +0300 Subject: [PATCH] feat: untrack --- packages/reactivity/__tests__/effect.spec.ts | 12 ++++++++++++ packages/reactivity/src/effect.ts | 9 +++++++++ 2 files changed, 21 insertions(+) diff --git a/packages/reactivity/__tests__/effect.spec.ts b/packages/reactivity/__tests__/effect.spec.ts index 242fc7071..63e93de9a 100644 --- a/packages/reactivity/__tests__/effect.spec.ts +++ b/packages/reactivity/__tests__/effect.spec.ts @@ -27,6 +27,7 @@ import { pauseTracking, resetTracking, startBatch, + untrack, } from '../src/effect' describe('reactivity/effect', () => { @@ -1182,6 +1183,17 @@ describe('reactivity/effect', () => { expect(spy2).toHaveBeenCalledTimes(2) }) + it('should not track dependencies when using untrack', () => { + const value = ref(1) + let dummy + effect(() => { + dummy = untrack(() => value.value) + }) + expect(dummy).toBe(1) + value.value = 2 + expect(dummy).toBe(1) + }) + describe('dep unsubscribe', () => { function getSubCount(dep: Dep | undefined) { let count = 0 diff --git a/packages/reactivity/src/effect.ts b/packages/reactivity/src/effect.ts index 84cf184c1..1c6e6cb84 100644 --- a/packages/reactivity/src/effect.ts +++ b/packages/reactivity/src/effect.ts @@ -537,6 +537,15 @@ export function resetTracking(): void { shouldTrack = last === undefined ? true : last } +export function untrack(fn: () => T): T { + try { + pauseTracking() + return fn() + } finally { + resetTracking() + } +} + /** * Registers a cleanup function for the current active effect. * The cleanup function is called right before the next effect run, or when the