Skip to content

refactor(compile-vapor): wrap the event handler with withModifiers or withKeys #300

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 2 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion packages-private/sfc-playground/src/App.vue
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ const importMap = computed(() => {
'vue/vapor': vapor,
},
}
if (useVaporMode.value) vaporImportMap.imports!.vue = vapor
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this line will cause vue and vue/vapor to use the same URL, witch will lead some bugs, see Playground

{
  "imports": {
    "vue": "https://vapor-repl.netlify.app/vue-vapor.esm-browser.js",
    "vue/server-renderer": "https://vapor-repl.netlify.app/server-renderer.esm-browser.js",
    "vue/vapor": "https://vapor-repl.netlify.app/vue-vapor.esm-browser.js"
  },
  "scopes": {}
}

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

if the row is deleted, the getCurrentInstance() return value will be undefined in setup.

// if (useVaporMode.value) vaporImportMap.imports!.vue = vapor

return mergeImportMap(vueImportMap.value, vaporImportMap)
})
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -309,18 +309,15 @@ export function render(_ctx) {
`;

exports[`compiler: element transform > props merging: event handlers 1`] = `
"import { delegate as _delegate, delegateEvents as _delegateEvents, template as _template } from 'vue/vapor';
"import { withKeys as _withKeys } from 'vue';
import { delegate as _delegate, delegateEvents as _delegateEvents, template as _template } from 'vue/vapor';
const t0 = _template("<div></div>")
_delegateEvents("click")

export function render(_ctx) {
const n0 = t0()
_delegate(n0, "click", () => _ctx.a, {
keys: ["foo"]
})
_delegate(n0, "click", () => _ctx.b, {
keys: ["bar"]
})
_delegate(n0, "click", () => _withKeys(_ctx.a, ["foo"]))
_delegate(n0, "click", () => _withKeys(_ctx.b, ["bar"]))
return n0
}"
`;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,8 @@ export function render(_ctx) {
`;

exports[`v-on > event modifier 1`] = `
"import { delegate as _delegate, on as _on, delegateEvents as _delegateEvents, template as _template } from 'vue/vapor';
"import { withModifiers as _withModifiers, withKeys as _withKeys } from 'vue';
import { delegate as _delegate, on as _on, delegateEvents as _delegateEvents, template as _template } from 'vue/vapor';
const t0 = _template("<a></a>")
const t1 = _template("<form></form>")
const t2 = _template("<div></div>")
Expand Down Expand Up @@ -88,18 +89,10 @@ export function render(_ctx, $props, $emit, $attrs, $slots) {
const n19 = t3()
const n20 = t3()
const n21 = t3()
_delegate(n0, "click", () => _ctx.handleEvent, {
modifiers: ["stop"]
})
_on(n1, "submit", () => _ctx.handleEvent, {
modifiers: ["prevent"]
})
_delegate(n2, "click", () => _ctx.handleEvent, {
modifiers: ["stop", "prevent"]
})
_delegate(n3, "click", () => _ctx.handleEvent, {
modifiers: ["self"]
})
_delegate(n0, "click", () => _withModifiers(_ctx.handleEvent, ["stop"]))
_on(n1, "submit", () => _withModifiers(_ctx.handleEvent, ["prevent"]))
_delegate(n2, "click", () => _withModifiers(_ctx.handleEvent, ["stop","prevent"]))
_delegate(n3, "click", () => _withModifiers(_ctx.handleEvent, ["self"]))
_on(n4, "click", () => _ctx.handleEvent, {
capture: true
})
Expand All @@ -109,53 +102,21 @@ export function render(_ctx, $props, $emit, $attrs, $slots) {
_on(n6, "scroll", () => _ctx.handleEvent, {
passive: true
})
_delegate(n7, "contextmenu", () => _ctx.handleEvent, {
modifiers: ["right"]
})
_delegate(n8, "click", () => _ctx.handleEvent, {
modifiers: ["left"]
})
_delegate(n9, "mouseup", () => _ctx.handleEvent, {
modifiers: ["middle"]
})
_delegate(n10, "contextmenu", () => _ctx.handleEvent, {
modifiers: ["right"],
keys: ["enter"]
})
_delegate(n11, "keyup", () => _ctx.handleEvent, {
keys: ["enter"]
})
_delegate(n12, "keyup", () => _ctx.handleEvent, {
keys: ["tab"]
})
_delegate(n13, "keyup", () => _ctx.handleEvent, {
keys: ["delete"]
})
_delegate(n14, "keyup", () => _ctx.handleEvent, {
keys: ["esc"]
})
_delegate(n15, "keyup", () => _ctx.handleEvent, {
keys: ["space"]
})
_delegate(n16, "keyup", () => _ctx.handleEvent, {
keys: ["up"]
})
_delegate(n17, "keyup", () => _ctx.handleEvent, {
keys: ["down"]
})
_delegate(n18, "keyup", () => _ctx.handleEvent, {
keys: ["left"]
})
_delegate(n19, "keyup", () => _ctx.submit, {
modifiers: ["middle"]
})
_delegate(n20, "keyup", () => _ctx.submit, {
modifiers: ["middle", "self"]
})
_delegate(n21, "keyup", () => _ctx.handleEvent, {
modifiers: ["self"],
keys: ["enter"]
})
_delegate(n7, "contextmenu", () => _withModifiers(_ctx.handleEvent, ["right"]))
_delegate(n8, "click", () => _withModifiers(_ctx.handleEvent, ["left"]))
_delegate(n9, "mouseup", () => _withModifiers(_ctx.handleEvent, ["middle"]))
_delegate(n10, "contextmenu", () => _withKeys(_withModifiers(_ctx.handleEvent, ["right"]), ["enter"]))
_delegate(n11, "keyup", () => _withKeys(_ctx.handleEvent, ["enter"]))
_delegate(n12, "keyup", () => _withKeys(_ctx.handleEvent, ["tab"]))
_delegate(n13, "keyup", () => _withKeys(_ctx.handleEvent, ["delete"]))
_delegate(n14, "keyup", () => _withKeys(_ctx.handleEvent, ["esc"]))
_delegate(n15, "keyup", () => _withKeys(_ctx.handleEvent, ["space"]))
_delegate(n16, "keyup", () => _withKeys(_ctx.handleEvent, ["up"]))
_delegate(n17, "keyup", () => _withKeys(_ctx.handleEvent, ["down"]))
_delegate(n18, "keyup", () => _withKeys(_ctx.handleEvent, ["left"]))
_delegate(n19, "keyup", () => _withModifiers(_ctx.submit, ["middle"]))
_delegate(n20, "keyup", () => _withModifiers(_ctx.submit, ["middle","self"]))
_delegate(n21, "keyup", () => _withKeys(_withModifiers(_ctx.handleEvent, ["self"]), ["enter"]))
return [n0, n1, n2, n3, n4, n5, n6, n7, n8, n9, n10, n11, n12, n13, n14, n15, n16, n17, n18, n19, n20, n21]
}"
`;
Expand Down Expand Up @@ -312,44 +273,40 @@ export function render(_ctx) {
`;

exports[`v-on > should not wrap keys guard if no key modifier is present 1`] = `
"import { delegate as _delegate, delegateEvents as _delegateEvents, template as _template } from 'vue/vapor';
"import { withModifiers as _withModifiers } from 'vue';
import { delegate as _delegate, delegateEvents as _delegateEvents, template as _template } from 'vue/vapor';
const t0 = _template("<div></div>")
_delegateEvents("keyup")

export function render(_ctx) {
const n0 = t0()
_delegate(n0, "keyup", () => _ctx.test, {
modifiers: ["exact"]
})
_delegate(n0, "keyup", () => _withModifiers(_ctx.test, ["exact"]))
return n0
}"
`;

exports[`v-on > should support multiple events and modifiers options w/ prefixIdentifiers: true 1`] = `
"import { delegate as _delegate, delegateEvents as _delegateEvents, template as _template } from 'vue/vapor';
"import { withModifiers as _withModifiers, withKeys as _withKeys } from 'vue';
import { delegate as _delegate, delegateEvents as _delegateEvents, template as _template } from 'vue/vapor';
const t0 = _template("<div></div>")
_delegateEvents("click", "keyup")

export function render(_ctx) {
const n0 = t0()
_delegate(n0, "click", () => _ctx.test, {
modifiers: ["stop"]
})
_delegate(n0, "keyup", () => _ctx.test, {
keys: ["enter"]
})
_delegate(n0, "click", () => _withModifiers(_ctx.test, ["stop"]))
_delegate(n0, "keyup", () => _withKeys(_ctx.test, ["enter"]))
return n0
}"
`;

exports[`v-on > should support multiple modifiers and event options w/ prefixIdentifiers: true 1`] = `
"import { on as _on, template as _template } from 'vue/vapor';
"import { withModifiers as _withModifiers } from 'vue';
import { on as _on, template as _template } from 'vue/vapor';
const t0 = _template("<div></div>")

export function render(_ctx) {
const n0 = t0()
_on(n0, "click", () => _ctx.test, {
modifiers: ["stop", "prevent"],
_on(n0, "click", () => _withModifiers(_ctx.test, ["stop","prevent"]), {
capture: true,
once: true
})
Expand All @@ -358,28 +315,27 @@ export function render(_ctx) {
`;

exports[`v-on > should transform click.middle 1`] = `
"import { delegate as _delegate, delegateEvents as _delegateEvents, template as _template } from 'vue/vapor';
"import { withModifiers as _withModifiers } from 'vue';
import { delegate as _delegate, delegateEvents as _delegateEvents, template as _template } from 'vue/vapor';
const t0 = _template("<div></div>")
_delegateEvents("mouseup")

export function render(_ctx) {
const n0 = t0()
_delegate(n0, "mouseup", () => _ctx.test, {
modifiers: ["middle"]
})
_delegate(n0, "mouseup", () => _withModifiers(_ctx.test, ["middle"]))
return n0
}"
`;

exports[`v-on > should transform click.middle 2`] = `
"import { renderEffect as _renderEffect, on as _on, template as _template } from 'vue/vapor';
"import { withModifiers as _withModifiers } from 'vue';
import { renderEffect as _renderEffect, on as _on, template as _template } from 'vue/vapor';
const t0 = _template("<div></div>")

export function render(_ctx) {
const n0 = t0()
_renderEffect(() => {
_on(n0, (_ctx.event) === "click" ? "mouseup" : (_ctx.event), () => _ctx.test, {
modifiers: ["middle"],
_on(n0, (_ctx.event) === "click" ? "mouseup" : (_ctx.event), () => _withModifiers(_ctx.test, ["middle"]), {
effect: true
})
})
Expand All @@ -388,29 +344,27 @@ export function render(_ctx) {
`;

exports[`v-on > should transform click.right 1`] = `
"import { delegate as _delegate, delegateEvents as _delegateEvents, template as _template } from 'vue/vapor';
"import { withModifiers as _withModifiers } from 'vue';
import { delegate as _delegate, delegateEvents as _delegateEvents, template as _template } from 'vue/vapor';
const t0 = _template("<div></div>")
_delegateEvents("contextmenu")

export function render(_ctx) {
const n0 = t0()
_delegate(n0, "contextmenu", () => _ctx.test, {
modifiers: ["right"]
})
_delegate(n0, "contextmenu", () => _withModifiers(_ctx.test, ["right"]))
return n0
}"
`;

exports[`v-on > should transform click.right 2`] = `
"import { renderEffect as _renderEffect, on as _on, template as _template } from 'vue/vapor';
"import { withModifiers as _withModifiers, withKeys as _withKeys } from 'vue';
import { renderEffect as _renderEffect, on as _on, template as _template } from 'vue/vapor';
const t0 = _template("<div></div>")

export function render(_ctx) {
const n0 = t0()
_renderEffect(() => {
_on(n0, (_ctx.event) === "click" ? "contextmenu" : (_ctx.event), () => _ctx.test, {
modifiers: ["right"],
keys: ["right"],
_on(n0, (_ctx.event) === "click" ? "contextmenu" : (_ctx.event), () => _withKeys(_withModifiers(_ctx.test, ["right"]), ["right"]), {
effect: true
})
})
Expand All @@ -431,15 +385,14 @@ export function render(_ctx) {
`;

exports[`v-on > should wrap both for dynamic key event w/ left/right modifiers 1`] = `
"import { renderEffect as _renderEffect, on as _on, template as _template } from 'vue/vapor';
"import { withModifiers as _withModifiers, withKeys as _withKeys } from 'vue';
import { renderEffect as _renderEffect, on as _on, template as _template } from 'vue/vapor';
const t0 = _template("<div></div>")

export function render(_ctx) {
const n0 = t0()
_renderEffect(() => {
_on(n0, _ctx.e, () => _ctx.test, {
modifiers: ["left"],
keys: ["left"],
_on(n0, _ctx.e, () => _withKeys(_withModifiers(_ctx.test, ["left"]), ["left"]), {
effect: true
})
})
Expand All @@ -460,30 +413,28 @@ exports[`v-on > should wrap in unref if identifier is setup-maybe-ref w/ inline:
`;

exports[`v-on > should wrap keys guard for keyboard events or dynamic events 1`] = `
"import { on as _on, template as _template } from 'vue/vapor';
"import { withModifiers as _withModifiers, withKeys as _withKeys } from 'vue';
import { on as _on, template as _template } from 'vue/vapor';
const t0 = _template("<div></div>")

export function render(_ctx) {
const n0 = t0()
_on(n0, "keydown", () => _ctx.test, {
modifiers: ["stop", "ctrl"],
keys: ["a"],
_on(n0, "keydown", () => _withKeys(_withModifiers(_ctx.test, ["stop","ctrl"]), ["a"]), {
capture: true
})
return n0
}"
`;

exports[`v-on > should wrap keys guard for static key event w/ left/right modifiers 1`] = `
"import { delegate as _delegate, delegateEvents as _delegateEvents, template as _template } from 'vue/vapor';
"import { withKeys as _withKeys } from 'vue';
import { delegate as _delegate, delegateEvents as _delegateEvents, template as _template } from 'vue/vapor';
const t0 = _template("<div></div>")
_delegateEvents("keyup")

export function render(_ctx) {
const n0 = t0()
_delegate(n0, "keyup", () => _ctx.test, {
keys: ["left"]
})
_delegate(n0, "keyup", () => _withKeys(_ctx.test, ["left"]))
return n0
}"
`;
Expand Down
13 changes: 5 additions & 8 deletions packages/compiler-vapor/__tests__/transforms/vOn.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -481,8 +481,7 @@ describe('v-on', () => {
},
])
expect(code).contains(
`_on(n0, "click", () => _ctx.test, {
modifiers: ["stop", "prevent"],
`_on(n0, "click", () => _withModifiers(_ctx.test, ["stop","prevent"]), {
capture: true,
once: true
})`,
Expand Down Expand Up @@ -541,14 +540,12 @@ describe('v-on', () => {

expect(code).matchSnapshot()
expect(code).contains(
`_delegate(n0, "click", () => _ctx.test, {
modifiers: ["stop"]
})`,
`_delegate(n0, "click", () => _withModifiers(_ctx.test, ["stop"])`,
)

expect(code).contains(`_delegate(n0, "keyup", () => _ctx.test, {
keys: ["enter"]
})`)
expect(code).contains(
`_delegate(n0, "keyup", () => _withKeys(_ctx.test, ["enter"])`,
)
})

test('should wrap keys guard for keyboard events or dynamic events', () => {
Expand Down
Loading