Template

๋ทฐ์˜ ํ…œํ”Œ๋ฆฟ์€ HTML, CSS ๋“ฑ์˜ ๋งˆํฌ์—… ์†์„ฑ๊ณผ ๋ทฐ ์ธ์Šคํ„ด์Šค์—์„œ ์ •์˜ํ•œ ๋ฐ์ดํ„ฐ ๋ฐ ๋กœ์ง์„ ์—ฐ๊ฒฐํ•˜์—ฌ ์‚ฌ์šฉ์ž๊ฐ€ ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋Š” ํ˜•ํƒœ์˜ HTML๋กœ ๋ณ€ํ™˜ํ•ด์ฃผ๋Š” ์†์„ฑ์ด๋‹ค.

  • ES5์—์„œ ๋ทฐ ์ธ์Šคํ„ด์Šค์˜ template ์†์„ฑ ํ™œ์šฉ

  • ์‹ฑ๊ธ€ ํŒŒ์ผ ์ปดํฌ๋„ŒํŠธ ์ฒด๊ณ„์˜ <template> ์ฝ”๋“œ ํ™œ์šฉ

ํ…œํ”Œ๋ฆฟ ์†์„ฑ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋‘๊ฐ€์ง€ ๋ฐฉ๋ฒ•์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

1. ES5์—์„œ ๋ทฐ ์ธ์Šคํ„ด์Šค์˜ template ์†์„ฑ ํ™œ์šฉ

new Vue({
  template: '<p>Hello {{message}}</p>'
});

์ด์ „ ์˜ˆ์ œ์—์„œ ์ฃผ๋กœ ์‚ฌ์šฉํ•œ ์œ„์™€ ๊ฐ™์€ ์ฝ”๋“œ์ด๋‹ค.

ํ…œํ”Œ๋ฆฟ์€ ์‚ฌ์šฉ์ž๊ฐ€ ๋ณผ ์ˆ˜๋Š” ์—†์ง€๋งŒ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋‚ด๋ถ€์ ์œผ๋กœ template ์†์„ฑ์—์„œ ์ •์˜ํ•œ ๋งˆํฌ์—… + ๋ทฐ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ƒ ๋” ๊ธฐ๋ฐ˜์˜ render() ํ•จ์ˆ˜๋กœ ๋ณ€ํ™˜ํ•œ๋‹ค. ๋ณ€ํ™˜๋œ render() ํ•จ์ˆ˜๋Š” ์ตœ์ข…์ ์œผ๋กœ ์‚ฌ์šฉ์ž๊ฐ€ ๋ณผ ์ˆ˜ ์žˆ๊ฒŒ ํ™”๋ฉด์„ ๊ทธ๋ฆฌ๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.

  • template ์†์„ฑ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ

<div id="app">
  <h3>{{message}}</h3>
</div>
<script>
  new Vue({
    el: '#app',
    data: {
      message: 'Hello'
    }
  });
</script>

template ์†์„ฑ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ์—๋Š” ์šฐ์„  <h3>{{message}}</h3> ์ฝ”๋“œ๋ฅผ ํ™”๋ฉด์— ํ‘œ์‹œํ•˜๊ณ , ์ธ์Šคํ„ด์Šค๊ฐ€ ์ƒ์„ฑ๋˜๋ฉด message์˜ ๊ฐ’์„ data์†์„ฑ ์•ˆ์˜ ๊ฐ’์œผ๋กœ ์น˜ํ™˜ํ•œ๋‹ค.

  • template ์†์„ฑ์„ ์‚ฌ์šฉํ•œ ๊ฒฝ์šฐ

<div id="app">
</div>
<script>
  new Vue({
    el: '#app',
    data: {
      message: 'Hello'
    },
    template: '<h3>{{message}}</h3>'
  });
</script>

template์†์„ฑ์„ ์‚ฌ์šฉํ•˜๋ฉด ์•„๋ฌด ๋‚ด์šฉ์ด ์—†๋‹ค๊ฐ€ ์ธ์Šคํ„ด์Šค๊ฐ€ ์ƒ์„ฑ๋˜๋ฉด <h3>{{message}}</h3> ์ฝ”๋“œ๊ฐ€ ํ™”๋ฉด์— ์ถ”๊ฐ€๋˜์–ด ํ‘œ์‹œ๋œ๋‹ค.

2. ์‹ฑ๊ธ€ ํŒŒ์ผ ์ปดํฌ๋„ŒํŠธ ์ฒด๊ณ„์˜ <template> ์ฝ”๋“œ ํ™œ์šฉ

