12. keyboard events and modifiers
์ฃผ์
์ด์ ๊ฐ์์์ Vue์์ ์ด๋ฒคํธ๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋ํด ๋ฐฐ์ ์ต๋๋ค. ์ด๋ฒ ๊ฐ์์์๋ ํค๋ณด๋ ์ด๋ฒคํธ์ ๋ํด ๋ค๋ฃน๋๋ค. Vue๋ ํค๋ณด๋ ์ด๋ฒคํธ ์ง์์ ์์ด ๋ง์ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ฉฐ, ํน์ ํค ๋๋ ํค ์ธํธ์ ๋ํ ์ด๋ฒคํธ๋ฅผ ํธ๋ฆฌ๊ฑฐํ ์ ์์ต๋๋ค.
์๋ฅผ ๋ค์ด, ์ค๊ฐ ์ด๋ฆ์ ์ํ ํ๋๋ฅผ ์ถ๊ฐํ๋ ์ํฉ์ ๊ฐ์ ํด ๋ด ์๋ค. ๋ฐ์ดํฐ ๊ฐ์ฒด์ 'Middle Name'์ด๋ผ๋ ์ ์์ฑ์ ์ถ๊ฐํ๊ณ , ์ด๊ธฐ๊ฐ์ ๋น ๋ฌธ์์ด๋ก ์ค์ ํฉ๋๋ค. ์ด์ด์ ์ค๊ฐ ์ด๋ฆ์ ํฌํจํ๋๋ก 'full name' ํจ์๋ฅผ ์ ๋ฐ์ดํธํฉ๋๋ค. ๋ฌธ์ ๋ด์์ ์ฒซ ๋ฒ์งธ์ ๋ง์ง๋ง ์ด๋ฆ ํ๋ ์ฌ์ด์ ์ ์ ๋ ฅ ์์๋ฅผ ์ถ๊ฐํฉ๋๋ค. ์ฐ๋ฆฌ๋ ์ ๋ ฅ ์๊ฐ ์๋ ์ฌ์ฉ์๊ฐ ํค๋ณด๋์ ์ํฐ ํค๋ฅผ ๋๋ฅผ ๋ ๊ฐ์ ๋ณ๊ฒฝํ๊ณ ์ ํฉ๋๋ค. 'keyup' ์ด๋ฒคํธ๋ฅผ ๋ฆฌ์ค๋ํ๊ณ 'updateMiddleName' ํจ์๋ฅผ ํธ์ถํ ๊ฒ์ ๋๋ค.
'keyup' ์ด๋ฒคํธ๋ ์ฌ์ฉ์๊ฐ ํค๋ฅผ ๋๋ฅด๊ณ ๋์ ๋๋ง๋ค ๋ฐ์ํฉ๋๋ค. ์ฐ๋ฆฌ๋ ์ด๋ฒคํธ๋ฅผ ํธ๋ฆฌ๊ฑฐํ ํน์ ํค๋ฅผ ์ ํํ๋ ค๊ณ ํฉ๋๋ค. ์ด ๊ฒฝ์ฐ ์ํฐ ํค๋ง์ ๊ฐ์งํ๋๋ก ํ๋ ค๊ณ ํฉ๋๋ค. ํค๋ณด๋ ์์ ์๋ ์ด๋ฒคํธ ์์ ์์ ์ ์ฌํ๊ฒ ์๋ํ์ง๋ง, ํค๋ณด๋ ์ ๋ ฅ์ ๊ดํ ๊ฒ์ ๋๋ค. ํค๋ณด๋ ์์ ์๋ฅผ ์ฌ์ฉํ๋ฉด ํน์ ํค๋ฅผ ๋ฆฌ์ค๋ํ ์ ์์ผ๋ฉฐ, ์ผ๋ถ ํค์ ๋ํ ๋ณ์นญ๋ ์ ๊ณต๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด, ์ํฐ ํค์ ๋ํ ๋ณ์นญ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
๋ํ, ์ปจํธ๋กค ํค๋ฅผ ๋๋ฅธ ์ํ์์๋ง 'decrement' ํจ์๋ฅผ ํธ๋ฆฌ๊ฑฐํ๋๋ก ์ค์ ํ๋ ์๋ฅผ ๋ค ์ ์์ต๋๋ค. ์ด๋ 'control'์ด๋ผ๋ ์์คํ ์์ ์๋ฅผ ํด๋ฆญ ์ด๋ฒคํธ์ ์ ์ฉํจ์ผ๋ก์จ ์คํํ ์ ์์ต๋๋ค. ์ด๋ฅผ ํ ์คํธํด๋ณด๋ฉด, ์ปจํธ๋กค ํค๋ฅผ ๋๋ฅธ ์ํ์์๋ง 'decrement' ๋ฒํผ์ด ์๋ํ๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
์์ฝํ์๋ฉด, Vue์์๋ ํค๋ณด๋ ์ด๋ฒคํธ๋ฟ๋ง ์๋๋ผ ๋ค๋ฅธ ์ด๋ฒคํธ์๋ ์์ ์๋ฅผ ์ฌ์ฉํ์ฌ ์ด๋ฒคํธ ์ฒ๋ฆฌ ๋ฐฉ์์ ๋ณ๊ฒฝํ ์ ์์ผ๋ฉฐ, ์ด๋ฅผ ํตํด ์ฝ๋๋ฅผ ๋ ๊น๋ํ๊ณ ๊ฐ๋จํ๊ฒ ๋ง๋ค ์ ์์ต๋๋ค.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Vue</title>
<link rel="stylesheet" href="main.css">
</head>
<body>
<div id="app" v-cloak>
<p>{{ fullName() }}</p>
<p><a :href="url" target="_blank">Google</a></p>
<p>{{ raw_url }}</p>
<p v-html="raw_url"></p>
<p>{{ age }}</p>
<hr />
<label>First Name</label>
<input type="text" v-model="firstName">
<br />
<br />
<label>Middle Name</label>
<input type="text" @keyup.enter="updateMiddleName">
<br />
<br />
<label>Last Name</label>
<input type="text" :value="lastName" @input.prevent="updateLastName('Last name event triggered!', $event)">
<br />
<br />
<button type="button" @click="increment">Increment</button>
<button type="button" @click="age--">Decrement</button>
</div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/3.4.6/vue.global.prod.min.js"></script>
<script src="app.js"></script>
</body>
</html>
const vm = Vue.createApp({
data() {
return {
firstName: 'John',
middleName: '',
lastName: 'Doe',
url: 'https://google.com',
raw_url: '<a href="https://google.com" target="_blank">Google</a>',
age: 20,
}
},
methods: {
fullName() {
return `${this.firstName} ${this.middleName} ${this.lastName.toUpperCase()}`
},
increment() {
this.age++;
},
updateLastName(msg, event) {
console.log(msg, event)
this.lastName = event.target.value;
},
updateMiddleName(event) {
console.log(event.target.value)
this.middleName = event.target.value;
},
}
}).mount('#app');
[v-cloak] {
display: none;
}