@@ -26,7 +26,14 @@ import {
2626 watch ,
2727 watchEffect ,
2828} from '@vue/runtime-test'
29- import { computed , createApp , defineComponent , inject , provide } from 'vue'
29+ import {
30+ computed ,
31+ createApp ,
32+ defineAsyncComponent as defineAsyncComp ,
33+ defineComponent ,
34+ inject ,
35+ provide ,
36+ } from 'vue'
3037import type { RawSlots } from 'packages/runtime-core/src/componentSlots'
3138import { resetSuspenseId } from '../../src/components/Suspense'
3239import { PatchFlags } from '@vue/shared'
@@ -2166,12 +2173,12 @@ describe('Suspense', () => {
21662173 } )
21672174
21682175 // #12920
2169- test ( 'unmount Suspense after children self-update' , async ( ) => {
2170- const Comp = defineAsyncComponent ( {
2176+ test ( 'unmount Suspense after async child (with defineAsyncComponent) self-triggered update' , async ( ) => {
2177+ const Comp = defineComponent ( {
21712178 setup ( ) {
21722179 const show = ref ( true )
21732180 onMounted ( ( ) => {
2174- // trigger self- update
2181+ // trigger update
21752182 show . value = ! show . value
21762183 } )
21772184 return ( ) =>
@@ -2181,6 +2188,77 @@ describe('Suspense', () => {
21812188 } ,
21822189 } )
21832190
2191+ const AsyncComp = defineAsyncComp ( ( ) => {
2192+ const p = new Promise ( resolve => {
2193+ resolve ( Comp )
2194+ } )
2195+ deps . push ( p . then ( ( ) => Promise . resolve ( ) ) )
2196+ return p as any
2197+ } )
2198+
2199+ const toggle = ref ( true )
2200+ const root = nodeOps . createElement ( 'div' )
2201+ const App = {
2202+ render ( ) {
2203+ return (
2204+ openBlock ( ) ,
2205+ createElementBlock (
2206+ Fragment ,
2207+ null ,
2208+ [
2209+ h ( 'h1' , null , toggle . value ) ,
2210+ toggle . value
2211+ ? ( openBlock ( ) ,
2212+ createBlock (
2213+ Suspense ,
2214+ { key : 0 } ,
2215+ {
2216+ default : h ( AsyncComp ) ,
2217+ } ,
2218+ ) )
2219+ : createCommentVNode ( 'v-if' , true ) ,
2220+ ] ,
2221+ PatchFlags . STABLE_FRAGMENT ,
2222+ )
2223+ )
2224+ } ,
2225+ }
2226+ render ( h ( App ) , root )
2227+ expect ( serializeInner ( root ) ) . toBe ( `<h1>true</h1><!---->` )
2228+
2229+ await Promise . all ( deps )
2230+ await nextTick ( )
2231+ await nextTick ( )
2232+ expect ( serializeInner ( root ) ) . toBe ( `<h1>true</h1><div>show</div>` )
2233+
2234+ await nextTick ( )
2235+ expect ( serializeInner ( root ) ) . toBe ( `<h1>true</h1><div>hidden</div>` )
2236+
2237+ // unmount suspense
2238+ toggle . value = false
2239+ await Promise . all ( deps )
2240+ await nextTick ( )
2241+ expect ( serializeInner ( root ) ) . toBe ( `<h1>true</h1><!--v-if-->` )
2242+ } )
2243+
2244+ test ( 'unmount Suspense after async child (with async setup) self-triggered update' , async ( ) => {
2245+ const AsyncComp = defineComponent ( {
2246+ async setup ( ) {
2247+ const show = ref ( true )
2248+ onMounted ( ( ) => {
2249+ // trigger update
2250+ show . value = ! show . value
2251+ } )
2252+ const p = new Promise ( r => setTimeout ( r , 1 ) )
2253+ // extra tick needed for Node 12+
2254+ deps . push ( p . then ( ( ) => Promise . resolve ( ) ) )
2255+ return ( ) =>
2256+ show . value
2257+ ? ( openBlock ( ) , createElementBlock ( 'div' , { key : 0 } , 'show' ) )
2258+ : ( openBlock ( ) , createElementBlock ( 'div' , { key : 1 } , 'hidden' ) )
2259+ } ,
2260+ } )
2261+
21842262 const toggle = ref ( true )
21852263 const root = nodeOps . createElement ( 'div' )
21862264 const App = {
@@ -2198,7 +2276,7 @@ describe('Suspense', () => {
21982276 Suspense ,
21992277 { key : 0 } ,
22002278 {
2201- default : h ( Comp ) ,
2279+ default : h ( AsyncComp ) ,
22022280 } ,
22032281 ) )
22042282 : createCommentVNode ( 'v-if' , true ) ,
0 commit comments