<template>
  <p>{{message}}</p>
</template>

๋ฐ์ดํ„ฐ ๋ฐ”์ธ๋”ฉ

๋ฐ์ดํ„ฐ ๋ฐ”์ธ๋”ฉ์€ HTML ํ™”๋ฉด ์š”์†Œ๋ฅผ ๋ทฐ ์ธ์Šคํ„ด์Šค์˜ ๋ฐ์ดํ„ฐ์™€ ์—ฐ๊ฒฐํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.

{{}}

๋ทฐ ์ธ์Šคํ„ด์Šค์˜ ๋ฐ์ดํ„ฐ๋ฅผ HTML ํƒœ๊ทธ์— ์—ฐ๊ฒฐํ•˜๋Š” ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ ํ…์ŠคํŠธ ์‚ฝ์ž… ๋ฐฉ์‹์ด๋‹ค.

<div id="app">
  <h3>{{message}}</h3>
</div>
<script>
  new Vue({
    el: '#app',
    data: {
      message: 'Hello'
    }
  });
</script>

data ์†์„ฑ์˜ message ๊ฐ’์„ {{message}}์— ์—ฐ๊ฒฐํ•˜์—ฌ ํ™”๋ฉด์— ๋‚˜ํƒ€๋‚ด๋Š” ์ฝ”๋“œ์ด๋‹ค. ์—ฌ๊ธฐ์„œ data ์†์„ฑ์˜ message ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜๋ฉด ๋ทฐ ๋ฐ˜์‘์„ฑ์— ์˜ํ•ด ํ™”๋ฉด์ด ์ž๋™์œผ๋กœ ๊ฐฑ์‹ ๋œ๋‹ค.

๋งŒ์•ฝ์— ๋ทฐ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณ€๊ฒฝ๋˜์–ด๋„ ๊ฐ’์„ ๋ฐ”๊พธ๊ณ  ์‹ถ์ง€ ์•Š๋‹ค๋ฉด v-once ์†์„ฑ์„ ์‚ฌ์šฉํ•˜๋ฉด๋œ๋‹ค.

<div id="app">
  <h3 v-once>{{message}}</h3>
</div>
<script>
  new Vue({
    el: '#app',
    data: {
      message: 'Hello'
    }
  });
</script>

v-bind

v-bind๋Š” id, class, style ๋“ฑ์˜ HTML ์†์„ฑ ๊ฐ’์— ๋ทฐ ๋ฐ์ดํ„ฐ ๊ฐ’์„ ์—ฐ๊ฒฐํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ์ดํ„ฐ ์—ฐ๊ฒฐ ๋ฐฉ์‹์ด๋‹ค.

<div id="app">
    <p v-bind:id="idA">ID binding</p>
     <p v-bind:class="classA">Class binding</p>
    <p v-bind:style="styleA">style binding</p>
</div>
<script>
  new Vue({
    el: '#app',
    data: {
      idA: 10,
      classA: 'container',
      styleA: 'color: blue'
    }
  });
</script>

๋‹ค์Œ๊ณผ ๊ฐ™์ด v-bind ์†์„ฑ์œผ๋กœ ์ง€์ •ํ•  HTML ์†์„ฑ์ด๋‚˜ props ์†์„ฑ์•ž์— ์ ‘๋‘์‚ฌ๋กœ ๋ถ™์—ฌ์ฃผ๋ฉด๋œ๋‹ค.

<div id="app">
  <p id="10">ID binding</p>
  <p class="container">Class binding</p>
  <p style="color: blue;">style binding</p>
</div>

์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ๋ฐ์ดํ„ฐ์˜ ๊ฐ’์ด ๊ฐ <p> ์— ์—ฐ๊ฒฐ๋˜์–ด ํ™”๋ฉด์— ๋‚˜ํƒ€๋‚œ๋‹ค.

์—ฌ๊ธฐ์„œ v-bind: ๋ฌธ๋ฒ•์„ : ๋กœ ๊ฐ„์†Œํ™”ํ•  ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด v-bind:id๋Š” :id์™€ ๊ฐ™์€ ๋™์ž‘์„ ํ•œ๋‹ค.

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํ‘œํ˜„์‹

