๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
  • What would life be If we had no courage to attemp anything?
Development/Vue.js

Vue.js - Template Syntax

by DevIseo 2022. 5. 7.

๐Ÿ””Template Syntax

|Template Syntax

  • ๋ Œ๋”๋ง ๋œ DOM์„ ๊ธฐ๋ณธ Vue ์ธ์Šคํ„ด์Šค์˜ ๋ฐ์ดํ„ฐ์— ์„ ์–ธ์ ์œผ๋กœ ๋ฐ”์ธ๋”ฉํ•  ์ˆ˜ ์žˆ๋Š” HTML ๊ธฐ๋ฐ˜ ํ…œํ”Œ๋ฆฟ ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉ
    • Interpolation
    • Directive

|Interpolation(๋ณด๊ฐ„๋ฒ•)

1.Text
<span>๋ฉ”์‹œ์ง€: {{message}} </span>

2. Raw HTML
<span v-html="rawHtml"></span>

3.Attributes
<div v-bind:id="dynamicID"></div>

4.JSํ‘œํ˜„์‹
{{number+1}}
{{message.split('').reverse().join('')}}

|Directive(๋””๋ ‰ํ‹ฐ๋ธŒ)

  • v- ์ ‘๋‘์‚ฌ๊ฐ€ ์žˆ๋Š” ํŠน์ˆ˜ ์†์„ฑ
  • ์†์„ฑ ๊ฐ’์€ ๋‹จ์ผ JS ํ‘œํ˜„์‹์ด ๋จ (v-for๋Š” ์˜ˆ์™ธ)
  • ํ‘œํ˜„์‹์˜ ๊ฐ’์ด ๋ณ€๊ฒฝ๋  ๋•Œ ๋ฐ˜์‘์ ์œผ๋กœ DOM์— ์ ์šฉํ•˜๋Š” ์—ญํ• ์„ ํ•จ
  • ์ „๋‹ฌ์ธ์ž(Arguments)
    • : (์ฝœ๋ก )์„ ํ†ตํ•ด ์ „๋‹ฌ์ธ์ž๋ฅผ ๋ฐ›์„ ์ˆ˜๋„ ์žˆ์Œ
    <a v-bind:href="url">...</a>
    <a v-on:click="doSomething">...</a>
    
  • ์ˆ˜์‹์–ด (Modifiers)
    • . (์ )์œผ๋กœ ํ‘œ์‹œ๋˜๋Š” ํŠน์ˆ˜ ์ ‘๋ฏธ์‚ฌ
    • directive๋ฅผ ํŠน๋ณ„ํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ๋ฐ”์ธ๋”ฉ ํ•ด์•ผ ํ•จ์„ ๋‚˜ํƒ€๋ƒ„
    <from v-on:submit.prevent="onSubmit">...</form>
    

|v-text —→๊ณต๊ฒฉ์— ์ทจ์•ฝ.

  • ์—˜๋ฆฌ๋จผํŠธ์˜ textContent๋ฅผ ์—…๋ฐ์ดํŠธ
  • ๋‚ด๋ถ€์ ์œผ๋กœ interpolation ๋ฌธ๋ฒ•์ด v-text๋กœ ์ปดํŒŒ์ผ ๋จ
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  <div id="app">
    <p>{{ message }}</p>
    <p v-text="message"></p>
  </div>
  
  <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
  <script>
    const app = new Vue({
      el:'#app',
      data:{
        message:'Hello'
      }
    })
  </script>
</body>
</html>

 

 

|v-html —→์ ˆ๋Œ€ ์‚ฌ์šฉ ๊ธˆ์ง€

  • ์—˜๋ฆฌ๋จผํŠธ์˜ innerHTML์„ ์—…๋ฐ์ดํŠธ
    • XSS ๊ณต๊ฒฉ์— ์ทจ์•ฝํ•  ์ˆ˜ ์žˆ์Œ
  • ์ž„์˜๋กœ ์‚ฌ์šฉ์ž๋กœ๋ถ€ํ„ฐ ์ž…๋ ฅ ๋ฐ›์€ ๋‚ด์šฉ์€ v-html์— ‘์ ˆ๋Œ€’ ์‚ฌ์šฉ ๊ธˆ์ง€
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  <div id="app">
    <p>{{ message }}</p>
    <p v-text="message"></p>
    <p v-html="message"></p>
  </div>
  
  <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
  <script>
    const app = new Vue({
      el:'#app',
      data:{
        message: '<strong>๊ฐ•ํ•˜๋‹ท</strong>'
      }
    })
  </script>
