9. listening to events
์ฃผ์
์ด ๊ฐ์์์๋ Vue.js๋ฅผ ์ฌ์ฉํ์ฌ ๊ธฐ๋ณธ ๋ธ๋ผ์ฐ์ ์ด๋ฒคํธ(์: ํด๋ฆญ, ํค ์ ๋ ฅ, ํธ๋ฒ ๋ฑ)๋ฅผ ๊ฐ์งํ๊ณ ์ด์ ๋์ํ๋ ๊ธฐ๋ฅ์ ๊ตฌํํ๋ ๋ฐฉ๋ฒ์ ๋ํด ๋ฐฐ์๋๋ค. Vue.js์์๋ ๋๋ ํฐ๋ธ๋ฅผ ์ฌ์ฉํ์ฌ ์ ํ๋ฆฌ์ผ์ด์ ๋ด์์ ์ด๋ฒคํธ๋ฅผ ์ฝ๊ฒ ๋ฆฌ์ค๋ํ ์ ์์ต๋๋ค.
๋จผ์ "Age"๋ผ๋ ์ ๋ฐ์ดํฐ ์์ฑ์ ๋ง๋ค๊ณ , ์ด ๊ฐ์ ํ ํ๋ฆฟ ์์์ ํ์ํ๋ ๋ฐฉ๋ฒ์ ์ค๋ช ํฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ ์ฌ์ฉ์๊ฐ ๋ฒํผ์ ํด๋ฆญํ ๋๋ง๋ค ๋์ด๊ฐ ์ฆ๊ฐํ๊ฑฐ๋ ๊ฐ์ํ๋ ๋ฒํผ์ ์ถ๊ฐํ๋ ๋ฐฉ๋ฒ์ ์๊ฐํฉ๋๋ค. ์ด๋ฅผ ์ํด v-on ๋๋ ํฐ๋ธ๋ฅผ ์ฌ์ฉํ์ฌ ํด๋ฆญ ์ด๋ฒคํธ๋ฅผ ๊ฐ์งํ๊ณ , ์ด ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ ๋ ๋์ด ์์ฑ์ ์ ๋ฐ์ดํธํ๋ ํจ์๋ฅผ ์คํํฉ๋๋ค.
๋ํ, v-model ๋๋ ํฐ๋ธ๋ฅผ ์ฌ์ฉํ์ฌ ์ ๋ ฅ ํ๋์ ๋ฐ์ดํฐ ์์ฑ ๊ฐ์ ์๋ฐฉํฅ ๋ฐ์ธ๋ฉ์ ์ค๋ช ํฉ๋๋ค. ํ์ง๋ง ๋ ๋ง์ ์ ์ด๋ฅผ ์ํ ๊ฒฝ์ฐ v-model ๋์ v-bind๋ฅผ ์ฌ์ฉํ์ฌ ์ ๋ ฅ ํ๋์ ๊ฐ์ ์๋์ผ๋ก ์ ๋ฐ์ดํธํ๋ ๋ฐฉ๋ฒ์ ์๊ฐํฉ๋๋ค. ์ด๋ ๊ฒ ํจ์ผ๋ก์จ, Vue.js๊ฐ ์ด๊ธฐ์ ์ค์ ํ ๊ฐ๋ง์ ์ฌ์ฉํ๋ ๋์ , ์ ๋ ฅ ํ๋์ ๋ณ๊ฒฝ์ฌํญ์ ๊ฐ์งํ๊ณ ๋ฐ์ดํฐ ์์ฑ์ ์ ๋ฐ์ดํธํ ์ ์์ต๋๋ค.
๋ง์ง๋ง์ผ๋ก, Vue.js์์ ์ด๋ฒคํธ ๋ฆฌ์ค๋๊ณผ ๋ฐ์ดํฐ ๋ฐ์ธ๋ฉ์ ์ฌ์ฉํ์ฌ v-model ๋๋ ํฐ๋ธ์ ์ ์ฌํ ๊ธฐ๋ฅ์ ๊ตฌํํ๋ ๋ฐฉ๋ฒ์ ๋ณด์ฌ์ค๋๋ค. ์ด ๊ณผ์ ์์ ํ์ํ ๊ฒฝ์ฐ ์ถ๊ฐ์ ์ธ ์ ์ด๋ฅผ ํ ์ ์๋ ์ฅ์ ์ด ์์ต๋๋ค. v-model์ ํธ์๋ฅผ ์ํ ๊ตฌ๋ฌธ์ ์คํ(syntactic sugar)์ผ๋ก ์ค๋ช ๋๋ฉฐ, ์ฌ์ฉ์๋ ํ์์ ๋ฐ๋ผ v-model ๋๋ ์๋ ๋ฐ์ธ๋ฉ๊ณผ ์ด๋ฒคํธ ๋ฆฌ์ค๋ ์ค ํ๋๋ฅผ ์ ํํ ์ ์์ต๋๋ค. ๊ฐ๋ฅํ ๊ฒฝ์ฐ v-model ์ฌ์ฉ์ ๊ถ์ฅํ๋ฉฐ, ์ด๋ ์ฝ๋ ์์ฑ์ ์ค์ผ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
<!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>Last Name</label>
<input type="text" :value="lastName" @input="updateLastName">
<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',
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.lastName.toUpperCase()}`
},
increment() {
this.age++;
},
updateLastName(event) {
this.lastName = event.target.value;
},
}
}).mount('#app');
[v-cloak] {
display: none;
}