refactor(compiler-core): extract props merging helper

This commit is contained in:
Evan You 2022-09-28 10:59:13 +08:00
parent f9d43b99f8
commit f402d416b8
1 changed files with 16 additions and 19 deletions

View File

@ -413,6 +413,16 @@ export function buildProps(
let hasVnodeHook = false
const dynamicPropNames: string[] = []
const pushMergeArg = (arg?: PropsExpression) => {
if (properties.length) {
mergeArgs.push(
createObjectExpression(dedupeProperties(properties), elementLoc)
)
properties = []
}
if (arg) mergeArgs.push(arg)
}
const analyzePatchFlag = ({ key, value }: Property) => {
if (isStaticExp(key)) {
const name = key.content
@ -590,13 +600,9 @@ export function buildProps(
if (!arg && (isVBind || isVOn)) {
hasDynamicKeys = true
if (exp) {
if (properties.length) {
mergeArgs.push(
createObjectExpression(dedupeProperties(properties), elementLoc)
)
properties = []
}
if (isVBind) {
// have to merge early for compat build check
pushMergeArg()
if (__COMPAT__) {
// 2.x v-bind object order compat
if (__DEV__) {
@ -643,7 +649,7 @@ export function buildProps(
mergeArgs.push(exp)
} else {
// v-on="obj" -> toHandlers(obj)
mergeArgs.push({
pushMergeArg({
type: NodeTypes.JS_CALL_EXPRESSION,
loc,
callee: context.helper(TO_HANDLERS),
@ -669,13 +675,7 @@ export function buildProps(
const { props, needRuntime } = directiveTransform(prop, node, context)
!ssr && props.forEach(analyzePatchFlag)
if (isVOn && arg && !isStaticExp(arg)) {
if (properties.length) {
mergeArgs.push(
createObjectExpression(dedupeProperties(properties), elementLoc)
)
properties = []
}
mergeArgs.push(createObjectExpression(props, elementLoc))
pushMergeArg(createObjectExpression(props, elementLoc))
} else {
properties.push(...props)
}
@ -701,11 +701,8 @@ export function buildProps(
// has v-bind="object" or v-on="object", wrap with mergeProps
if (mergeArgs.length) {
if (properties.length) {
mergeArgs.push(
createObjectExpression(dedupeProperties(properties), elementLoc)
)
}
// close up any not-yet-merged props
pushMergeArg()
if (mergeArgs.length > 1) {
propsExpression = createCallExpression(
context.helper(MERGE_PROPS),