]> git.ipfire.org Git - thirdparty/vuejs/core.git/commitdiff
fix(compilre-core): dynamic v-on and static v-on should be merged (#6747)
authorDunqing <dengqing0821@gmail.com>
Wed, 28 Sep 2022 02:46:55 +0000 (10:46 +0800)
committerGitHub <noreply@github.com>
Wed, 28 Sep 2022 02:46:55 +0000 (22:46 -0400)
fix #6742

packages/compiler-core/src/transforms/transformElement.ts
packages/compiler-sfc/__tests__/__snapshots__/compileTemplate.spec.ts.snap
packages/compiler-sfc/__tests__/compileTemplate.spec.ts

index 0eb3bb57628a3844d0fe0b7b5bae5265cf6bd16a..f52c6bf07e06770e06dd6116dc548ea2f368b6e4 100644 (file)
@@ -668,7 +668,17 @@ export function buildProps(
         // has built-in directive transform.
         const { props, needRuntime } = directiveTransform(prop, node, context)
         !ssr && props.forEach(analyzePatchFlag)
-        properties.push(...props)
+        if (isVOn && arg && !isStaticExp(arg)) {
+          if (properties.length) {
+            mergeArgs.push(
+              createObjectExpression(dedupeProperties(properties), elementLoc)
+            )
+            properties = []
+          }
+          mergeArgs.push(createObjectExpression(props, elementLoc))
+        } else {
+          properties.push(...props)
+        }
         if (needRuntime) {
           runtimeDirectives.push(prop)
           if (isSymbol(needRuntime)) {
index 4dfc212e02a4d29dbc226b8a8d92c53761577cf9..9d04c5159a9079a17536718fa1b180d4158fb163 100644 (file)
@@ -1,5 +1,17 @@
 // Jest Snapshot v1, https://goo.gl/fbAQLP
 
+exports[`dynamic v-on + static v-on should merged 1`] = `
+"import { toHandlerKey as _toHandlerKey, mergeProps as _mergeProps, openBlock as _openBlock, createElementBlock as _createElementBlock } from \\"vue\\"
+
+export function render(_ctx, _cache) {
+  return (_openBlock(), _createElementBlock(\\"input\\", _mergeProps({
+    onBlur: _cache[0] || (_cache[0] = (...args) => (_ctx.onBlur && _ctx.onBlur(...args)))
+  }, {
+    [_toHandlerKey(_ctx.validateEvent)]: _cache[1] || (_cache[1] = (...args) => (_ctx.onValidateEvent && _ctx.onValidateEvent(...args)))
+  }), null, 16 /* FULL_PROPS */))
+}"
+`;
+
 exports[`should not hoist srcset URLs in SSR mode 1`] = `
 "import { resolveComponent as _resolveComponent, withCtx as _withCtx, createVNode as _createVNode } from \\"vue\\"
 import { ssrRenderAttr as _ssrRenderAttr, ssrRenderComponent as _ssrRenderComponent } from \\"vue/server-renderer\\"
index 2beda880b5bb4164b969fe9422103d4e866a34b9..f58b6338de9f133d3b0a578e26c2fb1c8ca1b313 100644 (file)
@@ -174,3 +174,12 @@ test('should not hoist srcset URLs in SSR mode', () => {
   })
   expect(code).toMatchSnapshot()
 })
+
+// #6742
+test('dynamic v-on + static v-on should merged', () => {
+  const source = `<input @blur="onBlur" @[validateEvent]="onValidateEvent">`
+
+  const result = compile({ filename: 'example.vue', source })
+
+  expect(result.code).toMatchSnapshot()
+})