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>