]> git.ipfire.org Git - thirdparty/vuejs/core.git/commitdiff
fix(compiler-core/v-on): only apply case preservation on native elements (#6902)
author白雾三语 <32354856+baiwusanyu-c@users.noreply.github.com>
Wed, 9 Nov 2022 02:58:22 +0000 (10:58 +0800)
committerGitHub <noreply@github.com>
Wed, 9 Nov 2022 02:58:22 +0000 (21:58 -0500)
fix #6900

packages/compiler-core/__tests__/transforms/vSlot.spec.ts
packages/compiler-core/src/transforms/vOn.ts

index 93dafe9a25b7dfacab7e016828070aba46364b98..c166f8d160a25e0dc0cc448f08d60a2a7969e48d 100644 (file)
@@ -11,7 +11,8 @@ import {
   VNodeCall,
   SlotsExpression,
   ObjectExpression,
-  SimpleExpressionNode
+  SimpleExpressionNode,
+  RenderSlotCall
 } from '../../src'
 import { transformElement } from '../../src/transforms/transformElement'
 import { transformOn } from '../../src/transforms/vOn'
@@ -788,6 +789,56 @@ describe('compiler: transform component slots', () => {
       const { slots } = parseWithSlots(`<Comp><Comp><slot/></Comp></Comp>`)
       expect(slots).toMatchObject(toMatch)
     })
+
+    // # fix: #6900
+    test('consistent behavior of @xxx:modelValue and @xxx:model-value', () => {
+      const { root: rootUpper } = parseWithSlots(
+        `<div><slot @foo:modelValue="handler" /></div>`
+      )
+      const slotNodeUpper = (rootUpper.codegenNode! as VNodeCall)
+        .children as ElementNode[]
+      const propertiesObjUpper = (
+        slotNodeUpper[0].codegenNode! as RenderSlotCall
+      ).arguments[2]
+      expect(propertiesObjUpper).toMatchObject({
+        properties: [
+          {
+            key: {
+              type: NodeTypes.SIMPLE_EXPRESSION,
+              content: 'onFoo:modelValue'
+            },
+            value: {
+              type: NodeTypes.SIMPLE_EXPRESSION,
+              content: `handler`,
+              isStatic: false
+            }
+          }
+        ]
+      })
+
+      const { root } = parseWithSlots(
+        `<div><slot @foo:model-Value="handler" /></div>`
+      )
+      const slotNode = (root.codegenNode! as VNodeCall)
+        .children as ElementNode[]
+      const propertiesObj = (slotNode[0].codegenNode! as RenderSlotCall)
+        .arguments[2]
+      expect(propertiesObj).toMatchObject({
+        properties: [
+          {
+            key: {
+              type: NodeTypes.SIMPLE_EXPRESSION,
+              content: 'onFoo:modelValue'
+            },
+            value: {
+              type: NodeTypes.SIMPLE_EXPRESSION,
+              content: `handler`,
+              isStatic: false
+            }
+          }
+        ]
+      })
+    })
   })
 
   describe('errors', () => {
index b4d2e851ca9558f05851885d15f0bab065c95b3a..9fe8b6ab61cd6f69ee34e691e97860cbcb02867c 100644 (file)
@@ -48,10 +48,10 @@ export const transformOn: DirectiveTransform = (
         rawName = `vnode-${rawName.slice(4)}`
       }
       const eventString =
-        node.tagType === ElementTypes.COMPONENT ||
+        node.tagType !== ElementTypes.ELEMENT ||
         rawName.startsWith('vnode') ||
         !/[A-Z]/.test(rawName)
-          ? // for component and vnode lifecycle event listeners, auto convert
+          ? // for non-element and vnode lifecycle event listeners, auto convert
             // it to camelCase. See issue #2249
             toHandlerKey(camelize(rawName))
           : // preserve case for plain element listeners that have uppercase