Vueイベント処理方法
多くの場合、Webのユーザーインターフェイスを開発するときは、 DOMイベントの動作をカスタマイズして、より豊かなユーザーエクスペリエンスを提供したいと考えています。 フォームの送信、ボタンのクリック、さらにはスクロールもすべて、コードでリッスンして処理できるDOMイベントに関連付けられています。 これらのイベントのデフォルトの動作を防止または変更するかどうかにかかわらず、目的の動作を実現するには、これらのイベントをリッスンして消費する必要があります。
Vue は、v-on
ディレクティブを提供します。これにより、HTML要素で DOMイベントをリッスンし、イベントの名前を指定してカスタマイズできます。 たとえば、v-on:click
を使用すると、click
DOMイベントを使用できます。 その他の可能性については、MozillaのDOMイベントの完全なリストを確認してください。
インラインイベント処理
v-on
ディレクティブを使用すると、button
でclick
イベントをリッスンし、クリック数を追跡する単純なカウンターをインクリメントできます。 v-on
ディレクティブにJavaScriptコードを提供することで、click
イベントがトリガーされるたびに、コンポーネントのコンテキストでを実行することができます。
InlineMethodComponent.vue
<template> <div> <h2>InlineMethodComponent</h2> <button v-on:click="clicked += 1"> Clicked {{ clicked }} times </button> </div> </template> <script> export default { name: 'InlineMethodComponent', data: function () { return { clicked: 0 } } } </script>
コンポーネントメソッド
DOMイベントを処理できるようになったので、より複雑になるロジックの実装を開始したいと思います。 v-on
ディレクティブ内に一連の複雑なロジックを追加することは、非常に面倒で悪い習慣になります。 幸い、 Vue を使用すると、コンポーネントでイベント処理メソッドを定義できます。 コンポーネントのメソッドの名前をv-on
ディレクティブに渡すだけです。
SimpleMethodComponent.vue
<template> <div> <h2>SimpleMethodComponent</h2> <button v-on:click="log"> Click Me </button> </div> </template> <script> export default { name: 'SimpleMethodComponent', methods: { log() { console.log('Button clicked!'); } } } </script>
インラインメソッド呼び出し
メソッド呼び出しに情報を渡したり、DOMイベント自体を消費したりしたい場合があります。 methodの名前をv-on
ディレクティブに渡す代わりに、 method 自体に呼び出しを渡して、必要な情報を渡すことができます。 DOMイベント自体を含む特別な変数$event
を使用することもできます。
InlineMethodCallComponent.vue
<template> <div> <h2>InlineMethodCallComponent</h2> <button v-on:click="log('clicked!', $event)"> Click Me </button> </div> </template> <script> export default { name: 'InlineMethodCallComponent', methods: { log(msg, event) { console.log(event.target.tagName, msg); } } } </script>
イベントメソッド修飾子
DOMイベントのデフォルトの動作を変更または防止したい場合があります。 Vue は、v-on
ディレクティブに提供するイベントの名前にチェーンできるいくつかの修飾子を提供します。
たとえば、タイプSubmit
のbutton
を含むform
がある場合、ユーザーがクリックするとページが更新されます。 シングルページアプリケーション(SPA)では、ページ全体のリロードを回避したいと考えています。 これを行うには、event.preventDefault()
を呼び出して、イベントがページをリロードしないようにする.prevent
修飾子をチェーンします。 .stop
修飾子は、カスタムイベントハンドラーで呼び出す必要のあるevent.stopPropagation()
を呼び出すことにより、DOMイベントのデフォルトの動作を完全に停止します。
MethodCallModifiersComponent.vue
<template> <div> <h2>MethodCallModifiersComponent</h2> <form v-on:submit.stop.prevent="log('clicked!', $event)"> <button type="Submit"> Click Me </button> </form> </div> </template> <script> export default { name: 'MethodCallModifiersComponent', methods: { log(msg, event) { console.log(event.target.tagName, msg); } } } </script>
イベントメソッドのキー修飾子
キーボードの押下によってトリガーされるDOMイベントがある場合があります。 Vue は、キーベースのイベント用に調整されたイベント修飾子を提供します。
たとえば、input
要素がある場合、Enter
とEsc
の両方のキー押下をリッスンできます。 この動作をカスタマイズすることで、Enter
がlog()
メソッドを呼び出し、Escape
がユーザーに入力をリセットするための迅速な方法を提供できるようになります。
MethodCallKeyModifiersComponent.vue
<template> <div> <h2>MethodCallKeyModifiersComponent</h2> <input placeholder="Press Enter" v-on:keyup.esc.stop="clear" v-on:keyup.enter.stop="log" /> </div> </template> <script> export default { name: 'MethodCallKeyModifiersComponent', methods: { log(event) { console.log( event.target.tagName, event.type, event.key, event.target.value ); }, clear(event) { event.target.value = ''; } } } </script>
まとめ
v-on
ディレクティブのおかげで、DOMイベントの動作を簡単に傍受してカスタマイズできます。 これらのイベントは個々のコンポーネントに関連付けられているため、イベントハンドラーにリッスンを停止するように指示する必要はありません。コンポーネントが破棄されると、イベントは破棄されます。 クリーンアップはありません!