mirror of https://github.com/vuejs/core.git
fix(compiler-vapor): once modifier work with component event (#12606)
This commit is contained in:
parent
58b49749c7
commit
20cd429766
|
@ -212,6 +212,28 @@ export function render(_ctx) {
|
||||||
}"
|
}"
|
||||||
`;
|
`;
|
||||||
|
|
||||||
|
exports[`compiler: element transform > component dynamic event with once modifier 1`] = `
|
||||||
|
"import { resolveComponent as _resolveComponent, toHandlerKey as _toHandlerKey, createComponentWithFallback as _createComponentWithFallback } from 'vue';
|
||||||
|
|
||||||
|
export function render(_ctx) {
|
||||||
|
const _component_Foo = _resolveComponent("Foo")
|
||||||
|
const n0 = _createComponentWithFallback(_component_Foo, { $: [
|
||||||
|
() => ({ [_toHandlerKey(_ctx.foo) + "Once"]: () => _ctx.bar })
|
||||||
|
] }, null, true)
|
||||||
|
return n0
|
||||||
|
}"
|
||||||
|
`;
|
||||||
|
|
||||||
|
exports[`compiler: element transform > component event with once modifier 1`] = `
|
||||||
|
"import { resolveComponent as _resolveComponent, createComponentWithFallback as _createComponentWithFallback } from 'vue';
|
||||||
|
|
||||||
|
export function render(_ctx) {
|
||||||
|
const _component_Foo = _resolveComponent("Foo")
|
||||||
|
const n0 = _createComponentWithFallback(_component_Foo, { onFooOnce: () => _ctx.bar }, null, true)
|
||||||
|
return n0
|
||||||
|
}"
|
||||||
|
`;
|
||||||
|
|
||||||
exports[`compiler: element transform > component with dynamic event arguments 1`] = `
|
exports[`compiler: element transform > component with dynamic event arguments 1`] = `
|
||||||
"import { resolveComponent as _resolveComponent, toHandlerKey as _toHandlerKey, createComponentWithFallback as _createComponentWithFallback } from 'vue';
|
"import { resolveComponent as _resolveComponent, toHandlerKey as _toHandlerKey, createComponentWithFallback as _createComponentWithFallback } from 'vue';
|
||||||
|
|
||||||
|
|
|
@ -940,6 +940,16 @@ describe('compiler: element transform', () => {
|
||||||
])
|
])
|
||||||
})
|
})
|
||||||
|
|
||||||
|
test('component event with once modifier', () => {
|
||||||
|
const { code } = compileWithElementTransform(`<Foo @foo.once="bar" />`)
|
||||||
|
expect(code).toMatchSnapshot()
|
||||||
|
})
|
||||||
|
|
||||||
|
test('component dynamic event with once modifier', () => {
|
||||||
|
const { code } = compileWithElementTransform(`<Foo @[foo].once="bar" />`)
|
||||||
|
expect(code).toMatchSnapshot()
|
||||||
|
})
|
||||||
|
|
||||||
test('invalid html nesting', () => {
|
test('invalid html nesting', () => {
|
||||||
const { code, ir } = compileWithElementTransform(
|
const { code, ir } = compileWithElementTransform(
|
||||||
`<p><div>123</div></p>
|
`<p><div>123</div></p>
|
||||||
|
|
|
@ -22,6 +22,7 @@ import {
|
||||||
} from './utils'
|
} from './utils'
|
||||||
import {
|
import {
|
||||||
canSetValueDirectly,
|
canSetValueDirectly,
|
||||||
|
capitalize,
|
||||||
isSVGTag,
|
isSVGTag,
|
||||||
shouldSetAsAttr,
|
shouldSetAsAttr,
|
||||||
toHandlerKey,
|
toHandlerKey,
|
||||||
|
@ -108,15 +109,20 @@ function genLiteralObjectProps(
|
||||||
}
|
}
|
||||||
|
|
||||||
export function genPropKey(
|
export function genPropKey(
|
||||||
{ key: node, modifier, runtimeCamelize, handler }: IRProp,
|
{ key: node, modifier, runtimeCamelize, handler, handlerModifiers }: IRProp,
|
||||||
context: CodegenContext,
|
context: CodegenContext,
|
||||||
): CodeFragment[] {
|
): CodeFragment[] {
|
||||||
const { helper } = context
|
const { helper } = context
|
||||||
|
|
||||||
|
const handlerModifierPostfix = handlerModifiers
|
||||||
|
? handlerModifiers.map(capitalize).join('')
|
||||||
|
: ''
|
||||||
// static arg was transformed by v-bind transformer
|
// static arg was transformed by v-bind transformer
|
||||||
if (node.isStatic) {
|
if (node.isStatic) {
|
||||||
// only quote keys if necessary
|
// only quote keys if necessary
|
||||||
const keyName = handler ? toHandlerKey(node.content) : node.content
|
const keyName =
|
||||||
|
(handler ? toHandlerKey(node.content) : node.content) +
|
||||||
|
handlerModifierPostfix
|
||||||
return [
|
return [
|
||||||
[
|
[
|
||||||
isSimpleIdentifier(keyName) ? keyName : JSON.stringify(keyName),
|
isSimpleIdentifier(keyName) ? keyName : JSON.stringify(keyName),
|
||||||
|
@ -133,7 +139,15 @@ export function genPropKey(
|
||||||
if (handler) {
|
if (handler) {
|
||||||
key = genCall(helper('toHandlerKey'), key)
|
key = genCall(helper('toHandlerKey'), key)
|
||||||
}
|
}
|
||||||
return ['[', modifier && `${JSON.stringify(modifier)} + `, ...key, ']']
|
return [
|
||||||
|
'[',
|
||||||
|
modifier && `${JSON.stringify(modifier)} + `,
|
||||||
|
...key,
|
||||||
|
handlerModifierPostfix
|
||||||
|
? ` + ${JSON.stringify(handlerModifierPostfix)}`
|
||||||
|
: undefined,
|
||||||
|
']',
|
||||||
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
export function genPropValue(
|
export function genPropValue(
|
||||||
|
|
|
@ -47,6 +47,7 @@ export interface DirectiveTransformResult {
|
||||||
modifier?: '.' | '^'
|
modifier?: '.' | '^'
|
||||||
runtimeCamelize?: boolean
|
runtimeCamelize?: boolean
|
||||||
handler?: boolean
|
handler?: boolean
|
||||||
|
handlerModifiers?: string[]
|
||||||
model?: boolean
|
model?: boolean
|
||||||
modelModifiers?: string[]
|
modelModifiers?: string[]
|
||||||
}
|
}
|
||||||
|
|
|
@ -67,6 +67,7 @@ export const transformVOn: DirectiveTransform = (dir, node, context) => {
|
||||||
key: arg,
|
key: arg,
|
||||||
value: handler,
|
value: handler,
|
||||||
handler: true,
|
handler: true,
|
||||||
|
handlerModifiers: eventOptionModifiers,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -46,7 +46,7 @@ function propGetter(rawProps: Record<string, any>, key: string) {
|
||||||
let i = dynamicSources.length
|
let i = dynamicSources.length
|
||||||
while (i--) {
|
while (i--) {
|
||||||
const source = resolveSource(dynamicSources[i])
|
const source = resolveSource(dynamicSources[i])
|
||||||
if (hasOwn(source, key)) return source[key]
|
if (hasOwn(source, key)) return resolveSource(source[key])
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return rawProps[key] && resolveSource(rawProps[key])
|
return rawProps[key] && resolveSource(rawProps[key])
|
||||||
|
|
Loading…
Reference in New Issue