๋ทฐ์˜ ํ…œํ”Œ๋ฆฟ์—์„œ๋„ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํ‘œํ˜„์‹์„ ์“ธ ์ˆ˜ ์žˆ๋‹ค. {{}} ์•ˆ์— ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํ‘œํ˜„์‹์„ ๋„ฃ์œผ๋ฉด ๋œ๋‹ค.

<div id="app">
  <p>{{ message }}</p>
  <p>{{ message + "!!!" }}</p>
  <p>{{ message.split('').reverse().join('') }}</p>
</div>

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํ‘œํ˜„์‹์„ ์‚ฌ์šฉํ•  ๋•Œ ์ฃผ์˜ํ•ด์•ผํ•  ์ ์ด ์žˆ๋‹ค.

  1. ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์„ ์–ธ๋ฌธ๊ณผ ๋ถ„๊ธฐ ๊ตฌ๋ฌธ์€ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค.

  2. ๋ณต์žกํ•œ ์—ฐ์‚ฐ์€ ์ธ์Šคํ„ด์Šค ์•ˆ์—์„œ ์ฒ˜๋ฆฌํ•˜๊ณ  ํ™”๋ฉด์—๋Š” ๊ฐ„๋‹จํ•œ ์—ฐ์‚ฐ ๊ฒฐ๊ณผ๋งŒ ํ‘œ์‹œํ•ด์•ผํ•œ๋‹ค.

<div id="app">
  {{ var a = 10;}} <!-- X, ์„ ์–ธ๋ฌธ์€ ์‚ฌ์šฉ ๋ถˆ๊ฐ€ -->
  {{ if(true){ return 100; } }}<!-- X, ๋ถ„๊ธฐ ๊ตฌ๋ฌธ ์‚ฌ์šฉ ๋ถˆ๊ฐ€ -->
  {{ true? 100 : 0 }} <!-- O, ์‚ผํ•ญ์—ฐ์‚ฐ์ž ํ‘œํ˜„ ๊ฐ€๋Šฅ -->
  {{ message.split('').reverse().join('') }} <!-- X, ๋ณต์žกํ•œ ์—ฐ์‚ฐ์€ ์ธ์Šคํ„ด์Šค ๋‚ด์—์„œ ์ˆ˜ํ–‰ -->
  {{ reversedMessage }} <!-- O, ์Šคํฌ๋ฆฝํŠธ์—์„œ computed ์†์„ฑ์œผ๋กœ ๊ณ„์‚ฐ ํ›„ ์ตœ์ข… ๊ฐ’๋งŒ ํ‘œํ˜„ -->
</div>

computed

cpmputed ์†์„ฑ์€ ๋ฐ์ดํ„ฐ ์—ฐ์‚ฐ๋“ค์„ ์ •์˜ํ•˜๋Š” ์˜์—ญ์ด๋‹ค.

var vm = new Vue({
  el: '#app',
  data: {
    message: 'Hello'
  },
  computed: {
    reversedMessage: function(){
      // ์—ฌ๊ธฐ์„œ this๋Š” vm ์ธ์Šคํ„ด์Šค๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค.
      return this.message.split('').reverse().join('')
    }
  }
});

๋ณต์žกํ•œ ๊ณ„์‚ฐ์€ computed (๋ฐ์ดํ„ฐ ์†์„ฑ์„ ์ž๋™์œผ๋กœ ๊ณ„์‚ฐํ•ด์ฃผ๋Š” ์†์„ฑ)๋ฅผ ์ด์šฉํ•˜์—ฌ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฒƒ์ด ์ข‹๋‹ค. HTML์— ์ตœ์ข…์ ์œผ๋กœ ํ‘œํ˜„๋  ๊ฐ’๋งŒ ๋‚˜ํƒ€๋‚ด๊ณ , ๋ฐ์ดํ„ฐ์˜ ๊ธฐ๋ณธ์—ฐ์‚ฐ์€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋‹จ์—์„œ ํ•จ์œผ๋กœ์จ ํ™”๋ฉด๋‹จ ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋˜ํ•œ ๋ฐ˜๋ณต์ ์ธ ์—ฐ์‚ฐ์— ๋Œ€ํ•ด์„œ๋Š” ๋ฏธ๋ฆฌ ๊ณ„์‚ฐํ•˜์—ฌ ์ €์žฅํ•ด ๋†“๊ณ , ํ•„์š”ํ•  ๋•Œ ๋ฐ”๋กœ ๋ถˆ๋Ÿฌ์˜ค๋Š” caching ํšจ๊ณผ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค.

