]> git.ipfire.org Git - thirdparty/vuejs/core.git/commitdiff
fix(compiler-core): handle v-if userKey not resolved when use :key shorthand edison/fix/11321 12298/head
authordaiwei <daiwei521@126.com>
Thu, 31 Oct 2024 06:46:40 +0000 (14:46 +0800)
committerdaiwei <daiwei521@126.com>
Thu, 31 Oct 2024 06:46:40 +0000 (14:46 +0800)
packages/compiler-core/__tests__/transforms/vIf.spec.ts
packages/compiler-core/src/transforms/vIf.ts

index 2c2fedab0d5850cc718a668b046646998c0ebe4f..784fb811a35b5e4eb66758e62c9b10dd7d9422b5 100644 (file)
@@ -209,6 +209,15 @@ describe('compiler: v-if', () => {
         content: `_ctx.ok`,
       })
     })
+
+    test('v-if + :key shorthand', () => {
+      const { node } = parseWithIfTransform(`<div v-if="ok" :key></div>`)
+      expect(node.type).toBe(NodeTypes.IF)
+      expect(node.branches[0].userKey).toMatchObject({
+        arg: { content: 'key' },
+        exp: { content: 'key' },
+      })
+    })
   })
 
   describe('errors', () => {
index 54c505407a363783a66753dd187278139e3ec388..792219cb70edbb0c7b2cbe695d160b5634c2e049 100644 (file)
@@ -34,6 +34,7 @@ import { cloneLoc } from '../parser'
 import { CREATE_COMMENT, FRAGMENT } from '../runtimeHelpers'
 import { findDir, findProp, getMemoedVNodeCall, injectProp } from '../utils'
 import { PatchFlags } from '@vue/shared'
+import { transformBindShorthand } from './vBind'
 
 export const transformIf: NodeTransform = createStructuralDirectiveTransform(
   /^(if|else|else-if)$/,
@@ -108,7 +109,7 @@ export function processIf(
   }
 
   if (dir.name === 'if') {
-    const branch = createIfBranch(node, dir)
+    const branch = createIfBranch(node, dir, context)
     const ifNode: IfNode = {
       type: NodeTypes.IF,
       loc: cloneLoc(node.loc),
@@ -153,7 +154,7 @@ export function processIf(
 
         // move the node to the if node's branches
         context.removeNode()
-        const branch = createIfBranch(node, dir)
+        const branch = createIfBranch(node, dir, context)
         if (
           __DEV__ &&
           comments.length &&
@@ -205,8 +206,17 @@ export function processIf(
   }
 }
 
-function createIfBranch(node: ElementNode, dir: DirectiveNode): IfBranchNode {
+function createIfBranch(
+  node: ElementNode,
+  dir: DirectiveNode,
+  context: TransformContext,
+): IfBranchNode {
   const isTemplateIf = node.tagType === ElementTypes.TEMPLATE
+  const keyProp = findProp(node, `key`, false, true)
+  // resolve :key shorthand #11321
+  if (keyProp && keyProp.type === NodeTypes.DIRECTIVE && !keyProp.exp) {
+    transformBindShorthand(keyProp, context)
+  }
   return {
     type: NodeTypes.IF_BRANCH,
     loc: node.loc,