fix(compiler-core): avoid override user keys when injecting branch key (#630)
This commit is contained in:
parent
c71ca354b9
commit
aca2c2a81e
@ -105,3 +105,17 @@ return function render() {
|
|||||||
}
|
}
|
||||||
}"
|
}"
|
||||||
`;
|
`;
|
||||||
|
|
||||||
|
exports[`compiler: v-if codegen v-if with key 1`] = `
|
||||||
|
"const _Vue = Vue
|
||||||
|
|
||||||
|
return function render() {
|
||||||
|
with (this) {
|
||||||
|
const { openBlock: _openBlock, createVNode: _createVNode, createBlock: _createBlock, createCommentVNode: _createCommentVNode } = _Vue
|
||||||
|
|
||||||
|
return (_openBlock(), ok
|
||||||
|
? _createBlock(\\"div\\", { key: \\"some-key\\" })
|
||||||
|
: _createCommentVNode(\\"v-if\\", true))
|
||||||
|
}
|
||||||
|
}"
|
||||||
|
`;
|
||||||
|
@ -530,6 +530,20 @@ describe('compiler: v-if', () => {
|
|||||||
)
|
)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
test('v-if with key', () => {
|
||||||
|
const {
|
||||||
|
root,
|
||||||
|
node: { codegenNode }
|
||||||
|
} = parseWithIfTransform(`<div v-if="ok" key="some-key"/>`)
|
||||||
|
const branch1 = (codegenNode.expressions[1] as ConditionalExpression)
|
||||||
|
.consequent as CallExpression
|
||||||
|
expect(branch1.arguments).toMatchObject([
|
||||||
|
`"div"`,
|
||||||
|
createObjectMatcher({ key: 'some-key' })
|
||||||
|
])
|
||||||
|
expect(generate(root).code).toMatchSnapshot()
|
||||||
|
})
|
||||||
|
|
||||||
test.todo('with comments')
|
test.todo('with comments')
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
@ -253,7 +253,18 @@ export function injectProp(
|
|||||||
}
|
}
|
||||||
propsWithInjection = props
|
propsWithInjection = props
|
||||||
} else if (props.type === NodeTypes.JS_OBJECT_EXPRESSION) {
|
} else if (props.type === NodeTypes.JS_OBJECT_EXPRESSION) {
|
||||||
|
let alreadyExists = false
|
||||||
|
// check existing key to avoid overriding user provided keys
|
||||||
|
if (prop.key.type === NodeTypes.SIMPLE_EXPRESSION) {
|
||||||
|
const propKeyName = prop.key.content
|
||||||
|
alreadyExists = props.properties.some(p => (
|
||||||
|
p.key.type === NodeTypes.SIMPLE_EXPRESSION &&
|
||||||
|
p.key.content === propKeyName
|
||||||
|
))
|
||||||
|
}
|
||||||
|
if (!alreadyExists) {
|
||||||
props.properties.unshift(prop)
|
props.properties.unshift(prop)
|
||||||
|
}
|
||||||
propsWithInjection = props
|
propsWithInjection = props
|
||||||
} else {
|
} else {
|
||||||
// single v-bind with expression, return a merged replacement
|
// single v-bind with expression, return a merged replacement
|
||||||
|
Loading…
x
Reference in New Issue
Block a user