์ฆ‰, computed ์†์„ฑ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์žฅ์ ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

  • data ์†์„ฑ ๊ฐ’์˜ ๋ณ€ํ™”์— ๋”ฐ๋ผ ์ž๋™์œผ๋กœ ๋‹ค์‹œ ์—ฐ์‚ฐํ•œ๋‹ค.

  • caching : ๋™์ผํ•œ ์—ฐ์‚ฐ์„ ๋ฐ˜๋ณตํ•ด์„œ ํ•˜์ง€ ์•Š๊ธฐ ์œ„ํ•ด ์—ฐ์‚ฐ์˜ ๊ฒฐ๊ณผ ๊ฐ’์„ ๋ฏธ๋ฆฌ ์ €์žฅํ•˜๊ณ  ์žˆ๋‹ค๊ฐ€ ํ•„์š”ํ•  ๋•Œ ๋ถˆ๋Ÿฌ์˜ค๋Š” ๋™์ž‘ ( ์ข…์† ๋Œ€์ƒ )

computed vs methods

methods ์†์„ฑ์€ ํ˜ธ์ถœํ•  ๋•Œ๋งŒ ํ•ด๋‹น ๋กœ์ง์ด ์ˆ˜ํ–‰๋˜๊ณ , computed ์†์„ฑ์€ ๋Œ€์ƒ ๋ฐ์ดํ„ฐ ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜๋ฉด ์ž๋™์ ์œผ๋กœ ์ˆ˜ํ–‰๋œ๋‹ค. ์ฆ‰, ์ˆ˜๋™์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐฑ์‹ ํ•˜๋Š”์ง€, ๋Šฅ๋™์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐฑ์‹ ํ•˜๋Š”์ง€์˜ ์ฐจ์ด์ด๋‹ค.

methods์†์„ฑ์€ ์ˆ˜ํ–‰ํ•  ๋•Œ๋งˆ๋‹ค ์—ฐ์‚ฐ์„ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ณ„๋„๋กœ ์บ์‹ฑ์„ ํ•˜์ง€ ์•Š์ง€๋งŒ, computed ์†์„ฑ์€ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋Š” ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์บ์‹ฑํ•˜๊ณ  ์žˆ๋‹ค๊ฐ€, ํ•„์š”ํ• ๋•Œ ๋ฐ˜ํ™˜ํ•ด ์ค€๋‹ค. ๋”ฐ๋ผ์„œ, ๋ณต์žกํ•œ ์—ฐ์‚ฐ์„ ๋ฐ˜๋ณต ์ˆ˜ํ–‰ํ•ด์„œ ํ™”๋ฉด์— ๋‚˜ํƒ€๋‚ด์•ผ ํ•œ๋‹ค๋ฉด, computed ์†์„ฑ์„ ์ด์šฉํ•˜๋Š” ๊ฒƒ์ด ์„ฑ๋Šฅ๋ฉด์—์„œ ๋” ํšจ์œจ์ ์ด๋‹ค.

 computed: {
        message: function(){
          return Date.now();
        }
      }

computed ์†์„ฑ์€ ์ข…์† ๋Œ€์ƒ์„ ๋”ฐ๋ผ ์ €์žฅ(์บ์‹ฑ)๋˜๊ธฐ ๋•Œ๋ฌธ์— Date.now() ์™€ ๊ฐ™์ด ์•„๋ฌด๊ณณ์—๋„ ์˜์กดํ•˜์ง€ ์•Š๋Š” ์†์„ฑ์€ ์ ˆ๋Œ€๋กœ update๋˜์ง€ ์•Š๋Š”๋‹ค.

computed vs watch

watch ์†์„ฑ์€ ๋ฐ์ดํ„ฐ ๋ณ€ํ™”๋ฅผ ๊ฐ์ง€ํ•ด ์ž๋™์œผ๋กœ ํŠน์ • ๋กœ์ง์„ ์ˆ˜ํ–‰ํ•œ๋‹ค. computed ์†์„ฑ๊ณผ ์œ ์‚ฌํ•˜์ง€๋งŒ computed ์†์„ฑ์€ ๋‚ด์žฅ API๋ฅผ ํ™œ์šฉํ•œ ๊ฐ„๋‹จํ•œ ์—ฐ์‚ฐ์— ์ ํ•ฉํ•œ ๋ฐ˜๋ฉด, watch ์†์„ฑ์€ ๋ฐ์ดํ„ฐ ํ˜ธ์ถœ๊ณผ ๊ฐ™์ด ์‹œ๊ฐ„์ด ์ƒ๋Œ€์ ์œผ๋กœ ๋งŽ์ด ์†Œ๋ชจ๋˜๋Š” ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ์— ์ ํ•ฉํ•˜๋‹ค.

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  <div id="app">
    <input v-model="message">
  </div>
  <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
  <script>
    new Vue({
      el: '#app',
      data: {
        message: 'reverse message',
      },
      watch: {
        message: function(data){
          console.log(data + '๊ฐ’์ด ๋ณ€๊ฒฝ๋ฉ๋‹ˆ๋‹ค.');
        }
      }
    });
  </script>
