DirectiveHook,
VNode,
DirectiveBinding,
- nextTick
+ nextTick,
+ defineComponent
} from '@vue/runtime-test'
import { currentInstance, ComponentInternalInstance } from '../src/component'
expect(beforeUpdate).toHaveBeenCalledTimes(1)
expect(count.value).toBe(1)
})
+
+ test('should receive exposeProxy for closed instances', async () => {
+ let res: string
+ const App = defineComponent({
+ setup(_, { expose }) {
+ expose({
+ msg: 'Test'
+ })
+
+ return () =>
+ withDirectives(h('p', 'Lore Ipsum'), [
+ [
+ {
+ mounted(el, { instance }) {
+ res = (instance as any).msg as string
+ }
+ }
+ ]
+ ])
+ }
+ })
+ const root = nodeOps.createElement('div')
+ render(h(App), root)
+ expect(res!).toBe('Test')
+ })
})
import { VNode } from './vnode'
import { isFunction, EMPTY_OBJ, isBuiltInDirective } from '@vue/shared'
import { warn } from './warning'
-import { ComponentInternalInstance, Data } from './component'
+import { ComponentInternalInstance, Data, getExposeProxy } from './component'
import { currentRenderingInstance } from './componentRenderContext'
import { callWithAsyncErrorHandling, ErrorCodes } from './errorHandling'
import { ComponentPublicInstance } from './componentPublicInstance'
__DEV__ && warn(`withDirectives can only be used inside render functions.`)
return vnode
}
- const instance = internalInstance.proxy
+ const instance =
+ (getExposeProxy(internalInstance) as ComponentPublicInstance) ||
+ internalInstance.proxy
const bindings: DirectiveBinding[] = vnode.dirs || (vnode.dirs = [])
for (let i = 0; i < directives.length; i++) {
let [dir, value, arg, modifiers = EMPTY_OBJ] = directives[i]