</body>
</html>

 

 

|v-show — CSS์†์„ฑ๋งŒ ๊ฑด๋“œ๋ฆด ๋•Œ ์‚ฌ์šฉ. ๋˜๋„๋ก v-if๋ฅผ ์‚ฌ์šฉํ•  ๊ฒƒ

  • ์กฐ๊ฑด๋ถ€ ๋ Œ๋”๋ง ์ค‘ ํ•˜๋‚˜
  • ์š”์†Œ๋Š” ํ•ญ์ƒ ๋ Œ๋”๋ง ๋˜๊ณ  DOM์— ๋‚จ์•„์žˆ์Œ
  • ๋‹จ์ˆœํžˆ ์—˜๋ฆฌ๋จผํŠธ์— display CSS ์†์„ฑ์„ ํ† ๊ธ€ํ•˜๋Š” ๊ฒƒ
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  <div id="app">
    <p v-show="isTrue">TRUE</p>
    <p v-show="isFalse">FALSE</p>
  </div>
  
  <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
  <script>
      const app = new Vue({
      el:'#app',
      data:{
        isTrue: true,
        isFalse: false,
      }
    })
  </script>
</body>
</html>

 

|v-if, v-else-if, v-else

  • ์กฐ๊ฑด๋ถ€ ๋ Œ๋”๋ง ์ค‘ ํ•˜๋‚˜
  • ์กฐ๊ฑด์— ๋”ฐ๋ผ ์š”์†Œ๋ฅผ ๋ Œ๋”๋ง
  • directive์˜ ํ‘œํ˜„์‹์ด true์ผ ๋•Œ๋งŒ ๋ Œ๋”๋ง
  • ์—˜๋ฆฌ๋จผํŠธ ๋ฐ ํฌํ•จ๋œ directive๋Š” ํ† ๊ธ€ํ•˜๋Š” ๋™์•ˆ ์‚ญ์ œ๋˜๊ณ  ๋‹ค์‹œ ์ž‘์„ฑ๋จ
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  <div id="app">
    <P v-if="seen">seen is True</P>

    <p v-if="myType === 'A' ">A</p>
    <p v-else-if="myType === 'B' ">B</p>
    <p v-else-if="myType === 'C' ">C</p>
    <p v-else>NOT A/B/C</p>
  </div>

  <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
  <script>
      const app = new Vue({
      el:'#app',
      data:{
        seen:false,
        myType: 'A',
      }
    })
  </script>
</body>
</html>

 

|v-show์™€ v-if

v-show (Expensive initial load, cheap toggle)

  • CSS display ์†์„ฑ์„ hidden์œผ๋กœ ๋งŒ๋“ค์–ด ํ† ๊ธ€
  • ์‹ค์ œ๋กœ ๋ Œ๋”๋ง์€ ๋˜์ง€๋งŒ ๋ˆˆ์—์„œ ๋ณด์ด์ง€ ์•Š๋Š” ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋”ฑ ํ•œ ๋ฒˆ๋งŒ ๋ Œ๋”๋ง์ด ๋˜๋Š” ๊ฒฝ์šฐ๋ผ๋ฉดv-if์— ๋น„ํ•ด ์ƒ๋Œ€์ ์œผ๋กœ ๋ Œ๋”๋ง ๋น„์šฉ์ด ๋†’์Œ
  • ํ•˜์ง€๋งŒ, ์ž์ฃผ ๋ณ€๊ฒฝ๋˜๋Š” ์š”์†Œ๋ผ๋ฉด ํ•œ ๋ฒˆ ๋ Œ๋”๋ง ๋œ ์ดํ›„๋ถ€ํ„ฐ๋Š” ๋ณด์—ฌ์ฃผ๋Š”์ง€์— ๋Œ€ํ•œ ์—ฌ๋ถ€๋งŒ ํŒ๋‹จํ•˜๋ฉด ๋˜๊ธฐ ๋•Œ๋ฌธ์— ํ† ๊ธ€ ๋น„์šฉ์ด ์ ์Œ

