2
0
Эх сурвалжийг харах

fix(compiler-core): should treat attribute key as expression (#4658)

Herrington Darkholme 4 жил өмнө
parent
commit
7aa0ea06c8

+ 20 - 0
packages/compiler-core/__tests__/transforms/vFor.spec.ts

@@ -638,6 +638,26 @@ describe('compiler: v-for', () => {
         })
         })
       })
       })
     })
     })
+
+    test('template v-for key no prefixing on attribute key', () => {
+      const {
+        node: { codegenNode }
+      } = parseWithForTransform(
+        '<template v-for="item in items" key="key">test</template>',
+        { prefixIdentifiers: true }
+      )
+      const innerBlock = codegenNode.children.arguments[1].returns
+      expect(innerBlock).toMatchObject({
+        type: NodeTypes.VNODE_CALL,
+        tag: FRAGMENT,
+        props: createObjectMatcher({
+          key: {
+            type: NodeTypes.SIMPLE_EXPRESSION,
+            content: 'key'
+          }
+        })
+      })
+    })
   })
   })
 
 
   describe('codegen', () => {
   describe('codegen', () => {

+ 6 - 1
packages/compiler-core/src/transforms/vFor.ts

@@ -68,7 +68,12 @@ export const transformFor = createStructuralDirectiveTransform(
           : keyProp.exp!)
           : keyProp.exp!)
       const keyProperty = keyProp ? createObjectProperty(`key`, keyExp!) : null
       const keyProperty = keyProp ? createObjectProperty(`key`, keyExp!) : null
 
 
-      if (!__BROWSER__ && context.prefixIdentifiers && keyProperty) {
+      if (
+        !__BROWSER__ &&
+        context.prefixIdentifiers &&
+        keyProperty &&
+        keyProp!.type !== NodeTypes.ATTRIBUTE
+      ) {
         // #2085 process :key expression needs to be processed in order for it
         // #2085 process :key expression needs to be processed in order for it
         // to behave consistently for <template v-for> and <div v-for>.
         // to behave consistently for <template v-for> and <div v-for>.
         // In the case of `<template v-for>`, the node is discarded and never
         // In the case of `<template v-for>`, the node is discarded and never