From 8d042050411fdf04d9d1d6c153287164b12e0255 Mon Sep 17 00:00:00 2001 From: Doctorwu <44631608+Doctor-wu@users.noreply.github.com> Date: Fri, 12 Jan 2024 21:13:17 +0800 Subject: [PATCH] fix(reactivity): correct dirty assign in render function (#10091) close #10082 --- packages/reactivity/__tests__/effect.spec.ts | 32 ++++++++++++++++++++ packages/reactivity/src/effect.ts | 4 ++- 2 files changed, 35 insertions(+), 1 deletion(-) diff --git a/packages/reactivity/__tests__/effect.spec.ts b/packages/reactivity/__tests__/effect.spec.ts index 9109177bf49..925d9ed6104 100644 --- a/packages/reactivity/__tests__/effect.spec.ts +++ b/packages/reactivity/__tests__/effect.spec.ts @@ -3,16 +3,19 @@ import { type ReactiveEffectRunner, TrackOpTypes, TriggerOpTypes, + computed, effect, markRaw, reactive, readonly, + ref, shallowReactive, stop, toRaw, } from '../src/index' import { pauseScheduling, resetScheduling } from '../src/effect' import { ITERATE_KEY, getDepFromReactive } from '../src/reactiveEffect' +import { h, nextTick, nodeOps, render, serialize } from '@vue/runtime-test' describe('reactivity/effect', () => { it('should run the passed function once (wrapped by a effect)', () => { @@ -1011,6 +1014,35 @@ describe('reactivity/effect', () => { expect(counterSpy).toHaveBeenCalledTimes(1) }) + // #10082 + it('should set dirtyLevel when effect is allowRecurse and is running', async () => { + const s = ref(0) + const n = computed(() => s.value + 1) + + const Child = { + setup() { + s.value++ + return () => n.value + }, + } + + const renderSpy = vi.fn() + const Parent = { + setup() { + return () => { + renderSpy() + return [n.value, h(Child)] + } + }, + } + + const root = nodeOps.createElement('div') + render(h(Parent), root) + await nextTick() + expect(serialize(root)).toBe('