Xử lý Enter Key trong Vue.js


93

Tôi đang học Vue.js. Trong Vue của tôi, tôi có một trường văn bản và một nút. Theo mặc định, nút này gửi biểu mẫu khi ai đó nhấn phím Enter trên bàn phím của họ. Khi ai đó đang nhập vào trường văn bản, tôi muốn chụp từng phím được nhấn. Nếu khóa là biểu tượng '@', tôi muốn làm điều gì đó đặc biệt. Nếu phím được nhấn là phím "Enter", tôi cũng muốn làm điều gì đó đặc biệt. Sau này là một trong những thách thức cho tôi. Hiện tại, tôi có Fiddle này , bao gồm mã này:

new Vue({
  el: '#myApp',
  data: {
    emailAddress: '',
    log: ''
  },
  methods: {
    validateEmailAddress: function(e) {
      if (e.keyCode === 13) {
        alert('Enter was pressed');
      } else if (e.keyCode === 50) {
        alert('@ was pressed');
      }      
      this.log += e.key;
    },

    postEmailAddress: function() {
      this.log += '\n\nPosting';
    }
});

Trong ví dụ của tôi, tôi dường như không thể nhấn phím "Enter" nếu không gửi biểu mẫu. Tuy nhiên, tôi mong đợi validateEmailAddresschức năng này ít nhất phải kích hoạt trước để tôi có thể chụp được nó. Nhưng, điều đó dường như không xảy ra. Tôi đang làm gì sai?


1
Tôi thấy không có hình thức trong trò chơi của bạn?
Amresh Venugopal

Câu trả lời:


55

Công cụ sửa đổi sự kiện

Bạn có thể tham khảo công cụ sửa đổi sự kiện trong vuejs để ngăn việc gửi biểu mẫu trên enterkhóa.

Nó là một nhu cầu rất phổ biến để gọi event.preventDefault()hoặc event.stopPropagation()bên trong trình xử lý sự kiện.

Mặc dù chúng ta có thể thực hiện điều này dễ dàng bên trong các phương thức, nhưng sẽ tốt hơn nếu các phương thức có thể hoàn toàn là về logic dữ liệu thay vì phải xử lý các chi tiết sự kiện DOM.

Để giải quyết vấn đề này, Vue cung cấp các công cụ sửa đổi sự kiện cho v-on. Nhớ lại rằng các bổ ngữ là các hậu tố chỉ thị được biểu thị bằng dấu chấm.

<form v-on:submit.prevent="<method>">
  ...
</form>

Như tài liệu đã nêu, đây là đường cú pháp e.preventDefault()và sẽ dừng việc gửi biểu mẫu không mong muốn khi nhấn phím enter.

Đây là một fiddle đang hoạt động.

new Vue({
  el: '#myApp',
  data: {
    emailAddress: '',
    log: ''
  },
  methods: {
    validateEmailAddress: function(e) {
      if (e.keyCode === 13) {
        alert('Enter was pressed');
      } else if (e.keyCode === 50) {
        alert('@ was pressed');
      }      
      this.log += e.key;
    },
    
    postEmailAddress: function() {
			this.log += '\n\nPosting';
    },
    noop () {
      // do nothing ?
    }
  }
})
html, body, #editor {
  margin: 0;
  height: 100%;
  color: #333;
}
<script src="https://unpkg.com/vue@2.2.4/dist/vue.js"></script>
<div id="myApp" style="padding:2rem; background-color:#fff;">
<form v-on:submit.prevent="noop">
  <input type="text" v-model="emailAddress" v-on:keyup="validateEmailAddress" />
  <button type="button" v-on:click="postEmailAddress" >Subscribe</button> 
  <br /><br />
  
  <textarea v-model="log" rows="4"></textarea>  
</form>
</div>


Tôi đã phải sửa đổi điều này thành `@ keyup.native =" validateEmailAddress "để nó hoạt động với thiết lập của tôi trong vue-cli 3
Jesse Reza Khorasanee

120

Trong vue 2, Bạn có thể bắt sự kiện enter bằng cách v-on:keyup.enterkiểm tra tài liệu:

https://vuejs.org/v2/guide/events.html#Key-Modifiers

Tôi để lại một ví dụ rất đơn giản :

var vm = new Vue({
  el: '#app',
  data: {msg: ''},
  methods: {
    onEnter: function() {
       this.msg = 'on enter event';
    }
  }
});
<script src="https://cdn.jsdelivr.net/npm/vue"></script>

<div id="app">
  <input v-on:keyup.enter="onEnter" />
  <h1>{{ msg }}</h1>
</div>

Chúc may mắn


8
Điều này đã cho tôi gợi ý mà tôi cần. Với Buefy, tôi cần thêm bản gốc cho b-input:v-on:keyup.native.enter="onEnter"
Turbo

5
Bạn cũng có thể sử dụng @ keyup.enter = "doSomething"
Dazzle

v-on: keyup.native.enter = "onEnter" chỉ hợp lệ với các thành phần không có trên nút.
Pushplata

Chúng ta có luôn cần một đầu vào để phát hiện các phím bấm không? Tôi đang cố gắng điều khiển băng chuyền Buefy bằng các mũi tên và phím esc (khi ở chế độ toàn màn hình).
Nicke Manarin

21

Bạn quên dấu '}' trước dòng cuối cùng (để đóng "phương thức {...").

Mã này hoạt động:

Vue.config.keyCodes.atsign = 50;

new Vue({
  el: '#myApp',
  data: {
    emailAddress: '',
    log: ''
  },
  methods: {
  
    onEnterClick: function() {
    	alert('Enter was pressed');
    },
    
    onAtSignClick: function() {
    	alert('@ was pressed');
    },
    
    postEmailAddress: function() {
			this.log += '\n\nPosting';
    }
  }
})
html, body, #editor {
  margin: 0;
  height: 100%;
  color: #333;
}
<script src="https://vuejs.org/js/vue.min.js"></script>

<div id="myApp" style="padding:2rem; background-color:#fff;">

  <input type="text" v-model="emailAddress" v-on:keyup.enter="onEnterClick" v-on:keyup.atsign="onAtSignClick" />
  
  <button type="button" v-on:click="postEmailAddress" >Subscribe</button> 
  <br /><br />
  
  <textarea v-model="log" rows="4"></textarea>
</div>


Có trang web nào liệt kê ánh xạ giữa các ký tự và số (như 50 và @) không? Tôi không thể tìm thấy nó trong tài liệu Vue
BusyProgrammer


14

Để xử lý sự kiện nhập, bạn có thể sử dụng

  1. @keyup.enter hoặc là
  2. @keyup.13

13 là mã khóa của enter. Đối với sự kiện khóa @, mã khóa là 50. Vì vậy, bạn có thể sử dụng @keyup.50.

Ví dụ:

<input @keyup.50="atPress()" />

Có trang web nào liệt kê ánh xạ giữa các ký tự và số (như 50 và @) không? Tôi không thể tìm thấy nó trong tài liệu Vue.
BusyProgrammer

tôi có thể sử dụng nhiều chìa khóa không? một cái gì đó giống như @ keydown.1.2?
người ngoài hành tinh
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.