diff --git a/packages/reactivity/__tests__/computed.spec.ts b/packages/reactivity/__tests__/computed.spec.ts index e0b47cf56eb..543c9c6e770 100644 --- a/packages/reactivity/__tests__/computed.spec.ts +++ b/packages/reactivity/__tests__/computed.spec.ts @@ -23,6 +23,7 @@ import { ref, shallowRef, toRaw, + triggerRef, } from '../src' import { EffectFlags, pauseTracking, resetTracking } from '../src/effect' import type { ComputedRef, ComputedRefImpl } from '../src/computed' @@ -1004,4 +1005,10 @@ describe('reactivity/computed', () => { await nextTick() expect(serializeInner(root)).toBe(`
Step 2
`) }) + + it('manual trigger computed', () => { + const cValue = computed(() => 1) + triggerRef(cValue) + expect(cValue.value).toBe(1) + }) }) diff --git a/packages/reactivity/src/effect.ts b/packages/reactivity/src/effect.ts index 0c05e060755..c5528a9df40 100644 --- a/packages/reactivity/src/effect.ts +++ b/packages/reactivity/src/effect.ts @@ -351,7 +351,12 @@ export function refreshComputed(computed: ComputedRefImpl): undefined { // and therefore tracks no deps, thus we cannot rely on the dirty check. // Instead, computed always re-evaluate and relies on the globalVersion // fast path above for caching. - if (dep.version > 0 && !computed.isSSR && !isDirty(computed)) { + if ( + dep.version > 0 && + !computed.isSSR && + computed.deps && + !isDirty(computed) + ) { computed.flags &= ~EffectFlags.RUNNING return }