๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๐Ÿ’ปWEB FrontEnd/ํ”„๋ ˆ์ž„์›Œํฌ Vue

Vue์˜ template์†์„ฑ

<Do it! Vue.js ์ž…๋ฌธ>์„ ๊ธฐ๋ณธ์œผ๋กœ ๋ฐฐ์šด ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค.

 

๋ชฉ์ฐจ

  • <Vue์˜ template์†์„ฑ> 
  • 1. ๋ฐ์ดํ„ฐ ๋ฐ”์ธ๋”ฉ(Data Binding)
  • 2. ๋””๋ ‰ํ‹ฐ๋ธŒ(Directive)
  • 3. ๊ณ ๊ธ‰ ํ…œํ”Œ๋ฆฟ ๊ธฐ๋ฒ•

 

<Vue์˜ template์†์„ฑ>

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

 

- temlate์†์„ฑ์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•

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

2. ES6 : ์‹ฑ๊ธ€ ํŒŒ์ผ ์ปดํฌ๋„ŒํŠธ ์ฒด๊ณ„
<template>
  <p>Hello {{ message }}</p>
</template>

 


1. ๋ฐ์ดํ„ฐ ๋ฐ”์ธ๋”ฉ(Data Binding)

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

 

1) {{}}

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

<div id="app">     //v-once ์†์„ฑ์„ ์ถ”๊ฐ€ํ•˜๋ฉด 1ํšŒ๋งŒ ๋ฐ”์ธ๋”ฉํ•  ์ˆ˜ ์žˆ๋‹ค.
  {{ message }}
</div>

<script>
  new Vue({
    el: '#app',
    data: {
      message: 'Hello Vue.js!'
    }
  });
</script>

{{}}์•ˆ์— ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํ‘œํ˜„์‹์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด ์•ˆ์—๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ์„ ์–ธ๋ฌธ๊ณผ ๋ถ„๊ธฐ ๊ตฌ๋ฌธ์€ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๊ณ , ๋ณต์žกํ•œ ์—ฐ์‚ฐ์€ ์ธ์Šคํ„ด์Šค ์•ˆ์—์„œ ์ฒ˜๋ฆฌํ•˜๊ณ  ํ™”๋ฉด์—๋Š” ๊ฐ„๋‹จํ•œ ์—ฐ์‚ฐ ๊ฒฐ๊ด€๋งŒ ํ‘œ์‹œํ•ด์•ผ ํ•œ๋‹ค.

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

 

2) v-bind

  • ์•„์ด๋””, ํด๋ž˜์Šค, ์Šคํƒ€์ผ ๋“ฑ์˜ HTML ์†์„ฑ ๊ฐ’์— ๋ทฐ ๋ฐ์ดํ„ฐ ๊ฐ’์„ ์—ฐ๊ฒฐํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ์ดํ„ฐ ์—ฐ๊ฒฐ ๋ฐฉ์‹
  • v-bind: ๋ฌธ๋ฒ•์„ :๋กœ ๊ฐ„์†Œํ™”ํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ, v-bind์†์„ฑ์„ ์ด์šฉํ•˜๋Š” ๊ฒƒ์ด ๊ตฌ๋ถ„ํ•˜๊ธฐ ์‰ฌ์›Œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

ex) HTML์†์„ฑ๊ฐ’์— ๋ทฐ ๋ฐ์ดํ„ฐ ๊ฐ’์„ ์—ฐ๊ฒฐ

<html>
  <head>
    <title>Vue Template - Data Binding</title>
  </head>
  <body>
    <div id="app">
      <p v-bind:id="idA">์•„์ด๋”” ๋ฐ”์ธ๋”ฉ</p>
      <p v-bind:class="classA">ํด๋ž˜์Šค ๋ฐ”์ธ๋”ฉ</p>
      <p v-bind:style="styleA">์Šคํƒ€์ผ ๋ฐ”์ธ๋”ฉ</p>
    </div>
    <script src="https://cdn.jsdelivr.net/npm/vue@2.5.2/dist/vue.js"></script>
    <script>
      new Vue({
        el: '#app',
        data: {
          idA: 10,
          classA: 'container',
          styleA: 'color: blue'
        }
      });
    </script>
  </body>
</html>

 


