@@ -662,7 +662,7 @@ describe('api: defineAsyncComponent', () => {
662
662
} )
663
663
)
664
664
665
- const fooRef = ref ( )
665
+ const fooRef = ref < any > ( null )
666
666
const toggle = ref ( true )
667
667
const root = nodeOps . createElement ( 'div' )
668
668
createApp ( {
@@ -697,4 +697,51 @@ describe('api: defineAsyncComponent', () => {
697
697
expect ( serializeInner ( root ) ) . toBe ( 'resolved' )
698
698
expect ( fooRef . value . id ) . toBe ( 'foo' )
699
699
} )
700
+
701
+ // #3188
702
+ test ( 'the forwarded template ref should always exist when doing multi patching' , async ( ) => {
703
+ let resolve : ( comp : Component ) => void
704
+ const Foo = defineAsyncComponent (
705
+ ( ) =>
706
+ new Promise ( r => {
707
+ resolve = r as any
708
+ } )
709
+ )
710
+
711
+ const fooRef = ref < any > ( null )
712
+ const toggle = ref ( true )
713
+ const updater = ref ( 0 )
714
+
715
+ const root = nodeOps . createElement ( 'div' )
716
+ createApp ( {
717
+ render : ( ) =>
718
+ toggle . value ? [ h ( Foo , { ref : fooRef } ) , updater . value ] : null
719
+ } ) . mount ( root )
720
+
721
+ expect ( serializeInner ( root ) ) . toBe ( '<!---->0' )
722
+ expect ( fooRef . value ) . toBe ( null )
723
+
724
+ resolve ! ( {
725
+ data ( ) {
726
+ return {
727
+ id : 'foo'
728
+ }
729
+ } ,
730
+ render : ( ) => 'resolved'
731
+ } )
732
+
733
+ await timeout ( )
734
+ expect ( serializeInner ( root ) ) . toBe ( 'resolved0' )
735
+ expect ( fooRef . value . id ) . toBe ( 'foo' )
736
+
737
+ updater . value ++
738
+ await nextTick ( )
739
+ expect ( serializeInner ( root ) ) . toBe ( 'resolved1' )
740
+ expect ( fooRef . value . id ) . toBe ( 'foo' )
741
+
742
+ toggle . value = false
743
+ await nextTick ( )
744
+ expect ( serializeInner ( root ) ) . toBe ( '<!---->' )
745
+ expect ( fooRef . value ) . toBe ( null )
746
+ } )
700
747
} )
0 commit comments