Kaynağa Gözat

fix: directives shorthand normalize error (#12744)

fix #12743
JuniorTour 3 yıl önce
ebeveyn
işleme
2263948c24

+ 9 - 1
src/core/vdom/modules/directives.ts

@@ -103,7 +103,15 @@ function normalizeDirectives(
     }
     res[getRawDirName(dir)] = dir
     if (vm._setupState && vm._setupState.__sfc) {
-      dir.def = dir.def || resolveAsset(vm, '_setupState', 'v-' + dir.name)
+      const setupDef = dir.def || resolveAsset(vm, '_setupState', 'v-' + dir.name)
+      if (typeof setupDef === 'function') {
+        dir.def = {
+          bind: setupDef,
+          update: setupDef,
+        }
+      } else {
+        dir.def = setupDef
+      }
     }
     dir.def = dir.def || resolveAsset(vm.$options, 'directives', dir.name, true)
   }

+ 13 - 0
test/unit/features/v3/apiSetup.spec.ts

@@ -251,6 +251,19 @@ describe('api: setup context', () => {
     expect(spy).toHaveBeenCalled()
   })
 
+  // #12743
+  it('directive resolution for shorthand', () => {
+    const spy = vi.fn()
+    new Vue({
+      setup: () => ({
+        __sfc: true,
+        vDir: spy
+      }),
+      template: `<div v-dir />`
+    }).$mount()
+    expect(spy).toHaveBeenCalled()
+  })
+  
   // #12561
   it('setup props should be reactive', () => {
     const msg = ref('hi')