10. passing on data with events

์ฃผ์ œ

์ด ๊ฐ•์˜์—์„œ๋Š” ์ด๋ฒคํŠธ์™€ ํ•จ๊ป˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋น ๋ฅด๊ฒŒ ์‚ดํŽด๋ด…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์ฝ˜์†”์— ๋กœ๊ทธ๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ๊ฐ„๋‹จํ•œ ๋ฉ”์‹œ์ง€๋ฅผ ์ด๋ฒคํŠธ์™€ ํ•จ๊ป˜ ์ „๋‹ฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. ํ…œํ”Œ๋ฆฟ์˜ ๋””๋ ‰ํ‹ฐ๋ธŒ ์•ˆ์—์„œ "Last name event triggered"๋ผ๋Š” ๋ฉ”์‹œ์ง€๋ฅผ ์ „๋‹ฌํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์€ ํ•จ์ˆ˜๊ฐ€ ์ด๋ฒคํŠธ ๊ฐ์ฒด๋ฅผ ๊ธฐ๋Œ€ํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํ•จ์ˆ˜๋ฅผ ๊นจ๋œจ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•จ์ˆ˜์— ์ธ์ˆ˜๋ฅผ ์ „๋‹ฌํ•˜์ง€ ์•Š์œผ๋ฉด Vue๊ฐ€ ์ด๋ฒคํŠธ ๊ฐ์ฒด๋ฅผ ์ž๋™์œผ๋กœ ์ „๋‹ฌํ•˜์ง€๋งŒ, ์šฐ๋ฆฌ๊ฐ€ ์ž์ฒด ์ธ์ˆ˜๋ฅผ ์ „๋‹ฌํ•˜๋ฉด ์ด๋ฒคํŠธ ๊ฐ์ฒด๋ฅผ ์ˆ˜๋™์œผ๋กœ ์ „๋‹ฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ด๋ฒคํŠธ ๊ฐ์ฒด๋Š” ํŠน๋ณ„ํ•œ ์ด๋ฆ„์ธ $event๋กœ ์ง€์ •๋ฉ๋‹ˆ๋‹ค. ํ…œํ”Œ๋ฆฟ์—์„œ ์ด๋ฒคํŠธ์™€ ๊ด€๋ จ๋œ ๋ฐ์ดํ„ฐ๋ฅผ $event ๊ฐ์ฒด์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ์ดํ›„์—๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋‚ด์˜ ํ•จ์ˆ˜๋ฅผ ์—…๋ฐ์ดํŠธํ•˜์—ฌ ์ƒˆ ์ธ์ˆ˜๋ฅผ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, updateLastName ํ•จ์ˆ˜์—์„œ ์ฒซ ๋ฒˆ์งธ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๋ฉ”์‹œ์ง€๋กœ, ๋‘ ๋ฒˆ์งธ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ด๋ฒคํŠธ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ํ•จ์ˆ˜ ๋‚ด์—์„œ ๋ฉ”์‹œ์ง€ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๋กœ๊ทธํ•˜๊ณ , ๊ธฐ๋ณธ ์ด๋ฒคํŠธ ๋™์ž‘์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค.

ํŽ˜์ด์ง€๋ฅผ ์ƒˆ๋กœ๊ณ ์นจํ•˜๊ณ  ์ฝ˜์†”์„ ์—ด๋ฉด ์ž…๋ ฅํ•œ ๋‚ด์šฉ์— ๋”ฐ๋ผ ๋งˆ์ง€๋ง‰ ์ด๋ฆ„์ด ์—…๋ฐ์ดํŠธ๋˜๊ณ  ํ•จ์ˆ˜์— ์ „๋‹ฌํ•œ ๋ฉ”์‹œ์ง€๊ฐ€ ๋กœ๊ทธ๋ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ธ์ˆ˜๋ฅผ ์ „๋‹ฌํ•˜์—ฌ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ์˜ ๋™์ž‘์„ ์‚ฌ์šฉ์ž ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ถ”๊ฐ€์ ์ธ ์ธ์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•˜๋ ค๋ฉด ํ•จ์ˆ˜๋ฅผ ์—…๋ฐ์ดํŠธํ•˜์—ฌ ์ด๋ฒคํŠธ ๊ฐ์ฒด๋ฅผ ์ˆ˜์šฉํ•˜๋„๋ก ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. Vue๋Š” ์ธ์ˆ˜๋ฅผ ์ œ๊ณตํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ์—๋งŒ ์ž๋™์œผ๋กœ ์ด๋ฅผ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ ๊ฐ•์˜์—์„œ๋Š” ์ด๋ฒคํŠธ์— ๋Œ€ํ•ด ๋” ๋ฐฐ์šธ ์˜ˆ์ •์ž…๋‹ˆ๋‹ค.

index.html
<!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('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>