vuejs2 - v-dialog/v-overlay 上的 Vue @keydown 停止工作时存在
问题描述
当存在 < v-card > 时,v-dialog/v-overlay 上的 Vue @keydown 似乎停止工作。为什么这不起作用,以及如何解决?
<v-overlay :value="olyThing" @keydown.esc="olyThing=false" tabindex="0">
<v-card
width="80vw"
height="80vh"
@click="olyThing=false">
</v-card>
</v-overlay>
虽然这确实有效:
<v-overlay :value="olyThing" @keydown.esc="olyThing=false" tabindex="0">
</v-overlay>
不知何故,v-card 阻止了按键通过。试图将@keydown 放在 v-card 上,但这并不能解决问题。在 v-dialog 上的效果相同,而不是在 v-overlay 上。我也尝试过@keydown.native.esc
,但似乎没有任何效果。
我不是在寻找涉及窗口上的 eventHandler 的解决方案。我想将此本地化为组件。
解决方案
我一直无法弄清楚为什么v-card
阻止了@keydown
to 的功能。但是,仍然仅在当前页面上有效而不是全局的替代解决方案是:
一个完整的设置需要三个部分。
- 按下键时调用的方法。
- 添加事件监听器。
- 删除事件侦听器。
您将需要单独的方法以便稍后销毁事件侦听器:
methods: {
onKeydown(e) {
if (this.isOverlay) {
if (e.keyCode == 37) {
console.log('LEFT')
} else if (e.keyCode == 39) {
console.log('RIGHT')
}
}
},
}
mounted() {
// Keypresses on overlay:
document.addEventListener('keydown', this.onKeydown)
},
beforeDestroy() {
document.removeEventListener('keydown',this.onKeydown)
},
感谢西瓜糖的建议。
推荐阅读
- php - 如何在我的列顶部显示数据标签?
- ruby - Ruby/Sinatra 没有从模块文件中传递变量
- paypal - 贝宝 .NET SDK
- rust - 如何在不单独分配堆上的每个项目的情况下创建拥有的特征对象的列表?
- android - Flutter:如何在 Flutter 中使图像的某些区域透明?
- linux - grep pdf文件中的内容并将其部分写入变量
- javascript - 如何使用javascript从arebic内容中删除空间
- c# - .NET Core 3.1 Worker 服务 - 在发布时设置 EnvironmentName
- javascript - 根据属性值删除对象数组中的重复项
- c# - 如何将所有双精度和字符串数据类型隔离到实例集合中