feat(compiler-core): support aliasing vue: prefixed events to inline vnode hooks
This commit is contained in:
		
							parent
							
								
									1c9a4810fc
								
							
						
					
					
						commit
						4b0ca8709a
					
				@ -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)
 | 
			
		||||
  })
 | 
			
		||||
 | 
			
		||||
@ -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 />`, {
 | 
			
		||||
 | 
			
		||||
@ -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
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
@ -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)),
 | 
			
		||||
 | 
			
		||||
@ -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 {
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user