</body>
</html>

Directive

๋ทฐ ๋””๋ ‰ํ‹ฐ๋ธŒ๋ž€ HTML ํƒœ๊ทธ ์•ˆ์— v-์ ‘๋‘์‚ฌ๋ฅผ ๊ฐ€์ง€๋Š” ๋ชจ๋“  ์†์„ฑ๋“ค์„ ์˜๋ฏธํ•œ๋‹ค. ์•ž์—์„œ ๋‹ค๋ฃฌ v-bind ์†์„ฑ๋„ ๋””๋ ‰ํ‹ฐ๋ธŒ์— ํ•ด๋‹น๋œ๋‹ค. ๋””๋ ‰ํ‹ฐ๋ธŒ๋Š” ํ™”๋ฉด์˜ ์š”์†Œ๋ฅผ ๋” ์‰ฝ๊ฒŒ ์กฐ์ž‘ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ๊ธฐ๋Šฅ์œผ๋กœ ๋ทฐ์˜ ๋ฐ์ดํ„ฐ ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜์—ˆ์„ ๋Œ€ ํ™”๋ฉด์˜ ์š”์†Œ๋“ค์ด ๋ณ€๊ฒฝ๋œ ๋ฐ์ดํ„ฐ ๊ฐ’์— ๋”ฐ๋ผ ๊ฐฑ์‹ ๋œ๋‹ค. ํ™”๋ฉด์˜ ์š”์†Œ๋ฅผ ์ง์ ‘ ์ œ์–ดํ•  ํ•„์š”์—†์ด ๋ทฐ์˜ ๋””๋ ‰ํ‹ฐ๋ธŒ๋ฅผ ํ™œ์šฉํ•ด ํ™”๋ฉด ์š”์†Œ๋ฅผ ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ๋‹ค.

๋””๋ ‰ํ‹ฐ๋ธŒ ์ข…๋ฅ˜

์—ญํ• 

v-if

์ง€์ •ํ•œ ๋ทฐ ๋ฐ์ดํ„ฐ ๊ฐ’์˜ ์ฐธ, ๊ฑฐ์ง“ ์—ฌ๋ถ€์— ๋”ฐ๋ผ ํ•ด๋‹น HTML ํƒœ๊ทธ๋ฅผ ํ™”๋ฉด์— ํ‘œ์‹œํ•˜๊ฑฐ๋‚˜ ํ‘œ์‹œํ•˜์ง€ ์•Š๋Š”๋‹ค. (ํ•ด๋‹น ํƒœ๊ทธ ์™„์ „ํžˆ ์‚ญ์ œ)

v-for

์ง€์ •ํ•œ ๋ทฐ ๋ฐ์ดํ„ฐ์˜ ๊ฐœ์ˆ˜๋งŒํผ ํ•ด๋‹น HTML ํƒœ๊ทธ๋ฅผ ๋ฐ˜๋ณต ์ถœ๋ ฅํ•œ๋‹ค.

v-show

v-if์™€ ์œ ์‚ฌํ•˜๊ฒŒ ๋ฐ์ดํ„ฐ์˜ ์ง„์œ„ ์—ฌ๋ถ€์— ๋”ฐ๋ผ ํ•ด๋‹น HTML ํƒœ๊ทธ๋ฅผ ํ™”๋ฉด์— ํ‘œ์‹œํ•˜๊ฑฐ๋‚˜ ํ‘œ์‹œํ•˜์ง€ ์•Š๋Š”๋‹ค. (display:none css ๋ฅผ ์ฃผ์–ด ์‹ค์ œ ํƒœ๊ทธ๋Š” ๋‚จ์•„ ์žˆ๊ณ , ํ™”๋ฉด์ƒ์œผ๋กœ๋งŒ ๋ณด์ด์ง€ ์•Š์Œ)

v-bind

