Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 15f6652

Browse files
authored
fix(runtime-vapor): prevent event handler execution during emits lookup (#14281)
revert #14218 close #14280
1 parent 6fc638f commit 15f6652

7 files changed

Lines changed: 32 additions & 25 deletions

File tree

‎packages/compiler-vapor/__tests__/transforms/__snapshots__/transformElement.spec.ts.snap‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -307,7 +307,7 @@ exports[`compiler: element transform > component > v-on="obj" 1`] = `
307307
export function render(_ctx) {
308308
const _component_Foo = _resolveComponent("Foo")
309309
const n0 = _createComponentWithFallback(_component_Foo, { $: [
310-
() => (_toHandlers(_ctx.obj, false, true))
310+
() => (_toHandlers(_ctx.obj))
311311
] }, null, true)
312312
return n0
313313
}"

‎packages/compiler-vapor/__tests__/transforms/__snapshots__/transformSlotOutlet.spec.ts.snap‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -181,7 +181,7 @@ export function render(_ctx) {
181181
const n0 = _createSlot("default", {
182182
onClick: () => _ctx.foo,
183183
$: [
184-
() => (_toHandlers(_ctx.bar, false, true)),
184+
() => (_toHandlers(_ctx.bar)),
185185
{ baz: () => (_ctx.qux) }
186186
]
187187
})

‎packages/compiler-vapor/__tests__/transforms/transformElement.spec.ts‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -370,7 +370,7 @@ describe('compiler: element transform', () => {
370370
const { code, ir } = compileWithElementTransform(`<Foo v-on="obj" />`)
371371
expect(code).toMatchSnapshot()
372372
expect(code).contains(`[
373-
() => (_toHandlers(_ctx.obj, false, true))
373+
() => (_toHandlers(_ctx.obj))
374374
]`)
375375
expect(ir.block.dynamic.children[0].operation).toMatchObject({
376376
type: IRNodeTypes.CREATE_COMPONENT_NODE,

‎packages/compiler-vapor/src/generators/component.ts‎

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -392,13 +392,7 @@ function genDynamicProps(
392392
}
393393
} else {
394394
expr = genExpression(p.value, context)
395-
if (p.handler)
396-
expr = genCall(
397-
helper('toHandlers'),
398-
expr,
399-
`false`, // preserveCaseIfNecessary: false, not needed for component
400-
`true`, // wrap handler values in functions
401-
)
395+
if (p.handler) expr = genCall(helper('toHandlers'), expr)
402396
}
403397
}
404398
frags.push(['() => (', ...expr, ')'])

‎packages/runtime-core/src/helpers/toHandlers.ts‎

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ import { warn } from '../warning'
88
export function toHandlers(
99
obj: Record<string, any>,
1010
preserveCaseIfNecessary?: boolean,
11-
needWrap?: boolean,
1211
): Record<string, any> {
1312
const ret: Record<string, any> = {}
1413
if (__DEV__ && !isObject(obj)) {
@@ -20,7 +19,7 @@ export function toHandlers(
2019
preserveCaseIfNecessary && /[A-Z]/.test(key)
2120
? `on:${key}`
2221
: toHandlerKey(key)
23-
] = needWrap ? () => obj[key] : obj[key]
22+
] = obj[key]
2423
}
2524
return ret
2625
}

‎packages/runtime-vapor/__tests__/componentEmits.spec.ts‎

Lines changed: 25 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -99,17 +99,10 @@ describe('component: emit', () => {
9999
const fooSpy = vi.fn()
100100
const barSpy = vi.fn()
101101
render(
102-
// v-on="{ testEvent: handler }"
103-
// will be compiled to
104-
// toHandlers({ testEvent: handler }, false, true)
105-
toHandlers(
106-
{
107-
'test-event': fooSpy,
108-
testEvent: barSpy,
109-
},
110-
false,
111-
true,
112-
),
102+
toHandlers({
103+
'test-event': () => fooSpy,
104+
testEvent: () => barSpy,
105+
}),
113106
)
114107
expect(fooSpy).toHaveBeenCalledTimes(1)
115108
expect(barSpy).toHaveBeenCalledTimes(1)
@@ -430,4 +423,25 @@ describe('component: emit', () => {
430423
await nextTick()
431424
expect(fn).not.toHaveBeenCalled()
432425
})
426+
427+
test('should not execute handler during lookup', () => {
428+
const { render } = define({
429+
setup(_, { emit }) {
430+
emit('click')
431+
return []
432+
},
433+
})
434+
435+
const handler = vi.fn()
436+
const props = {
437+
$: [
438+
() => ({
439+
onClick: handler,
440+
}),
441+
],
442+
}
443+
render(props as any)
444+
445+
expect(handler).toHaveBeenCalledTimes(1)
446+
})
433447
})

‎packages/runtime-vapor/src/componentEmits.ts‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { type ObjectEmitsOptions, baseEmit } from '@vue/runtime-dom'
22
import type { VaporComponent, VaporComponentInstance } from './component'
3-
import { EMPTY_OBJ, hasOwn, isArray } from '@vue/shared'
3+
import { EMPTY_OBJ, hasOwn, isArray, isOn } from '@vue/shared'
44
import { type RawProps, resolveSource } from './componentProps'
55
import { interopKey } from './vdomInterop'
66

@@ -49,7 +49,7 @@ function propGetter(rawProps: RawProps, key: string) {
4949
const source = resolveSource(dynamicSources[i])
5050
if (hasOwn(source, key))
5151
// for props passed from VDOM component, no need to resolve
52-
return dynamicSources[interopKey]
52+
return dynamicSources[interopKey] || isOn(key)
5353
? source[key]
5454
: resolveSource(source[key])
5555
}

0 commit comments

Comments
 (0)