Для обработки событий элементов html в Vue.js используется директива v-on, после которой через двоеточие указывается тип события:
v-on:click="действия"
В качестве типа события используется любое стандартное событие элементов на веб-странице. Затем этой директиве в кавычках передаются те действия, которые должны выполниться при возникновении события. Например:
<!DOCTYPE html> <html> <head> <title>Изучаем Vue.js</title> <meta charset="utf-8" /> </head> <body> <div id="app"> <button v-on:click="counter++">+</button> <button v-on:click="if(counter>0) counter--;">-</button> <div>{{counter}}</div> </div> <script src="https://unpkg.com/vue@2.7.14/dist/vue.js"></script> <script> var app = new Vue({ el: '#app', data: {counter:0}, }); </script> </body> </html>
В качестве действия директиве v-on можно передать любые валидные операции JavaScript. В данном случае, так как у нас определено во Vue свойство
counter
, то мы можем манипулировать значением этого свойства:
<button v-on:click="counter++">+</button> <button v-on:click="if(counter>0) counter--;">-</button>
Фактически мы передаем директивам v-on кусок кода JavaScript, где свойства из Vue доступны как обычные переменные.
Также мы можем использовать сокращенный синтаксис для определения обработчиков событий:
<button @click="counter++">+</button> <button @click="if(counter>0) counter--;">-</button>
Однако в случае более сложных операций такой подход не является оптимальным. И в этом случае, как правило, все операции, которые надо вызывать при возникновении события, выносятся в отдельные методы объекта Vue. Например, перепишем предыдущий пример:
<div id="app"> <button v-on:click="increase">+</button> <button v-on:click="decrease">-</button> <div>{{counter}}</div> </div> <script src="https://unpkg.com/vue@2.7.14/dist/vue.js"></script> <script> var app = new Vue({ el: '#app', data: {counter:0}, methods:{ increase: function(){ this.counter++; }, decrease: function(){ if(this.counter>0) this.counter--; } } }); </script>
При нажатии на одну кнопку срабатывает метод increase, который увеличивает значение переменной counter. При нажатии на вторую кнопку вызывается метод decrease, который уменьшает это значение.
При генерации события в его обработчике в качестве параметра мы можем получить объект, который инкапсулирует всю информацию о событии:
<div id="app"> <button v-on:click="increase">+</button> <button v-on:click="decrease">-</button> <div>{{counter}}</div> </div> <script src="https://unpkg.com/vue@2.7.14/dist/vue.js"></script> <script> var app = new Vue({ el: '#app', data: {counter:0}, methods:{ increase: function(event){ console.log(event); this.counter++; }, decrease: function(event){ console.log(event); this.counter--; } } }); </script>
В качестве параметра в методы-обработчики события передается объект события. Это стандартный объект, который используется при обработке событий в обычном JavaScript. В зависимости от типа события этот объект может нести разную информацию.
Кроме того, мы можем передать в методы для обработки событий какие-то дополнительные значения:
<div id="app"> <button v-on:click="increase(3)">+</button> <button v-on:click="decrease(2)">-</button> <div>{{counter}}</div> </div> <script src="https://unpkg.com/vue@2.7.14/dist/vue.js"></script> <script> var app = new Vue({ el: '#app', data: {counter:0}, methods:{ increase: function(n){ this.counter = this.counter + n; }, decrease: function(n){ this.counter = this.counter - n; } } }); </script>
В данном случае увеличение переменной counter будет идти на 3, а уменьшение - на 2.
И также мы можем совместить передачу значений и объекта события:
<div id="app"> <button v-on:click="increase(3, $event)">+</button> <button v-on:click="decrease(2, $event)">-</button> <div>{{counter}}</div> </div> <script src="https://unpkg.com/vue@2.7.14/dist/vue.js"></script> <script> var app = new Vue({ el: '#app', data: {counter:0}, methods:{ increase: function(n, event){ console.log(event) this.counter = this.counter + n; }, decrease: function(n, event){ this.counter = this.counter - n; } } }); </script>
Для передачи объекта события в обработчик передается специальный объект $event.