HTML ํƒœ๊ทธ์˜ ๊ธฐ๋ณธ ์†์„ฑ๊ณผ ๋ทฐ ๋ฐ์ดํ„ฐ ์†์„ฑ ์—ฐ๊ฒฐ

v-on(@)

ํ™”๋ฉด ์š”์†Œ์˜ ์ด๋ฒคํŠธ๋ฅผ ๊ฐ์ง€ํ•˜์—ฌ ์ฒ˜๋ฆฌํ•  ๋•Œ ์‚ฌ์šฉ v-on:์„ ๊ฐ„์†Œํ™”ํ•œ ๋ฌธ๋ฒ•์€ @ ์ด๋‹ค.

v-model

form์—์„œ ์ฃผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ์†์„ฑ์œผ๋กœ, ํผ์— ์ž…๋ ฅํ•œ ๊ฐ’์„ ๋ทฐ ์ธ์Šคํ„ด์Šค์˜ ๋ฐ์ดํ„ฐ์™€ ์ฆ‰์‹œ ๋™๊ธฐํ™”ํ•œ๋‹ค. ํ™”๋ฉด์— ์ž…๋ ฅ๋œ ๊ฐ’์„ ์ €์žฅํ•ด ์„œ๋ฒ„์— ๋ณด๋‚ด๊ฑฐ๋‚˜ watch ์™€ ๊ฐ™์€ ์†์„ฑ์„ ์ด์šฉํ•ด ์ถ”๊ฐ€ ๋กœ์ง์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค. <input>, <select>, <textarea> ํƒœ๊ทธ์—๋งŒ ์‚ฌ์šฉ๊ฐ€๋Šฅ

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  <div id="app">
    <a v-if="flag">vue.js</a>
    <ul>
      <li v-for="system in systems">{{system}}</li>
    </ul>
    <p v-show="flag">vue.js</p>
    <h5 v-bind:id="uid">Vue Documents</h5>
    <button v-on:click="popupAlert">alert</button>
  </div>
  <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
  <script>
    new Vue({
      el: '#app',
      data: {
        flag: false,
        systems: ['ios', 'window', 'android'],
        uid: 10
      },
      methods: {
        popupAlert: function(){
          return alert('alert!!');
        }
      }
    });
  </script>
</body>
</html>

์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ

๋ทฐ ํ™”๋ฉด์—์„œ ๋ฐœ์ƒํ•œ ์ด๋ฒคํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด v-on ๋””๋ ‰ํ‹ฐ๋ธŒ์™€ methods ์†์„ฑ์„ ํ™œ์šฉํ•œ๋‹ค.

<div id="app">
  <button v-on:click="clickBtn">ํด๋ฆญ</button>
</div>
var vm = new Vue({
  el: '#app',
  methods: {
    clickBtn: function(){
      alert('clicked');
    }
  }
});

๋‹ค์Œ ์˜ˆ์ œ๋Š” v-on:click ๋””๋ ‰ํ‹ฐ๋ธŒ๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ํด๋ฆญ ๋ฒ„ํŠผ ํด๋ฆญ์‹œ clickBtn ๋ฉ”์„œ๋“œ๊ฐ€ ์‹คํ–‰๋œ๋‹ค.

<div id="app">
  <button v-on:click="clickBtn(10)">ํด๋ฆญ</button>
</div>
var vm = new Vue({
  el: '#app',
  methods: {
    clickBtn: function(num){
      alert('clicked'+num);
    }
  }
});

๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ธ์ž๋ฅผ ๋„˜๊ธธ ์ˆ˜ ์žˆ๋‹ค. ์ถ”๊ฐ€์ ์œผ๋กœ event ์ธ์ž๋ฅผ ์ด์šฉํ•ด ํ™”๋ฉด ๋” ์ด๋ฒคํŠธ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.

<div id="app">
  <button v-on:click="clickBtn">ํด๋ฆญ</button>
</div>
var vm = new Vue({
  el: '#app',
  methods: {
    clickBtn: function(event){
        console.log(event);
    }
  }
});

function(event){} ์™€ ๊ฐ™์ด event ์ธ์ž๋ฅผ ์ •์˜ํ•˜๋ฉด ํ•ด๋‹น ๋” ์š”์†Œ์˜ ์ด๋ฒคํŠธ ๊ฐ์ฒด์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.

MouseEvent {isTrusted: true, screenX: 2181, screenY: 557, clientX: 25, clientY: 356, โ€ฆ}

Last updated