1
- import { ComponentPublicInstance , nextTick } from 'vue'
1
+ import { ComponentPublicInstance , nextTick , App , render } from 'vue'
2
2
import { ShapeFlags } from '@vue/shared'
3
3
4
4
import { DOMWrapper } from './dom-wrapper'
@@ -14,12 +14,15 @@ export class VueWrapper<T extends ComponentPublicInstance>
14
14
implements WrapperAPI {
15
15
private componentVM : T
16
16
private rootVM : ComponentPublicInstance
17
+ private __app : App | null
17
18
private __setProps : ( props : Record < string , any > ) => void
18
19
19
20
constructor (
21
+ app : App | null ,
20
22
vm : ComponentPublicInstance ,
21
23
setProps ?: ( props : Record < string , any > ) => void
22
24
) {
25
+ this . __app = app
23
26
this . rootVM = vm . $root
24
27
this . componentVM = vm as T
25
28
this . __setProps = setProps
@@ -96,15 +99,15 @@ export class VueWrapper<T extends ComponentPublicInstance>
96
99
97
100
findComponent ( selector : FindComponentSelector ) : VueWrapper < T > | ErrorWrapper {
98
101
if ( typeof selector === 'object' && 'ref' in selector ) {
99
- return createWrapper ( this . vm . $refs [ selector . ref ] as T )
102
+ return createWrapper ( null , this . vm . $refs [ selector . ref ] as T )
100
103
}
101
104
const result = find ( this . vm . $ . subTree , selector )
102
105
if ( ! result . length ) return new ErrorWrapper ( { selector } )
103
- return createWrapper ( result [ 0 ] )
106
+ return createWrapper ( null , result [ 0 ] )
104
107
}
105
108
106
109
findAllComponents ( selector : FindAllComponentsSelector ) : VueWrapper < T > [ ] {
107
- return find ( this . vm . $ . subTree , selector ) . map ( ( c ) => createWrapper ( c ) )
110
+ return find ( this . vm . $ . subTree , selector ) . map ( ( c ) => createWrapper ( null , c ) )
108
111
}
109
112
110
113
findAll < T extends Element > ( selector : string ) : DOMWrapper < T > [ ] {
@@ -125,11 +128,26 @@ export class VueWrapper<T extends ComponentPublicInstance>
125
128
const rootElementWrapper = new DOMWrapper ( this . element )
126
129
return rootElementWrapper . trigger ( eventString )
127
130
}
131
+
132
+ unmount ( ) {
133
+ // preventing dispose of child component
134
+ if ( ! this . __app ) {
135
+ throw new Error (
136
+ `wrapper.unmount() can only be called by the root wrapper`
137
+ )
138
+ }
139
+
140
+ if ( this . parentElement ) {
141
+ this . parentElement . removeChild ( this . element )
142
+ }
143
+ this . __app . unmount ( this . element )
144
+ }
128
145
}
129
146
130
147
export function createWrapper < T extends ComponentPublicInstance > (
148
+ app : App ,
131
149
vm : ComponentPublicInstance ,
132
150
setProps ?: ( props : Record < string , any > ) => void
133
151
) : VueWrapper < T > {
134
- return new VueWrapper < T > ( vm , setProps )
152
+ return new VueWrapper < T > ( app , vm , setProps )
135
153
}
0 commit comments