如何在 Vue 3 中将键盘事件传播给父级?
How to propagate keyboard event to parent in Vue 3?
在我的 Vue 3 应用程序中,我嵌套了五层深的组件。顶层组件 TopCom 和底层组件 MostInnerCom 都有一个 @keydown 处理程序。
如果 MostInnerCom 有焦点并且按下了 MostInnerCom 无法处理的键,则该事件应由 TopCom 处理。如何实现?
我使用嵌套 div 而不是嵌套组件创建了一个非常简单的演示。请参阅 this small demo in codepen。
这是相关的代码片段,它不起作用:
Vue.createApp({
setup() {
const keycode = Vue.ref('')
function onKeydownForApp(e) {
keycode.value = '***'
}
function onKeydownForButton(e) {
if (e.code === 'KeyA') {
parent.dispatchEvent(new KeyboardEvent(e.type, e))
} else {
keycode.value = e.code
}
}
return {
keycode,
onKeydownForApp,
onKeydownForButton
}
}
}).mount('#app')
<script src="https://unpkg.com/vue@next"></script>
<main id="app">
<div @keydown="onKeydownForApp" tabindex="-1">
<input type=text>
<div>
<button @keydown.stop="onKeydownForButton">- K -</button>
keycode={{keycode}}
</div>
</div>
</main>
全局变量parent
引用window.parent
,即父文档,而不是父HTML元素。一种解决方案是向按钮周围的 div 添加一个 id 属性,例如<div id="parentDiv">
然后让 parent
参考这个 div:
var parent = document.getElementById('parentDiv');
在我的 Vue 3 应用程序中,我嵌套了五层深的组件。顶层组件 TopCom 和底层组件 MostInnerCom 都有一个 @keydown 处理程序。
如果 MostInnerCom 有焦点并且按下了 MostInnerCom 无法处理的键,则该事件应由 TopCom 处理。如何实现?
我使用嵌套 div 而不是嵌套组件创建了一个非常简单的演示。请参阅 this small demo in codepen。
这是相关的代码片段,它不起作用:
Vue.createApp({
setup() {
const keycode = Vue.ref('')
function onKeydownForApp(e) {
keycode.value = '***'
}
function onKeydownForButton(e) {
if (e.code === 'KeyA') {
parent.dispatchEvent(new KeyboardEvent(e.type, e))
} else {
keycode.value = e.code
}
}
return {
keycode,
onKeydownForApp,
onKeydownForButton
}
}
}).mount('#app')
<script src="https://unpkg.com/vue@next"></script>
<main id="app">
<div @keydown="onKeydownForApp" tabindex="-1">
<input type=text>
<div>
<button @keydown.stop="onKeydownForButton">- K -</button>
keycode={{keycode}}
</div>
</div>
</main>
全局变量parent
引用window.parent
,即父文档,而不是父HTML元素。一种解决方案是向按钮周围的 div 添加一个 id 属性,例如<div id="parentDiv">
然后让 parent
参考这个 div:
var parent = document.getElementById('parentDiv');