]> git.ipfire.org Git - thirdparty/vuejs/core.git/commitdiff
fix(runtime-core): ensure custom directive instance properly exposes properties on...
authorThorsten Lünborg <t.luenborg@googlemail.com>
Tue, 12 Apr 2022 07:54:03 +0000 (09:54 +0200)
committerGitHub <noreply@github.com>
Tue, 12 Apr 2022 07:54:03 +0000 (03:54 -0400)
fix #5018

packages/runtime-core/__tests__/directives.spec.ts
packages/runtime-core/src/directives.ts

index 02d24711804773df53c3386024706cfaa7029bfe..c2a183b12ef4a9e0ad02a4e2fbbe6cbc6bb4f891 100644 (file)
@@ -7,7 +7,8 @@ import {
   DirectiveHook,
   VNode,
   DirectiveBinding,
-  nextTick
+  nextTick,
+  defineComponent
 } from '@vue/runtime-test'
 import { currentInstance, ComponentInternalInstance } from '../src/component'
 
@@ -395,4 +396,29 @@ describe('directives', () => {
     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')
+  })
 })
index a3cf81dd0af37520b3f0d4d197c9901ea8a0a942..6f0eb4c2c0abdb463949a1f329694c977d2cdd3a 100644 (file)
@@ -14,7 +14,7 @@ return withDirectives(h(comp), [
 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'
@@ -89,7 +89,9 @@ export function withDirectives<T extends VNode>(
     __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]