Skip to content

Commit

Permalink
feat(compiler-vapor, runtime-vapor): support listen sub components emit
Browse files Browse the repository at this point in the history
related vuejs#4
  • Loading branch information
Doctor-wu committed Apr 11, 2024
1 parent 98bae0c commit 4ecc656
Show file tree
Hide file tree
Showing 4 changed files with 37 additions and 8 deletions.
6 changes: 3 additions & 3 deletions packages/compiler-vapor/src/generators/component.ts
Original file line number Diff line number Diff line change
Expand Up @@ -63,9 +63,9 @@ export function genCreateComponent(
...props.map(prop => {
return [
...genPropKey(prop, context),
': () => (',
...genExpression(prop.values[0], context),
')',
...(prop.applyRawValue
? [': ', prop.values[0].content, ',']
: [': () => (', ...genExpression(prop.values[0], context), ')']),
]
}),
)
Expand Down
1 change: 1 addition & 0 deletions packages/compiler-vapor/src/transform.ts
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ export type DirectiveTransform = (
export interface DirectiveTransformResult {
key: SimpleExpressionNode
value: SimpleExpressionNode
applyRawValue?: boolean
modifier?: '.' | '^'
runtimeCamelize?: boolean
}
Expand Down
23 changes: 22 additions & 1 deletion packages/compiler-vapor/src/transforms/vOn.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,15 @@
import { ErrorCodes, createCompilerError } from '@vue/compiler-dom'
import {
ElementTypes,
ErrorCodes,
createCompilerError,
createSimpleExpression,
} from '@vue/compiler-dom'
import type { DirectiveTransform } from '../transform'
import { IRNodeTypes, type KeyOverride, type SetEventIRNode } from '../ir'
import { resolveModifiers } from '@vue/compiler-dom'
import { extend, makeMap } from '@vue/shared'
import { resolveExpression } from '../utils'
import { EMPTY_EXPRESSION } from './utils'

const delegatedEvents = /*#__PURE__*/ makeMap(
'beforeinput,click,dblclick,contextmenu,focusin,focusout,input,keydown,' +
Expand All @@ -14,6 +20,8 @@ const delegatedEvents = /*#__PURE__*/ makeMap(

export const transformVOn: DirectiveTransform = (dir, node, context) => {
let { arg, exp, loc, modifiers } = dir
const isComponent = node.tagType === ElementTypes.COMPONENT

if (!exp && (!modifiers.length || !arg)) {
context.options.onError(
createCompilerError(ErrorCodes.X_V_ON_NO_EXPRESSION, loc),
Expand Down Expand Up @@ -70,6 +78,19 @@ export const transformVOn: DirectiveTransform = (dir, node, context) => {
}
}

if (isComponent) {
const eventName = arg.content
const handler = exp || EMPTY_EXPRESSION
return {
key: createSimpleExpression(eventName, true, arg.loc),
value: extend(handler, {
isHandler: true,
loc: handler.loc,
}),
applyRawValue: true,
}
}

const operation: SetEventIRNode = {
type: IRNodeTypes.SET_EVENT,
element: context.reference(),
Expand Down
15 changes: 11 additions & 4 deletions packages/runtime-vapor/src/componentEmits.ts
Original file line number Diff line number Diff line change
Expand Up @@ -74,10 +74,17 @@ export function emit(
// TODO: warn

let handlerName
let handler =
rawProps[(handlerName = toHandlerKey(event))] ||
// also try camelCase event handler (#2249)
rawProps[(handlerName = toHandlerKey(camelize(event)))]
let handler
for (let rawProp of rawProps) {
if (
(handler =
rawProp[(handlerName = toHandlerKey(event))] ||
// also try camelCase event handler (#2249)
rawProp[(handlerName = toHandlerKey(camelize(event)))])
) {
break
}
}
// for v-model update:xxx events, also trigger kebab-case equivalent
// for props passed via kebab-case
if (!handler && isModelListener) {
Expand Down

0 comments on commit 4ecc656

Please sign in to comment.