Appearance
Vue は DOM イベントのリスニングや、あるイベントを起点に処理を行うイベントハンドリングを v-on
ディレクティブで記述します。v-on は@
に省略することもできます。
実際にマウス入力やキー入力といったイベント処理の事例をサンプル付きで解説します。
マウスイベント
マウスをクリックした時の@click
や要素にカーソルが重なった時@mouseover
の例を示します。
クリック
クリックする度にカウントアップするボタンの例です。@click
でクリックイベントによる処理を記述します。
vue
<template>
<div>
<button
class="btn"
@click="onClick"
>
Click Count : {{ clickCount }}
</button>
</div>
</template>
vue
<script setup lang="ts">
import { ref } from 'vue';
const clickCount = ref(0);
const onClick = () => {
clickCount.value += 1
}
</script>
vue
<style scoped>
.btn {
padding: 10px;
border: 1px solid var(--vp-c-brand);
border-radius: 5px;
}
</style>
カーソル
要素にカーソルが重なった時またはカーソルが重ならなくなった時のイベントを使って、クラススタイルを変更する例です。
vue
<template>
<div>
<button
class="btn"
:class="{ mouseOver : isMouseOver}"
@mouseover="onMouseOver"
@mouseleave="onMouseLeave"
>
{{ isMouseOver ? 'Mouse Over' : 'Mouse Out' }}
</button>
</div>
</template>
vue
<script setup lang="ts">
import { ref } from 'vue';
const mouseOverCount = ref(0);
const isMouseOver = ref(false);
const onMouseOver = () => {
isMouseOver.value = true;
}
const onMouseLeave = () => {
isMouseOver.value = false
}
</script>
vue
<style scoped>
.btn {
padding: 10px;
border: 1px solid var(--vp-c-brand);
border-radius: 5px;
}
.mouseOver {
color: #fff;
background: var(--vp-c-brand);
}
</style>
キーイベント
キー入力した値をイベントオブジェクト(event
)を受け取り、アラート表示する例です。
メソッドの引数にイベントオブジェクトevent
(名前は e などでも可です)を指定しています。
vue
<template>
<div>
<input type="text" v-model="inputText" @keyup="onKeyUp"/>
</div>
</template>
vue
<script setup lang="ts">
import { ref } from 'vue';
const inputText = ref('');
const onKeyUp = (event) => {
alert(`You touch ${event.key} key.`);
}
</script>
vue
<style scoped>
input {
padding: 10px;
border: 1px solid var(--vp-c-brand);
border-radius: 5px;
}
</style>
template 内のインラインハンドラーでイベントオブジェクトを使うことも出来ます。
フォームのサブミットイベント
入力フォームを使ってsubmit
するときの例です。
フォーム送信時のページリロードを@submit.prevent
で防ぐことが出来ます。
vue
<template>
<div>
<form id="submit-form" class="form" @submit.prevent="handleSubmit">
<input class="input-field" type="text" v-model="inputValue" />
<button class="submit-button" type="submit">Submit</button>
</form>
</div>
</template>
vue
<script setup lang="ts">
import { ref } from 'vue';
const inputValue = ref('');
const handleSubmit = () => {
alert(`You submit : ${inputValue.value}`)
}
</script>
vue
<style scoped>
input {
padding: 10px;
border: 1px solid var(--vp-c-brand);
border-radius: 5px;
}
.submit-button {
margin: 10px;
padding: 10px;
border: 1px solid var(--vp-c-brand);
border-radius: 5px;
}
</style>