2. ๋””๋ ‰ํ‹ฐ๋ธŒ(Directive)

  • ํ™”๋ฉด์˜ ์š”์†Œ๋ฅผ ๋” ์‰ฝ๊ฒŒ ์กฐ์ž‘ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ๊ธฐ๋Šฅ์œผ๋กœ ๋ทฐ์˜ ๋ฐ์ดํ„ฐ ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜์—ˆ์„ ๋•Œ ํ™”๋ฉด์˜ ์š”์†Œ๋“ค์„ ์ง์ ‘ ์ œ์–ดํ•  ํ•„์š” ์—†์ด ์š”์†Œ๋“ค์ด Reactiveํ•˜๊ฒŒ ๋ฐ˜์‘ํ•˜์—ฌ ๋ณ€๊ฒฝ๋œ ๋ฐ์ดํ„ฐ ๊ฐ’์— ๋”ฐ๋ผ ๊ฐฑ์‹ ๋œ๋‹ค.
  • HTMLํƒœ๊ทธ ์•ˆ์— v-์ ‘๋‘์‚ฌ๋ฅผ ๊ฐ€์ง€๋Š” ๋ชจ๋“  ์†์„ฑ๋“ค์„ ์˜๋ฏธํ•œ๋‹ค.
//๋””๋ ‰ํ‹ฐ๋ธŒ ํ˜•์‹
<a v-if="flag">๋‘์ž‡ Vue.js</a>
๋””๋ ‰ํ‹ฐ๋ธŒ ์ด๋ฆ„ ์—ญํ• 
v-if ์ง€์ •ํ•œ ๋ทฐ ๋ฐ์ดํ„ฐ ๊ฐ’์˜ ์ฐธ, ๊ฑฐ์ง“ ์—ฌ๋ถ€์— ๋”ฐ๋ผ ํ•ด๋‹น HTML ํƒœ๊ทธ๋ฅผ ํ™”๋ฉด์— ํ‘œ์‹œํ•˜๊ฑฐ๋‚˜ ํ‘œ์‹œํ•˜์ง€ ์•Š๋Š”๋‹ค.
v-for ์ง€์ •ํ•œ ๋ทฐ ๋ฐ์ดํ„ฐ์˜ ๊ฐœ์ˆ˜๋งŒํผ ํ•ด๋‹น HTMLํƒœ๊ทธ๋ฅผ ๋ฐ˜๋ณต ์ถœ๋ ฅํ•œ๋‹ค.
v-show v-if์™€ ๊ฐ™์€ ๊ธฐ๋Šฅ์„ ํ•œ๋‹ค.
(๋‹จ, v-if๋Š” ํ•ด๋‹น ํƒœ๊ทธ๋ฅผ ์™„์ „ํžˆ ์‚ญ์ œํ•˜์ง€๋งŒ, v-show๋Š” cssํšจ๊ณผ๋งŒ display:none;์œผ๋กœ ์ง€์ •ํ•œ๋‹ค.)
v-on ํ™”๋ฉด ์š”์†Œ์˜ ์ด๋ฒคํŠธ๋ฅผ ๊ฐ์ง€ํ•˜์—ฌ ์ฒ˜๋ฆฌํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, v-on:click;์€ ํ•ด๋‹น ํƒœ๊ทธ์˜ ํด๋ฆญ ์ด๋ฒคํŠธ๋ฅผ ๊ฐ์ง€ํ•˜์—ฌ ํŠน์ • ๋ฉ”์„œ๋“œ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.
v-bind HTMLํƒœ๊ทธ์˜ ๊ธฐ๋ณธ ์†์„ฑ๊ณผ ๋ทฐ ๋ฐ์ดํ„ฐ ์†์„ฑ์„ ์—ฐ๊ฒฐํ•œ๋‹ค.
v-model - form์—์„œ ์ฃผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ์†์„ฑ
- ํผ์— ์ž…๋ ฅํ•œ ๊ฐ’์„ ๋ทฐ ์ธ์Šคํ„ด์Šค์˜ ๋ฐ์ดํ„ฐ์™€ ์ฆ‰์‹œ ๋™๊ธฐํ™”ํ•œ๋‹ค. ํ™”๋ฉด์— ์ž…๋ ฅ๋œ ๊ฐ’์„ ์ €์žฅํ•˜์—ฌ ์„œ๋ฒ„์— ๋ณด๋‚ด๊ฑฐ๋‚˜ watch์™€ ๊ฐ™์€ ๊ณ ๊ธ‰ ์†์„ฑ์„ ์ด์šฉํ•˜์—ฌ ์ถ”๊ฐ€ ๋กœ์ง์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.
- input, select, textarea ํƒœ๊ทธ์—๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

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

v-on๋””๋ ‰ํ‹ฐ๋ธŒ์™€ methods์†์„ฑ์„ ํ™œ์šฉ

ex)