v-if (Cheap initial load, expensive toggle)

  • ์ „๋‹ฌ์ธ์ž๊ฐ€ false์ธ ๊ฒฝ์šฐ ๋ Œ๋”๋ง ๋˜์ง€ ์•Š์Œ
  • ํ™”๋ฉด์—์„œ ๋ณด์ด์ง€ ์•Š์„ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋ Œ๋”๋ง ์ž์ฒด๊ฐ€ ๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋ Œ๋”๋ง ๋น„์šฉ์ด ๋‚ฎ์Œ
  • ํ•˜์ง€๋งŒ, ์ž์ฃผ ๋ณ€๊ฒฝ๋˜๋Š” ์š”์†Œ์˜ ๊ฒฝ์šฐ ๋‹ค์‹œ ๋ Œ๋”๋ง ํ•ด์•ผ ํ•˜๋ฏ€๋กœ ๋น„์šฉ์ด ์ฆ๊ฐ€ํ•  ์ˆ˜ ์žˆ์Œ

|v-for

<body>
  <div id="app">
    <h2>String</h2>
      <div v-for="char in myStr">
        {{ char }}
      </div>
    <h2>Array</h2>
    <div v-for="fruit in fruits">
      {{ fruit }}
    </div>
    <div v-for="(fruit, idx) in fruits" :key = "idx">
      {{ idx }} => {{ fruit }} 
    </div>
    <div v-for="todo in todos" :key ="`todo-${todo.id}`">
      <p>{{ todo.title }} => {{ todo.completed }}</p>
    </div>

    <h2>Object</h2>
    <div v-for="value in myObj">
      {{ value }}
    </div>
    <div v-for="(value, key) in myObj">
      {{ key }} => {{ value }}
    </div>
  </div>


  <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
  <script>
    const app = new Vue({
      el: '#app',
      data: {
        myStr: 'Hello World!',
        fruits: ['apple', 'banana', 'coconut'],
        todos: [
          { id: 1, title: 'todo1', completed: true },
          { id: 2, title: 'todo2', completed: false },
          { id: 3, title: 'todo3', completed: true },
        ],
        myObj: {
          name: 'kim',
          age: 100,
        }
      }
    }) 

  </script>
</body>
</html>
  • ์›๋ณธ ๋ฐ์ดํ„ฐ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์—˜๋ฆฌ๋จผํŠธ ๋˜๋Š” ํ…œํ”Œ๋ฆฟ ๋ธ”๋ก์„ ์—ฌ๋Ÿฌ ๋ฒˆ ๋ Œ๋”๋ง
  • item in items ๊ตฌ๋ฌธ ์‚ฌ์šฉ
  • item ์œ„์น˜์˜ ๋ณ€์ˆ˜๋ฅผ ๊ฐ ์š”์†Œ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ
    • ๊ฐ์ฒด์˜ ๊ฒฝ์šฐ๋Š” key
  • v-for ์‚ฌ์šฉ ์‹œ ๋ฐ˜๋“œ์‹œ key ์†์„ฑ์„ ๊ฐ ์š”์†Œ์— ์ž‘์„ฑ
  • v-if์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ v-for๊ฐ€ ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋” ๋†’์Œ
    • ๋‹จ, ๊ฐ€๋Šฅํ•˜๋ฉด v-if์™€ v-for๋ฅผ ๋™์‹œ์— ์‚ฌ์šฉํ•˜์ง€ ๋ง ๊ฒƒ

|v-on

<body>
  <div id="app">
    <!-- ๋ฉ”์„œ๋“œ ํ•ธ๋“ค๋Ÿฌ -->
    <button v-on:click="alertHello">Button</button>
    <button @click="alertHello">Button</button>

    <!-- ๊ธฐ๋ณธ ๋™์ž‘ ๋ฐฉ์ง€ -->
    <form action=""@submit.prevent="alertHello">
      <button>GoGo</button>
    </form>

    <!-- ํ‚ค ๋ณ„์นญ์„ ์ด์šฉํ•œ ํ‚ค ์ž…๋ ฅ ์ˆ˜์‹์–ด -->
    <!-- <input type="text" @keyup.space="log">     -->
    <input type="text" @keyup.enter="log">    
    <!-- cdํ•จ์ˆ˜์—์„œ ํŠน์ˆ˜๋ฌธ๋ฒ• ()-->
    <!-- log๋ฅผ ์‹คํ–‰ํ• ๊ฑด๋ฐ, 1๋ฒˆ ์ธ์ž๋กœ 'asdf'๋ฅผ ๋„˜๊ธฐ๊ณ  ์‹ถ๋‹ค. -->
    <input type="text" @keyup.enter="log('asdf')">   
    
    <p>{{ message }}</p>
    <button @click="changeMessage">change message</button>
  </div>
  
  <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
  <script>
    const app = new Vue({
      el:'#app',
      //๊ฐ’๋“ค์˜ ๋ชจ์ž„
      data: {
        message: 'Hello Vue',
      },
      //ํ–‰๋™๋“ค์˜ ๋ชจ์ž„
      methods: {
        alertHello: function(){
          alert('hello')
        },
        log: function(something){
          console.log(something)
        },
        changeMessage(){
          this.message = 'new message!'
        }
      }
    })
  </script>
