将键盘事件传递给子组件

Pass keyboard events to child component

查看这个简单的模态组件:

Vue.component('modal-content', {
  template: `
      <div class="modal">
         ...
      </div>
  `,

  props: ['title'],

});

如何从使用它的组件(父级)控制键盘按下?

如果我使用@keyup.esc 事件则它没有任何效果:

<portal to="modal-wrap">
  <modal-content @keyup.esc="doSomething">
  </modal-content>
</portal> 

如果我将 @keyup.esc 放在 DIV 的模态内容组件中,那么它就可以工作,但这对我没有用,因为我需要调用 doSomething 函数存在于父组件

你可以这样做 在你的 doSomething 函数中:

onClickButton (event) {
      this.$emit('clicked', 'someValue')
}

在你的父组件中这样做:

<template>
   <parent-component @clicked="handleClick"></parent-component>
</template>

有关更多信息,请查看:

https://vuejs.org/v2/guide/components.html#Listening-to-Child-Components-Events

还有这个:

https://medium.com/js-dojo/component-communication-in-vue-js-ca8b591d7efa

使用 refs (Accessing Child Component Instances & Child Elements)

<modal-content @keyup.esc="doSomething" ref="modal">

然后在 doSomething 方法中:

this.$refs.modal.close();

假设您在 modal-content 组件中有一个 close() 方法。


您也可以传递 prop,就像您对 title:

所做的那样

<modal-content @keyup.esc="modalIsOpen = false" :modalIsOpen="modalIsOpen">

Vue.component('modal-content', {
  template: `
      <div class="modal" :class="{show: modalIsOpen}">
         ...
      </div>
  `,
  props: ['title' 'modalIsOpen'],
  //...
});

您的代码无法正常工作的原因是您正在尝试监听本机浏览器事件 - 这不是由 Vue 发出的,而是由 DOM 本身发出的。

要对这些类型的事件做出反应,您必须将侦听器附加到实际的 HTMLElement - 而不是 vue 组件。由于这是一个常见问题,vue 提供了一个简单的修饰符,可以自动将事件监听器附加到底层 HTMLElement.native 修饰符。

像这样尝试

<portal to="modal-wrap">
  <modal-content @keyup.esc.native="doSomething">
  </modal-content>
</portal> 

您可以在 vues 中找到更多信息 documentation