1. v-on ๋””๋ ‰ํ‹ฐ๋ธŒ ์ด์šฉํ•ด ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌํ•˜๊ธฐ
<html>
  <head>
    <title>Vue Template - Event Handling</title>
  </head>
  <body>
    <div id="app">
      <button v-on:click="clickBtn">ํด๋ฆญ</button>   //v-on๋””๋ ‰ํ‹ฐ๋ธŒ ์ถ”๊ฐ€
		</div>

    <script src="https://cdn.jsdelivr.net/npm/vue@2.5.2/dist/vue.js"></script>
    <script>
      new Vue({
        el: '#app',
        methods: {
          clickBtn: function() {
            alert('clicked');
          }
        }
      });
    </script>
  </body>
</html>


//2. v-on๋””๋ ‰ํ‹ฐ๋ธŒ๋กœ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœํ•  ๋•Œ ์ธ์ž ๊ฐ’ ๋„˜๊ธฐ๊ธฐ
<html>
  <head>
    <title>Vue Template - Event Handling</title>
  </head>
  <body>
    <div id="app">
      <button v-on:click="clickBtn(10)">ํด๋ฆญ</button>
		</div>

    <script src="https://cdn.jsdelivr.net/npm/vue@2.5.2/dist/vue.js"></script>
    <script>
      new Vue({
        el: '#app',
        methods: {
          clickBtn: function(num) {
            alert('clicked ' + num + ' times');
          }
        }
      });
    </script>
  </body>
</html>

 


3. ๊ณ ๊ธ‰ ํ…œํ”Œ๋ฆฟ ๊ธฐ๋ฒ•

1) computed์†์„ฑ

  • ๋ฐ์ดํ„ฐ ์—ฐ์‚ฐ๋“ค์„ ์ •์˜ํ•˜๋Š” ์˜์—ญ
  • data ์†์„ฑ ๊ฐ’์˜ ๋ณ€ํ™”์— ๋”ฐ๋ผ ์ž๋™์œผ๋กœ ๋‹ค์‹œ ์—ฐ์‚ฐํ•œ๋‹ค.
  • ์บ์‹ฑ(๋™์ผํ•œ ์—ฐ์‚ฐ์„ ๋ฐ˜๋ณตํ•ด์„œ ํ•˜์ง€ ์•Š๊ธฐ ์œ„ํ•ด ์—ฐ์‚ฐ์˜ ๊ฒฐ๊ณผ ๊ฐ’์„ ๋ฏธ๋ฆฌ ์ €์žฅํ•˜๊ณ  ์žˆ๋‹ค๊ฐ€ ํ•„์š”ํ•  ๋•Œ ๋ถˆ๋Ÿฌ์˜ด)ํ•œ๋‹ค. => ๋ณต์žกํ•œ ์—ฐ์‚ฐ์„ ๋ฐ˜๋ณต ์ˆ˜ํ–‰ํ•ด์„œ ํ™”๋ฉด์— ๋‚˜ํƒ€๋‚ด์•ผ ํ•  ๋•, methods์†์„ฑ๋ณด๋‹ค computed์†์„ฑ์„ ์ด์šฉํ•˜๋Š” ๊ฒƒ์ด ํšจ์œจ์ ์ด๋‹ค.

ex)

<html>
  <head>
    <title>Vue Template - Computed</title>
  </head>
  <body>
    <div id="app">
      <p>{{ reversedMessage }}</p>
    </div>

    <script src="https://cdn.jsdelivr.net/npm/vue@2.5.2/dist/vue.js"></script>
    <script>
      new Vue({
        el: '#app',
        data: {
          message: 'Hello Vue.js!'
        },
        computed: {
          reversedMessage: function() {
            return this.message.split('').reverse().join('');
          }
        }
      });
    </script>
  </body>
</html>

 

2) watch์†์„ฑ

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

ex)

<html>
  <head>
    <title>Vue Template - Watch</title>
  </head>
  <body>
    <div id="app">
      <input v-model="message">
    </div>

    <script src="https://cdn.jsdelivr.net/npm/vue@2.5.2/dist/vue.js"></script>
    <script>
      new Vue({
        el: '#app',
        data: {
          message: 'Hello Vue.js!'
        },
        watch: {
          message: function(data) {
            console.log("message์˜ ๊ฐ’์ด ๋ฐ”๋€๋‹ˆ๋‹ค : ", data);
          }
        }
      });
    </script>
  </body>
</html>

 

 

 

'๐Ÿ’ปWEB FrontEnd > ํ”„๋ ˆ์ž„์›Œํฌ Vue' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

Vuex  (0) 2021.02.06
Single File Components ์ฒด๊ณ„  (0) 2021.02.06
๋ทฐ HTTP ํ†ต์‹   (0) 2020.07.02
Vue Router  (0) 2020.07.02
Vue Componets ํ†ต์‹   (0) 2020.07.02