@@ -562,6 +562,51 @@ describe('api: options', () => {
562
562
expect ( serializeInner ( root ) ) . toBe ( `<div>1,1,3</div>` )
563
563
} )
564
564
565
+ // #1016
566
+ test ( 'watcher initialization should be deferred in mixins' , async ( ) => {
567
+ const mixin1 = {
568
+ data ( ) {
569
+ return {
570
+ mixin1Data : 'mixin1'
571
+ }
572
+ } ,
573
+ methods : { }
574
+ }
575
+
576
+ const watchSpy = jest . fn ( )
577
+ const mixin2 = {
578
+ watch : {
579
+ mixin3Data : watchSpy
580
+ }
581
+ }
582
+
583
+ const mixin3 = {
584
+ data ( ) {
585
+ return {
586
+ mixin3Data : 'mixin3'
587
+ }
588
+ } ,
589
+ methods : { }
590
+ }
591
+
592
+ let vm : any
593
+ const Comp = {
594
+ mixins : [ mixin1 , mixin2 , mixin3 ] ,
595
+ render ( ) { } ,
596
+ created ( ) {
597
+ vm = this
598
+ }
599
+ }
600
+
601
+ const root = nodeOps . createElement ( 'div' )
602
+ render ( h ( Comp ) , root )
603
+
604
+ // should have no warnings
605
+ vm . mixin3Data = 'hello'
606
+ await nextTick ( )
607
+ expect ( watchSpy . mock . calls [ 0 ] . slice ( 0 , 2 ) ) . toEqual ( [ 'hello' , 'mixin3' ] )
608
+ } )
609
+
565
610
describe ( 'warnings' , ( ) => {
566
611
mockWarn ( )
567
612
@@ -631,53 +676,34 @@ describe('api: options', () => {
631
676
) . toHaveBeenWarned ( )
632
677
} )
633
678
634
- test ( 'data property is already declared in props' , ( ) => {
635
- const Comp = {
636
- props : { foo : Number } ,
637
- data : ( ) => ( {
638
- foo : 1
639
- } ) ,
640
- render ( ) { }
641
- }
642
-
643
- const root = nodeOps . createElement ( 'div' )
644
- render ( h ( Comp ) , root )
645
- expect (
646
- `Data property "foo" is already defined in Props.`
647
- ) . toHaveBeenWarned ( )
648
- } )
649
-
650
- test ( 'computed property is already declared in data' , ( ) => {
679
+ test ( 'inject property is already declared in props' , ( ) => {
651
680
const Comp = {
652
- data : ( ) => ( {
653
- foo : 1
654
- } ) ,
655
- computed : {
656
- foo ( ) { }
681
+ data ( ) {
682
+ return {
683
+ a : 1
684
+ }
657
685
} ,
658
- render ( ) { }
659
- }
660
-
661
- const root = nodeOps . createElement ( 'div' )
662
- render ( h ( Comp ) , root )
663
- expect (
664
- `Computed property "foo" is already defined in Data.`
665
- ) . toHaveBeenWarned ( )
666
- } )
667
-
668
- test ( 'computed property is already declared in props' , ( ) => {
669
- const Comp = {
670
- props : { foo : Number } ,
671
- computed : {
672
- foo ( ) { }
686
+ provide ( ) {
687
+ return {
688
+ a : this . a
689
+ }
673
690
} ,
674
- render ( ) { }
675
- }
691
+ render ( ) {
692
+ return [ h ( ChildA ) ]
693
+ }
694
+ } as any
695
+ const ChildA = {
696
+ props : { a : Number } ,
697
+ inject : [ 'a' ] ,
698
+ render ( ) {
699
+ return this . a
700
+ }
701
+ } as any
676
702
677
703
const root = nodeOps . createElement ( 'div' )
678
704
render ( h ( Comp ) , root )
679
705
expect (
680
- `Computed property "foo " is already defined in Props.`
706
+ `Inject property "a " is already defined in Props.`
681
707
) . toHaveBeenWarned ( )
682
708
} )
683
709
@@ -697,11 +723,11 @@ describe('api: options', () => {
697
723
) . toHaveBeenWarned ( )
698
724
} )
699
725
700
- test ( 'methods property is already declared in data ' , ( ) => {
726
+ test ( 'methods property is already declared in props ' , ( ) => {
701
727
const Comp = {
702
- data : ( ) => ( {
703
- foo : 2
704
- } ) ,
728
+ props : {
729
+ foo : Number
730
+ } ,
705
731
methods : {
706
732
foo ( ) { }
707
733
} ,
@@ -711,50 +737,60 @@ describe('api: options', () => {
711
737
const root = nodeOps . createElement ( 'div' )
712
738
render ( h ( Comp ) , root )
713
739
expect (
714
- `Methods property "foo" is already defined in Data .`
740
+ `Methods property "foo" is already defined in Props .`
715
741
) . toHaveBeenWarned ( )
716
742
} )
717
743
718
- test ( 'methods property is already declared in props ' , ( ) => {
744
+ test ( 'methods property is already declared in inject ' , ( ) => {
719
745
const Comp = {
720
- props : {
721
- foo : Number
746
+ data ( ) {
747
+ return {
748
+ a : 1
749
+ }
750
+ } ,
751
+ provide ( ) {
752
+ return {
753
+ a : this . a
754
+ }
722
755
} ,
756
+ render ( ) {
757
+ return [ h ( ChildA ) ]
758
+ }
759
+ } as any
760
+ const ChildA = {
723
761
methods : {
724
- foo ( ) { }
762
+ a : ( ) => null
725
763
} ,
726
- render ( ) { }
727
- }
764
+ inject : [ 'a' ] ,
765
+ render ( ) {
766
+ return this . a
767
+ }
768
+ } as any
728
769
729
770
const root = nodeOps . createElement ( 'div' )
730
771
render ( h ( Comp ) , root )
731
772
expect (
732
- `Methods property "foo " is already defined in Props .`
773
+ `Methods property "a " is already defined in Inject .`
733
774
) . toHaveBeenWarned ( )
734
775
} )
735
776
736
- test ( 'methods property is already declared in computed ' , ( ) => {
777
+ test ( 'data property is already declared in props ' , ( ) => {
737
778
const Comp = {
738
- computed : {
739
- foo : {
740
- get ( ) { } ,
741
- set ( ) { }
742
- }
743
- } ,
744
- methods : {
745
- foo ( ) { }
746
- } ,
779
+ props : { foo : Number } ,
780
+ data : ( ) => ( {
781
+ foo : 1
782
+ } ) ,
747
783
render ( ) { }
748
784
}
749
785
750
786
const root = nodeOps . createElement ( 'div' )
751
787
render ( h ( Comp ) , root )
752
788
expect (
753
- `Methods property "foo" is already defined in Computed .`
789
+ `Data property "foo" is already defined in Props .`
754
790
) . toHaveBeenWarned ( )
755
791
} )
756
792
757
- test ( 'inject property is already declared in data ' , ( ) => {
793
+ test ( 'data property is already declared in inject ' , ( ) => {
758
794
const Comp = {
759
795
data ( ) {
760
796
return {
@@ -785,42 +821,45 @@ describe('api: options', () => {
785
821
const root = nodeOps . createElement ( 'div' )
786
822
render ( h ( Comp ) , root )
787
823
expect (
788
- `Inject property "a" is already defined in Data .`
824
+ `Data property "a" is already defined in Inject .`
789
825
) . toHaveBeenWarned ( )
790
826
} )
791
827
792
- test ( 'inject property is already declared in props ' , ( ) => {
828
+ test ( 'data property is already declared in methods ' , ( ) => {
793
829
const Comp = {
794
- data ( ) {
795
- return {
796
- a : 1
797
- }
830
+ data : ( ) => ( {
831
+ foo : 1
832
+ } ) ,
833
+ methods : {
834
+ foo ( ) { }
798
835
} ,
799
- provide ( ) {
800
- return {
801
- a : this . a
802
- }
836
+ render ( ) { }
837
+ }
838
+
839
+ const root = nodeOps . createElement ( 'div' )
840
+ render ( h ( Comp ) , root )
841
+ expect (
842
+ `Data property "foo" is already defined in Methods.`
843
+ ) . toHaveBeenWarned ( )
844
+ } )
845
+
846
+ test ( 'computed property is already declared in props' , ( ) => {
847
+ const Comp = {
848
+ props : { foo : Number } ,
849
+ computed : {
850
+ foo ( ) { }
803
851
} ,
804
- render ( ) {
805
- return [ h ( ChildA ) ]
806
- }
807
- } as any
808
- const ChildA = {
809
- props : { a : Number } ,
810
- inject : [ 'a' ] ,
811
- render ( ) {
812
- return this . a
813
- }
814
- } as any
852
+ render ( ) { }
853
+ }
815
854
816
855
const root = nodeOps . createElement ( 'div' )
817
856
render ( h ( Comp ) , root )
818
857
expect (
819
- `Inject property "a " is already defined in Props.`
858
+ `Computed property "foo " is already defined in Props.`
820
859
) . toHaveBeenWarned ( )
821
860
} )
822
861
823
- test ( 'inject property is already declared in computed ' , ( ) => {
862
+ test ( 'computed property is already declared in inject ' , ( ) => {
824
863
const Comp = {
825
864
data ( ) {
826
865
return {
@@ -852,40 +891,43 @@ describe('api: options', () => {
852
891
const root = nodeOps . createElement ( 'div' )
853
892
render ( h ( Comp ) , root )
854
893
expect (
855
- `Inject property "a" is already defined in Computed .`
894
+ `Computed property "a" is already defined in Inject .`
856
895
) . toHaveBeenWarned ( )
857
896
} )
858
897
859
- test ( 'inject property is already declared in methods' , ( ) => {
898
+ test ( 'computed property is already declared in methods' , ( ) => {
860
899
const Comp = {
861
- data ( ) {
862
- return {
863
- a : 1
864
- }
865
- } ,
866
- provide ( ) {
867
- return {
868
- a : this . a
869
- }
900
+ computed : {
901
+ foo ( ) { }
870
902
} ,
871
- render ( ) {
872
- return [ h ( ChildA ) ]
873
- }
874
- } as any
875
- const ChildA = {
876
903
methods : {
877
- a : ( ) => null
904
+ foo ( ) { }
878
905
} ,
879
- inject : [ 'a' ] ,
880
- render ( ) {
881
- return this . a
882
- }
883
- } as any
906
+ render ( ) { }
907
+ }
884
908
885
909
const root = nodeOps . createElement ( 'div' )
886
910
render ( h ( Comp ) , root )
887
911
expect (
888
- `Inject property "a" is already defined in Methods.`
912
+ `Computed property "foo" is already defined in Methods.`
913
+ ) . toHaveBeenWarned ( )
914
+ } )
915
+
916
+ test ( 'computed property is already declared in data' , ( ) => {
917
+ const Comp = {
918
+ data : ( ) => ( {
919
+ foo : 1
920
+ } ) ,
921
+ computed : {
922
+ foo ( ) { }
923
+ } ,
924
+ render ( ) { }
925
+ }
926
+
927
+ const root = nodeOps . createElement ( 'div' )
928
+ render ( h ( Comp ) , root )
929
+ expect (
930
+ `Computed property "foo" is already defined in Data.`
889
931
) . toHaveBeenWarned ( )
890
932
} )
891
933
} )
0 commit comments