22

in my component I am using VueStrap's modal like this:

<template>
    <modal-window v-model="show" v-on:keyup="keyHandler($event)" @ok="submit()" @cancel="cancel()" @closed="close()" ... >
       ...
    </modal-window>
 ...
</template>
<script> 
    ...
    methods: {
       keyHandler (event) {
           console.log(event);
       }
    },...
</script>

I want handle key press when that modal is opened and ensure submit modal when enter pressed or close modal when esc pressed.

I added custom function keyHandler which is unfortunately never fired. Can you tell me how to fix code to handle key press in that function? Or when is better way how to close and submit vue strap modal I will be grateful for advice. Thank you.

arhak
  • 2,488
  • 1
  • 24
  • 38
Denis Stephanov
  • 4,563
  • 24
  • 78
  • 174

3 Answers3

36

You can attach your event handler to window, that way you can receive all key events and act accordingly depending on your modal's state:

Vue.component('modal', {
  template: '<div>test modal</div>',
});

new Vue({
  el: "#app",
  created() {
    window.addEventListener('keydown', (e) => {
      if (e.key == 'Escape') {
        this.showModal = !this.showModal;
      }
    });
  },
  data: {
    showModal: true
  }
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.16/vue.min.js"></script>
<div id="app">
  <modal v-show="showModal"></modal>
</div>
Amr Noman
  • 2,597
  • 13
  • 24
9

easiest way

<input v-on:keyup.13="whatkey()" type="text"> <br>

looks for if the enter key is pressed then fires a method called whatkey.

roblem
  • 527
  • 5
  • 8
2

Alternatively, you may want to consider using the v-hotkey directive for key input in Vue (docs, github). This will keep your code relatively clean and simple if you must consider several different key inputs.

1.  Install it:

npm i --save v-hotkey
  1.  Have Vue 'use' it:

    import VueHotkey from "v-hotkey"; Vue.use(VueHotkey);

3.  Apply it to your Vue components, like so:

<template>
    <modal-window ... v-hotkey="keymap">
       ...
    </modal-window>
</template>
<script>
  ...
  data() {
    return {
      showModal: false
    };
  },
  computed: {
    keymap() {
      return {
        "esc": this.toggleModal
      };
    }
  },
  methods: {
    toggleModal() {
      this.showModal = !this.showModal;
    }
  }
</script>
arhak
  • 2,488
  • 1
  • 24
  • 38
Cato Minor
  • 2,992
  • 3
  • 29
  • 42