]> git.ipfire.org Git - thirdparty/vuejs/core.git/commitdiff
feat(compiler-core): support aliasing vue: prefixed events to inline vnode hooks
authorEvan You <yyx990803@gmail.com>
Fri, 10 Dec 2021 08:09:23 +0000 (16:09 +0800)
committerEvan You <yyx990803@gmail.com>
Fri, 10 Dec 2021 08:09:23 +0000 (16:09 +0800)
packages/compiler-core/__tests__/transforms/transformElement.spec.ts
packages/compiler-core/__tests__/transforms/vOn.spec.ts
packages/compiler-core/src/transforms/transformElement.ts
packages/compiler-core/src/transforms/vOn.ts
packages/compiler-core/src/utils.ts

index 17e6b5bb14a53eb6c85d6f5de86a3f86c7d208fe..b72533ee3f98084702a8b3d874acbf3a1926f720 100644 (file)
@@ -1209,12 +1209,7 @@ describe('compiler: element transform', () => {
 
   test('force block for inline before-update handlers w/ children', () => {
     expect(
-      parseWithElementTransform(`<div @vnode-before-update>hello</div>`).node
-        .isBlock
-    ).toBe(true)
-
-    expect(
-      parseWithElementTransform(`<div @vnodeBeforeUpdate>hello</div>`).node
+      parseWithElementTransform(`<div @vue:before-update>hello</div>`).node
         .isBlock
     ).toBe(true)
   })
index 3c56ce9aadd3a4a2b8bff62190c7df2ca139b094..8f943a7491ffecdff2c50d101aa03cf8c22ed9df 100644 (file)
@@ -438,6 +438,32 @@ describe('compiler: transform v-on', () => {
     })
   })
 
+  test('vue: prefixed events', () => {
+    const { node } = parseWithVOn(
+      `<div v-on:vue:mounted="onMount" @vue:before-update="onBeforeUpdate" />`
+    )
+    expect((node.codegenNode as VNodeCall).props).toMatchObject({
+      properties: [
+        {
+          key: {
+            content: `onVnodeMounted`
+          },
+          value: {
+            content: `onMount`
+          }
+        },
+        {
+          key: {
+            content: `onVnodeBeforeUpdate`
+          },
+          value: {
+            content: `onBeforeUpdate`
+          }
+        }
+      ]
+    })
+  })
+
   describe('cacheHandler', () => {
     test('empty handler', () => {
       const { root, node } = parseWithVOn(`<div v-on:click.prevent />`, {
index fb0ddd528c78a56aea8a798c51f4b0ea594bc636..e79a560a2b07886183debaa1ec3df1361c1ae2d1 100644 (file)
@@ -550,7 +550,7 @@ export function buildProps(
         (isVBind && isStaticArgOf(arg, 'key')) ||
         // inline before-update hooks need to force block so that it is invoked
         // before children
-        (isVOn && hasChildren && isStaticArgOf(arg, 'vnodeBeforeUpdate', true))
+        (isVOn && hasChildren && isStaticArgOf(arg, 'vue:before-update'))
       ) {
         shouldUseBlock = true
       }
index 0a804021d15540fb833a760f23384d9481349c17..060a7ef9097591ee15bf82135fa4e30c7e6599f2 100644 (file)
@@ -42,7 +42,11 @@ export const transformOn: DirectiveTransform = (
   let eventName: ExpressionNode
   if (arg.type === NodeTypes.SIMPLE_EXPRESSION) {
     if (arg.isStatic) {
-      const rawName = arg.content
+      let rawName = arg.content
+      // TODO deprecate @vnodeXXX usage
+      if (rawName.startsWith('vue:')) {
+        rawName = `vnode-${rawName.slice(4)}`
+      }
       // for all event listeners, auto convert it to camelCase. See issue #2249
       eventName = createSimpleExpression(
         toHandlerKey(camelize(rawName)),
index 0c62f3043d9c0e8ffd2f11f8f7333c4132b10e0d..c9e310fe089436b1bc1084ee7625b491d8ff5298 100644 (file)
@@ -42,14 +42,7 @@ import {
   WITH_MEMO,
   OPEN_BLOCK
 } from './runtimeHelpers'
-import {
-  isString,
-  isObject,
-  hyphenate,
-  extend,
-  NOOP,
-  camelize
-} from '@vue/shared'
+import { isString, isObject, hyphenate, extend, NOOP } from '@vue/shared'
 import { PropsExpression } from './transforms/transformElement'
 import { parseExpression } from '@babel/parser'
 import { Expression } from '@babel/types'
@@ -298,14 +291,9 @@ export function findProp(
 
 export function isStaticArgOf(
   arg: DirectiveNode['arg'],
-  name: string,
-  camel?: boolean
+  name: string
 ): boolean {
-  return !!(
-    arg &&
-    isStaticExp(arg) &&
-    (camel ? camelize(arg.content) : arg.content) === name
-  )
+  return !!(arg && isStaticExp(arg) && arg.content === name)
 }
 
 export function hasDynamicKeyVBind(node: ElementNode): boolean {