</body>
  • ์—˜๋ฆฌ๋จผํŠธ์— ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๋ฅผ ์—ฐ๊ฒฐ
  • ์ด๋ฒคํŠธ ์œ ํ˜•์€ ์ „๋‹ฌ์ธ์ž๋กœ ํ‘œ์‹œํ•จ
  • ํŠน์ • ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ, ์ฃผ์–ด์ง„ ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰ ๋จ
  • ์•ฝ์–ด (Shorthand)
    • @
    • v-on:click → @click

|v-bind

 
<head>
<style>
    .active {
      color: red;
    }

    .my-background-color {
      background-color: yellow;
    }
  </style>
</head>
<body>
  <div id="app">
    <!-- ์†์„ฑ ๋ฐ”์ธ๋”ฉ -->
    <img v-bind:src="imageSrc" :alt="altMsg">
    <img :src="imageSrc" alt="altMsg">
    <hr>

    <!-- ํด๋ž˜์Šค ๋ฐ”์ธ๋”ฉ -->
    <div :class="{ active: isRed }">
      ํด๋ž˜์Šค ๋ฐ”์ธ๋”ฉ
    </div>
    <hr>
    <h3 :class="[activeRed, myBackgroud]">
      hello Vue
    </h3>

    <!-- ์Šคํƒ€์ผ ๋ฐ”์ธ๋”ฉ -->
    <p :style="{ fontSize: fontSize + 'px' }">
      this is paragraph
    </p>
  </div>
  
  <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
  <script>
    const app = new Vue({
      el: '#app',
      data: {
        fontSize: 16,
        altMsg: 'this is image',
        imageSrc: 'https://picsum.photos/200/300/',
        isRed: true,
        activeRed: 'active',
        myBackgroud: 'my-background-color',
      }
    })
  </script>
</body>
  • HTML ์š”์†Œ์˜ ์†์„ฑ์— Vue์˜ ์ƒํƒœ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ’์œผ๋กœ ํ• ๋‹น
  • Object ํ˜•ํƒœ๋กœ ์‚ฌ์šฉํ•˜๋ฉด value๊ฐ€ true์ธ key๊ฐ€ class ๋ฐ”์ธ๋”ฉ ๊ฐ’์œผ๋กœ ํ• ๋‹น
  • ์•ฝ์–ด (Shorthand)
    • : (์ฝœ๋ก )
    • v-bind:href → :href
  •  

|v-model — HTML input์š”์†Œ์™€ data๋ฅผ ํ•œ ๋ชธ์œผ๋กœ ๋งŒ๋“ ๋‹ค!

 
<body>
  <div id="app">
    <h2>Input -> Data ๋‹จ๋ฐฉํ–ฅ</h2>
    <p>{{ msg1 }}</p>
    <input type="text" @input="onInputChange">
    <hr>
    <h2>Input <-> Data ์–‘๋ฐฉํ–ฅ</h2>
    <P>{{ msg2 }}</P>
    <input type="text" v-model="msg2">
    <hr>
    ์ณŒ!<input id="box" type="checkbox" v-model="checked">
    <label for="box">{{ checked }}</label>
  </div>

  <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
  <script>
    const app = new Vue({
      el:'#app',
      data:{
        msg1:'111',
        msg2:'222',
        checked: true,
      },
      methods:{
        onInputChange(event){
          this.msg1= event.target.value

        }
      },

    })
  </script>
