@@ -456,6 +456,78 @@ describe('reactivity/computed', () => {
456
456
expect ( fnSpy ) . toBeCalledTimes ( 2 )
457
457
} )
458
458
459
+ it ( 'should mark dirty as MaybeDirty_ComputedSideEffect_Origin' , ( ) => {
460
+ const v = ref ( 1 )
461
+ const c = computed ( ( ) => {
462
+ v . value += 1
463
+ return v . value
464
+ } )
465
+
466
+ c . value
467
+ expect ( c . effect . _dirtyLevel ) . toBe (
468
+ DirtyLevels . MaybeDirty_ComputedSideEffect_Origin ,
469
+ )
470
+ expect ( COMPUTED_SIDE_EFFECT_WARN ) . toHaveBeenWarned ( )
471
+ } )
472
+
473
+ it ( 'should not infinite re-run effect when effect access original side effect computed' , async ( ) => {
474
+ const spy = vi . fn ( )
475
+ const v = ref ( 0 )
476
+ const c = computed ( ( ) => {
477
+ v . value += 1
478
+ return v . value
479
+ } )
480
+ const Comp = {
481
+ setup : ( ) => {
482
+ return ( ) => {
483
+ spy ( )
484
+ return v . value + c . value
485
+ }
486
+ } ,
487
+ }
488
+ const root = nodeOps . createElement ( 'div' )
489
+
490
+ render ( h ( Comp ) , root )
491
+ expect ( spy ) . toBeCalledTimes ( 1 )
492
+ await nextTick ( )
493
+ expect ( c . effect . _dirtyLevel ) . toBe (
494
+ DirtyLevels . MaybeDirty_ComputedSideEffect_Origin ,
495
+ )
496
+ expect ( serializeInner ( root ) ) . toBe ( '2' )
497
+ expect ( COMPUTED_SIDE_EFFECT_WARN ) . toHaveBeenWarned ( )
498
+ } )
499
+
500
+ it ( 'should not infinite re-run effect when effect access chained side effect computed' , async ( ) => {
501
+ const spy = vi . fn ( )
502
+ const v = ref ( 0 )
503
+ const c1 = computed ( ( ) => {
504
+ v . value += 1
505
+ return v . value
506
+ } )
507
+ const c2 = computed ( ( ) => v . value + c1 . value )
508
+ const Comp = {
509
+ setup : ( ) => {
510
+ return ( ) => {
511
+ spy ( )
512
+ return v . value + c1 . value + c2 . value
513
+ }
514
+ } ,
515
+ }
516
+ const root = nodeOps . createElement ( 'div' )
517
+
518
+ render ( h ( Comp ) , root )
519
+ expect ( spy ) . toBeCalledTimes ( 1 )
520
+ await nextTick ( )
521
+ expect ( c1 . effect . _dirtyLevel ) . toBe (
522
+ DirtyLevels . MaybeDirty_ComputedSideEffect_Origin ,
523
+ )
524
+ expect ( c2 . effect . _dirtyLevel ) . toBe (
525
+ DirtyLevels . MaybeDirty_ComputedSideEffect ,
526
+ )
527
+ expect ( serializeInner ( root ) ) . toBe ( '4' )
528
+ expect ( COMPUTED_SIDE_EFFECT_WARN ) . toHaveBeenWarned ( )
529
+ } )
530
+
459
531
it ( 'should chained recurse effects clear dirty after trigger' , ( ) => {
460
532
const v = ref ( 1 )
461
533
const c1 = computed ( ( ) => v . value )
@@ -482,7 +554,9 @@ describe('reactivity/computed', () => {
482
554
483
555
c3 . value
484
556
485
- expect ( c1 . effect . _dirtyLevel ) . toBe ( DirtyLevels . Dirty )
557
+ expect ( c1 . effect . _dirtyLevel ) . toBe (
558
+ DirtyLevels . MaybeDirty_ComputedSideEffect_Origin ,
559
+ )
486
560
expect ( c2 . effect . _dirtyLevel ) . toBe (
487
561
DirtyLevels . MaybeDirty_ComputedSideEffect ,
488
562
)
@@ -502,7 +576,9 @@ describe('reactivity/computed', () => {
502
576
} )
503
577
const c2 = computed ( ( ) => v . value + c1 . value )
504
578
expect ( c2 . value ) . toBe ( '0foo' )
505
- expect ( c2 . effect . _dirtyLevel ) . toBe ( DirtyLevels . Dirty )
579
+ expect ( c2 . effect . _dirtyLevel ) . toBe (
580
+ DirtyLevels . MaybeDirty_ComputedSideEffect ,
581
+ )
506
582
expect ( c2 . value ) . toBe ( '1foo' )
507
583
expect ( COMPUTED_SIDE_EFFECT_WARN ) . toHaveBeenWarned ( )
508
584
} )
@@ -523,8 +599,12 @@ describe('reactivity/computed', () => {
523
599
c2 . value
524
600
} )
525
601
expect ( fnSpy ) . toBeCalledTimes ( 1 )
526
- expect ( c1 . effect . _dirtyLevel ) . toBe ( DirtyLevels . Dirty )
527
- expect ( c2 . effect . _dirtyLevel ) . toBe ( DirtyLevels . Dirty )
602
+ expect ( c1 . effect . _dirtyLevel ) . toBe (
603
+ DirtyLevels . MaybeDirty_ComputedSideEffect_Origin ,
604
+ )
605
+ expect ( c2 . effect . _dirtyLevel ) . toBe (
606
+ DirtyLevels . MaybeDirty_ComputedSideEffect ,
607
+ )
528
608
v . value = 2
529
609
expect ( fnSpy ) . toBeCalledTimes ( 2 )
530
610
expect ( COMPUTED_SIDE_EFFECT_WARN ) . toHaveBeenWarned ( )
@@ -557,7 +637,9 @@ describe('reactivity/computed', () => {
557
637
expect ( c3 . effect . _dirtyLevel ) . toBe ( DirtyLevels . MaybeDirty )
558
638
559
639
c3 . value
560
- expect ( c1 . effect . _dirtyLevel ) . toBe ( DirtyLevels . Dirty )
640
+ expect ( c1 . effect . _dirtyLevel ) . toBe (
641
+ DirtyLevels . MaybeDirty_ComputedSideEffect_Origin ,
642
+ )
561
643
expect ( c2 . effect . _dirtyLevel ) . toBe (
562
644
DirtyLevels . MaybeDirty_ComputedSideEffect ,
563
645
)
@@ -611,11 +693,18 @@ describe('reactivity/computed', () => {
611
693
612
694
render ( h ( Comp ) , root )
613
695
await nextTick ( )
696
+ expect ( c . effect . _dirtyLevel ) . toBe (
697
+ DirtyLevels . MaybeDirty_ComputedSideEffect_Origin ,
698
+ )
614
699
expect ( serializeInner ( root ) ) . toBe ( 'Hello World' )
615
700
616
701
v . value += ' World'
702
+ expect ( c . effect . _dirtyLevel ) . toBe ( DirtyLevels . Dirty )
617
703
await nextTick ( )
618
- expect ( serializeInner ( root ) ) . toBe ( 'Hello World World World World' )
704
+ expect ( c . effect . _dirtyLevel ) . toBe (
705
+ DirtyLevels . MaybeDirty_ComputedSideEffect_Origin ,
706
+ )
707
+ expect ( serializeInner ( root ) ) . toBe ( 'Hello World World World' )
619
708
expect ( COMPUTED_SIDE_EFFECT_WARN ) . toHaveBeenWarned ( )
620
709
} )
621
710
0 commit comments