@@ -862,5 +862,89 @@ describe('Component keep-alive', () => {
862
862
)
863
863
} ) . then ( done )
864
864
} )
865
+
866
+ it ( 'async components with transition-mode out-in' , done => {
867
+ const barResolve = jasmine . createSpy ( 'bar resolved' )
868
+ let next
869
+ const foo = ( resolve ) => {
870
+ setTimeout ( ( ) => {
871
+ resolve ( one )
872
+ Vue . nextTick ( next )
873
+ } , duration / 2 )
874
+ }
875
+ const bar = ( resolve ) => {
876
+ setTimeout ( ( ) => {
877
+ resolve ( two )
878
+ barResolve ( )
879
+ } , duration / 2 )
880
+ }
881
+ components = {
882
+ foo,
883
+ bar
884
+ }
885
+ const vm = new Vue ( {
886
+ template : `<div>
887
+ <transition name="test" mode="out-in" @after-enter="afterEnter" @after-leave="afterLeave">
888
+ <keep-alive>
889
+ <component :is="view" class="test"></component>
890
+ </keep-alive>
891
+ </transition>
892
+ </div>` ,
893
+ data : {
894
+ view : 'foo'
895
+ } ,
896
+ components,
897
+ methods : {
898
+ afterEnter ( ) {
899
+ next ( )
900
+ } ,
901
+ afterLeave ( ) {
902
+ next ( )
903
+ }
904
+ }
905
+ } ) . $mount ( el )
906
+ expect ( vm . $el . textContent ) . toBe ( '' )
907
+ next = ( ) => {
908
+ assertHookCalls ( one , [ 1 , 1 , 1 , 0 , 0 ] )
909
+ assertHookCalls ( two , [ 0 , 0 , 0 , 0 , 0 ] )
910
+ waitForUpdate ( ( ) => {
911
+ expect ( vm . $el . innerHTML ) . toBe (
912
+ '<div class="test test-enter test-enter-active">one</div>'
913
+ )
914
+ } ) . thenWaitFor ( nextFrame ) . then ( ( ) => {
915
+ expect ( vm . $el . innerHTML ) . toBe (
916
+ '<div class="test test-enter-active test-enter-to">one</div>'
917
+ )
918
+ } ) . thenWaitFor ( _next => { next = _next } ) . then ( ( ) => {
919
+ // foo afterEnter get called
920
+ expect ( vm . $el . innerHTML ) . toBe ( '<div class="test">one</div>' )
921
+ vm . view = 'bar'
922
+ } ) . thenWaitFor ( nextFrame ) . then ( ( ) => {
923
+ assertHookCalls ( one , [ 1 , 1 , 1 , 1 , 0 ] )
924
+ assertHookCalls ( two , [ 0 , 0 , 0 , 0 , 0 ] )
925
+ expect ( vm . $el . innerHTML ) . toBe (
926
+ '<div class="test test-leave-active test-leave-to">one</div><!---->'
927
+ )
928
+ } ) . thenWaitFor ( _next => { next = _next } ) . then ( ( ) => {
929
+ // foo afterLeave get called
930
+ // and bar has already been resolved before afterLeave get called
931
+ expect ( barResolve . calls . count ( ) ) . toBe ( 1 )
932
+ expect ( vm . $el . innerHTML ) . toBe ( '<!---->' )
933
+ } ) . thenWaitFor ( nextFrame ) . then ( ( ) => {
934
+ expect ( vm . $el . innerHTML ) . toBe (
935
+ '<div class="test test-enter test-enter-active">two</div>'
936
+ )
937
+ assertHookCalls ( one , [ 1 , 1 , 1 , 1 , 0 ] )
938
+ assertHookCalls ( two , [ 1 , 1 , 1 , 0 , 0 ] )
939
+ } ) . thenWaitFor ( nextFrame ) . then ( ( ) => {
940
+ expect ( vm . $el . innerHTML ) . toBe (
941
+ '<div class="test test-enter-active test-enter-to">two</div>'
942
+ )
943
+ } ) . thenWaitFor ( _next => { next = _next } ) . then ( ( ) => {
944
+ // bar afterEnter get called
945
+ expect ( vm . $el . innerHTML ) . toBe ( '<div class="test">two</div>' )
946
+ } ) . then ( done )
947
+ }
948
+ } )
865
949
}
866
950
} )
0 commit comments