|
|
@@ -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('<div>22</div>')
|
|
|
+ expect(renderSpy).toHaveBeenCalledTimes(2)
|
|
|
+ })
|
|
|
+
|
|
|
describe('empty dep cleanup', () => {
|
|
|
it('should remove the dep when the effect is stopped', () => {
|
|
|
const obj = reactive({ prop: 1 })
|