@@ -862,5 +862,89 @@ describe('Component keep-alive', () => {
862862 )
863863 } ) . then ( done )
864864 } )
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+ } )
865949 }
866950} )
0 commit comments