</body>
  • HTML form ์š”์†Œ์˜ ๊ฐ’๊ณผ data๋ฅผ ์–‘๋ฐฉํ–ฅ ๋ฐ”์ธ๋”ฉ
  • ์ˆ˜์‹์–ด
    • .lazy
      • input ๋Œ€์‹  change ์ด๋ฒคํŠธ ์ดํ›„์— ๋™๊ธฐํ™”
    • .number
      • ๋ฌธ์ž์—ด์„ ์ˆซ์ž๋กœ ๋ณ€๊ฒฝ
    • .trim
      • ์ž…๋ ฅ์— ๋Œ€ํ•œ trim์„ ์ง„ํ–‰

|Options/Data = ‘computed'

<body>
  <div id="app">
    <input type="text" v-model="r">
    <p>{{r}}</p>
    <p>{{area}}</p>
    <p>{{perim}}</p>
  </div>
  
  <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
  <script>
    const app = new Vue({
      el: '#app',
      data: {
        r: 2,
      },
      computed:{
        area: function(){
          return this.r**2*3.14
        },
        perim: function(){
          return this.r*2*3.14
        }
      }
    })
  </script>
</body>
  • ๋ฐ์ดํ„ฐ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋Š” ๊ณ„์‚ฐ๋œ ์†์„ฑ
  • ํ•จ์ˆ˜์˜ ํ˜•ํƒœ๋กœ ์ •์˜ํ•˜์ง€๋งŒ ํ•จ์ˆ˜๊ฐ€ ์•„๋‹Œ ํ•จ์ˆ˜์˜ ๋ฐ˜ํ™˜ ๊ฐ’์ด ๋ฐ”์ธ๋”ฉ ๋จ
  • ์ข…์†๋œ ๋ฐ์ดํ„ฐ์— ๋”ฐ๋ผ ์ €์žฅ(์บ์‹ฑ)๋จ
  • ์ข…์†๋œ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ๋งŒ ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰
  • ์ฆ‰, ์–ด๋–ค ๋ฐ์ดํ„ฐ์—๋„ ์˜์กดํ•˜์ง€ ์•Š๋Š” computed ์†์„ฑ์˜ ๊ฒฝ์šฐ ์ ˆ๋Œ€๋กœ ์—…๋ฐ์ดํŠธ ๋˜์ง€ ์•Š์Œ
  • ๋ฐ˜๋“œ์‹œ ๋ฐ˜ํ™˜ ๊ฐ’์ด ์žˆ์–ด์•ผ ํ•จ

|computed & methods

  • computed ์†์„ฑ ๋Œ€์‹  methods์— ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•  ์ˆ˜๋„ ์žˆ์Œ
    • ์ตœ์ข… ๊ฒฐ๊ณผ์— ๋Œ€ํ•ด ๋‘ ๊ฐ€์ง€ ์ ‘๊ทผ ๋ฐฉ์‹์€ ์„œ๋กœ ๋™์ผ
  • ์ฐจ์ด์ ์€ computed ์†์„ฑ์€ ์ข…์† ๋Œ€์ƒ์„ ๋”ฐ๋ผ ์ €์žฅ(์บ์‹ฑ) ๋จ
  • ์ฆ‰, computed๋Š” ์ข…์†๋œ ๋Œ€์ƒ์ด ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋Š” ํ•œ computed์— ์ž‘์„ฑ๋œ ํ•จ์ˆ˜๋ฅผ ์—ฌ๋Ÿฌ ๋ฒˆ ํ˜ธ์ถœํ•ด๋„ ๊ณ„์‚ฐ์„ ๋‹ค์‹œ ํ•˜์ง€ ์•Š๊ณ  ๊ณ„์‚ฐ๋˜์–ด ์žˆ๋˜ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜
  • ์ด์— ๋น„ํ•ด methods๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ๋ Œ๋”๋ง์„ ๋‹ค์‹œ ํ•  ๋•Œ๋งˆ๋‹ค ํ•ญ์ƒ ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰

|Options/Data - ‘watch’ —→๋˜๋„๋ก ์“ฐ์ง€ ๋ง๊ฒƒ.... computed๋ฅผ ์“ฐ์ž

 
<body>
  <div id="app">
    <p>{{ num }}</p>
    <button @click="num += 1">add 1</button>
  </div>
  
  <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
  <script>
    const app = new Vue({
      el: '#app',
      data: {
        num: 2,
      },
      watch: {
        num: function () {
          console.log(`${this.num}์ด ๋ณ€๊ฒฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.`)
        }
      },
    })
  </script>
</body>
  • ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ์‹œ
  • ๋ฐ์ดํ„ฐ์— ๋ณ€ํ™”๊ฐ€ ์ผ์–ด๋‚ฌ์„ ๋•Œ ์‹คํ–‰๋˜๋Š” ํ•จ์ˆ˜

|computed & watch

computed์™€ watch๋Š” ์–ด๋–ค ๊ฒƒ์ด ๋” ์šฐ์ˆ˜ํ•œ ๊ฒƒ์ด ์•„๋‹Œ ์‚ฌ์šฉํ•˜๋Š” ๋ชฉ์ ๊ณผ ์ƒํ™ฉ์ด ๋‹ค๋ฆ„

computed

  • ํŠน์ • ๋ฐ์ดํ„ฐ๋ฅผ ์ง์ ‘์ ์œผ๋กœ ์‚ฌ์šฉ/๊ฐ€๊ณตํ•˜์—ฌ ๋‹ค๋ฅธ ๊ฐ’์œผ๋กœ ๋งŒ๋“ค ๋•Œ ์‚ฌ์šฉ
  • ์†์„ฑ์€ ๊ณ„์‚ฐํ•ด์•ผ ํ•˜๋Š” ๋ชฉํ‘œ ๋ฐ์ดํ„ฐ๋ฅผ ์ •์˜ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์†Œํ”„ํŠธ์›จ์–ด ๊ณตํ•™์—์„œ ์ด์•ผ๊ธฐํ•˜๋Š” ‘์„ ์–ธํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ’ ๋ฐฉ์‹
  • ํŠน์ • ๊ฐ’์ด ๋ณ€๋™ํ•˜๋ฉด ํ•ด๋‹น ๊ฐ’์„ ๋‹ค์‹œ ๊ณ„์‚ฐํ•ด์„œ ๋ณด์—ฌ์ค€๋‹ค.”

watch

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

|์„ ์–ธํ˜• & ๋ช…๋ นํ˜•

  • ์„ ์–ธํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ
    • “๊ณ„์‚ฐํ•ด์•ผ ํ•˜๋Š” ๋ชฉํ‘œ ๋ฐ์ดํ„ฐ๋ฅผ ์ •์˜” (computed)
  • ๋ช…๋ นํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ
    • “๋ฐ์ดํ„ฐ๊ฐ€ ๋ฐ”๋€Œ๋ฉด ํŠน์ • ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•ด!” (watch)

|Options / Assets - ‘filter’

<body>
  <div id="app">
    {{ numbers | getOddNumbers | getUnderTen}}
		<hr>
    {{ getOddAndUnderTen }}
  </div>

  <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
  <script>
    const app = new Vue({
      el: '#app',
      data: {
        numbers: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15],
      },
      filters: {
        getOddNumbers(array) {
          return array.filter(num => num % 2)
        },
        getUnderTen(array) {
          return array.filter(num=>num<10)
        }
      },
      // w/computed//
      computed: {
        getOddAndUnderTen() {
          return this.numbers.filter(num=> num%2 && num<10)
        }
      }
    })
  </script>
</body>
  • ํ…์ŠคํŠธ ํ˜•์‹ํ™”๋ฅผ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํ•„ํ„ฐ
  • interpolation ํ˜น์€ v-bind๋ฅผ ์ด์šฉํ•  ๋•Œ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
  • ํ•„ํ„ฐ๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํ‘œํ˜„์‹ ๋งˆ์ง€๋ง‰์— “|” (ํŒŒ์ดํ”„)์™€ ํ•จ๊ป˜ ์ถ”๊ฐ€๋˜์–ด์•ผ ํ•จ
  • ์ด์–ด์„œ ์‚ฌ์šฉ(chaining) ๊ฐ€๋Šฅ

'Development > Vue.js' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

Vue.js - Vue CLI  (0) 2022.05.09
Vue.js - SFC(Single File Component)  (0) 2022.05.09
Vue.js - Lifecycle Hooks  (0) 2022.05.07
Vue.js - Vue Instance  (0) 2022.05.07
Vue.js - SPA, CSR,SSR,SEO,Vue.js์˜ ๊ฐœ๋…๊ณผ ์—ญํ• , MVVM  (0) 2022.05.07

๋Œ“๊ธ€