4 ๋ถ„ ์†Œ์š”

๐Ÿ“š Vue.js


๐Ÿ“š Vue.js Instance

Vue Instance

Vue Instance ์œ ํšจ๋ฒ”์œ„

  • Vue Instance๋ฅผ ์ƒ์„ฑํ•˜๋ฉด HTML์˜ ํŠน์ • ๋ฒ”์œ„ ์•ˆ์—์„œ๋งŒ ์˜ต์…˜ ์†์„ฑ๋“ค์ด ์ ์šฉ
  • el ์†์„ฑ๊ณผ ๋ฐ€์ ‘ํ•œ ๊ด€๊ณ„๊ฐ€ ์žˆ๋‹ค.
  • ์ธ์Šคํ„ด์Šค๊ฐ€ ํ™”๋ฉด์— ์ ์šฉ๋˜๋Š” ๊ณผ์ •
    1. ๋ทฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํŒŒ์ผ ๋กœ๋”ฉ
    2. ์ธ์Šคํ„ด์Šค ๊ฐ์ฒด ์ƒ์„ฑ ( ์˜ต์…˜ ์†์„ฑ ํฌํ•จ )
    3. ํŠน์ • ํ™”๋ฉด ์š”์†Œ์— ์ธ์Šคํ„ด์Šค๋ฅผ ๋ถ™์ž„
    4. ์ธ์Šคํ„ด์Šค ๋‚ด์šฉ์ด ํ™”๋ฉด ์š”์†Œ๋กœ ๋ณ€ํ™˜
    5. ๋ณ€ํ™˜๋œ ํ™”๋ฉด ์š”์†Œ๋ฅผ ์‚ฌ์šฉ์ž๊ฐ€ ์ตœ์ข… ํ™•์ธ




(View)

<div id="app">
  <h2></h2>
</div>

<script>

  (Model)

  var model = {
      message : " ๋ทฐ ์ƒ์„ฑ "
  }

  (View Model)

  new Vue({
      el : '#app',
      data : model
  })
</script>

-> ์ถœ๋ ฅ์€ " ๋ทฐ ์ƒ์„ฑ " ์ด ๋œ๋‹ค. - ์œ ํšจ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚œ ๊ฒฝ์šฐ

<div id="app"></div>
<h2></h2>

<script>
  var model = {
    message: " ๋ทฐ ์ƒ์„ฑ ",
  };

  new Vue({
    el: "#app",
    data: model,
  });
</script>

-> ์ถœ๋ ฅ์ด  ๋กœ ๋œ๋‹ค.
  • Vue()๋กœ ์ธ์Šคํ„ด์Šค๊ฐ€ ์ƒ์„ฑ ๋˜์—ˆ๋‹ค. ( new Vue() )
  • el ์†์„ฑ์ด ์ง€์ •ํ•œ ํ™”๋ฉด ์š”์†Œ ( DOM ) ( #app ) ์— ์ธ์Šคํ„ด์Šค๊ฐ€ ๋ถ€์ฐฉ๋œ๋‹ค.
  • el ์†์„ฑ์— ์ธ์Šคํ„ด์Šค๊ฐ€ ๋ถ€์ฐฉ๋œ ํ›„ data ์†์„ฑ์ด el ์†์„ฑ์— ์ง€์ •ํ•œ ํ™”๋ฉด ์š”์†Œ์™€ ๊ทธ ์ดํ•˜ ๋ ˆ๋ฒจ์˜ ํ™”๋ฉด ์š”์†Œ์— ์ ์šฉ๋˜์–ด ๊ฐ’์ด ์น˜ํ™˜๋œ๋‹ค.

Vue Instance Life Cycle


Vue Instance Life Style์„ ํฌ๊ฒŒ ๋‚˜๋ˆ„๋ฉด

  • Instance์˜ ์ƒ์„ฑ
  • Instance๋ฅผ ํ™”๋ฉด์— ๋ถ€์ฐฉ
  • Instance ๋‚ด์šฉ์„ ๊ฐฑ์‹ 
  • Instance ์ œ๊ฑฐ
LifeCycle ์†์„ฑ ์„ค๋ช…
beforeCreate Vue Instance๊ฐ€ ์ƒ์„ฑ๋˜๊ณ  ๊ฐ ๋ฐ์ดํ„ฐ๋“ค์˜ ์„ค์ • ์ „์— ํ˜ธ์ถœ
created Vue Instance๊ฐ€ ์ƒ์„ฑ๋œ ํ›„ ๋ฐ์ดํ„ฐ๋“ค์˜ ์„ค์ •์ด ์™„๋ฃŒ๋œ ํ›„ ํ˜ธ์ถœ
Instance๊ฐ€ ํ™”๋ฉด์— ๋ถ€์ฐฉํ•˜๊ธฐ ์ „์ด๊ธฐ ๋•Œ๋ฌธ์— template ์†์„ฑ์— ์ •์˜๋œ DOM ์š”์†Œ๋Š” ์ ‘๊ทผ ๋ถˆ๊ฐ€
์„œ๋ฒ„์— ๋ฐ์ดํ„ฐ๋ฅผ ์š”์ฒญ ( http ํ†ต์‹  ) ํ•˜์—ฌ ๋ฐ›์•„์˜ค๋Š” ๋กœ์ง์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์ข‹๋‹ค
beforeMount ๋งˆ์šดํŠธ๊ฐ€ ์‹œ์ž‘๋˜๊ธฐ ์ „์— ํ˜ธ์ถœ
mounted ์ง€์ •๋œ element์— Vue Instance ๋ฐ์ดํ„ฐ๊ฐ€ ๋งˆ์šดํŠธ ๋œ ํ›„์— ํ˜ธ์ถœ
template ์†์„ฑ์— ์ •์˜ํ•œ ํ™”๋ฉด ์š”์†Œ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์–ด ํ™”๋ฉด ์š”์†Œ๋ฅผ ์ œ์–ดํ•˜๋Š” ๋กœ์ง ์ˆ˜ํ–‰
beforeUpdate ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ virtual DOM์ด ๋žœ๋”๋ง, ํŒจ์น˜๋˜๊ธฐ ์ „์— ํ˜ธ์ถœ
updated Vue์—์„œ ๊ด€๋ฆฌ๋˜๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณ€๊ฒฝ๋˜์–ด DOM์ด ์—…๋ฐ์ดํŠธ ๋œ ์ƒํƒœ
๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ ํ›„ ํ™”๋ฉด ์š”์†Œ ์ œ์–ด์™€ ๊ด€๋ จ๋œ ๋กœ์ง์„ ์ถ”๊ฐ€
beforeDestroy Vue Instance๊ฐ€ ์ œ๊ฑฐ๋˜๊ธฐ ์ „์— ํ˜ธ์ถœ
destroyed Vue Instance๊ฐ€ ์ œ๊ฑฐ๋œ ํ›„ ํ˜ธ์ถœ

Vue Instance ์†์„ฑ

Vue Method

<body>
    <div id="app">
        <div>data : </div>
        <div>method kor : </div>
        <div>method eng : </div>
    </div>
</body>
<script>
    new Vue({
        el: "#app",
        data: {
            name: 'JS',
            msg: 'Data์ž…๋‹ˆ๋‹ค.',
        },
        methods: {
            helloKor(){
                return "์•ˆ๋…• " + this.name;
            },
            helloEng(){
                return "Hello " + this.name;
            }
        }
    })
</script>
  • ์‹คํ–‰ ๊ฒฐ๊ณผ


Vue filter

<!-- ์ค‘๊ด„ํ˜ธ ๋ณด๊ฐ„๋ฒ• -->


<!-- v-bind -->
<div v-bind:id="rawId | formatId"></div>
  • ์ „์—ญ ํ•„ํ„ฐ
Vue.filter(
  'count1', (val) => {
    if(val.length == 0){
      return;
    }
    return `${val} : ${val.length}์ž`;
  }
)
  • ์ง€์—ญ ํ•„ํ„ฐ
new Vue({
  el: "#app",
  filters: {
    count1(val, alternative){
      if(val.length == 0){
        return alternative;
      }
      return `${val} : ${val.length}์ž`;
    }
  }
})
  • ์‹ค์Šต ๊ธˆ์•ก์€ ์ฒœ ๋‹จ์œ„๋งˆ๋‹ค โ€˜,โ€™ ์ฐ๊ธฐ
    ๋ฒˆํ˜ธ๋Š” ์‚ฌ์ด์— โ€˜-โ€˜ ๋„ฃ๊ธฐ
<body>
    <div id="app">
       <div>
           ๊ธˆ์•ก : <input type="text" v-model="msg1"><br>
           ์ „ํ™”๋ฒˆํ˜ธ : <input type="text" v-model="msg2">
       </div>
       <div>
           <h3></h3>
           <h3></h3>
       </div>
    </div>
</body>
<script>
    Vue.filter('price', (value) => {
        if(!value) return value;
        return value.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ',');
    });
    Vue.filter('mobile', (value) => {
        if(!value || !(value.length === 10 || value.length === 11)) return value;
        return value.replace(/^(\d{3})(\d{3,4})(\d{4})/g, '$1-$2-$3');
    });
    new Vue({
        el: "#app", 
        data: {
            msg1: '', msg2: '',
        },
    });
</script>
  • ์‹คํ–‰ ๊ฒฐ๊ณผ


Vue computed

  • ํŠน์ • ๋ฐ์ดํ„ฐ์˜ ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ์‹ค์‹œ๊ฐ„์œผ๋กœ ์ฒ˜๋ฆฌ
  • ์บ์‹ฑ์„ ์ด์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ์˜ ๋ณ€๊ฒฝ์ด ์—†์„ ๊ฒฝ์šฐ ์บ์‹ฑ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ย ยป ๊ฐ’
  • Setter์™€ Getter๋ฅผ ์ง์ ‘ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Œ
  • ์ž‘์„ฑ์€ method ํ˜•ํƒœ๋กœ ์ž‘์„ฑํ•˜์ง€๋งŒ Vue์—์„œ proxy ์ฒ˜๋ฆฌํ•˜์—ฌ property ์ฒ˜๋Ÿผ ์‚ฌ์šฉ
  • ์ข…์† ๋Œ€์ƒ์„ ๋”ฐ๋ผ ์ €์žฅ(์บ์‹ฑ) ๋œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.
  • watch ๋ณด๋‹ค๋Š” computed๋ฅผ ๊ถŒ์žฅํ•œ๋‹ค

  • ์‹ค์Šต
<body>
    <div id="app">
        <p>์›๋ณธ ๋ฉ”์„ธ์ง€ : ""</p>
        <p>์—ญ์ˆœ์œผ๋กœ ํ‘œ์‹œํ•œ ๋ฉ”์„ธ์ง€ : ""</p>
        <input type="text" v-model="msg">
    </div>
</body>
<script>
   new Vue({
       el: "#app",
       data: {
           msg: '',
       },
       computed: {
           reverseMsg: function(){
               return this.msg.split('').reverse('').join('');
           },
       },
   });
</script>
  • ์‹คํ–‰ ๊ฒฐ๊ณผ


Vue computed VS Vue method

computed ์†์„ฑ์€ Vue ์ธ์Šคํ„ด์Šค๊ฐ€ ์ƒ์„ฑ๋  ๋•Œ, ๊ฐ’์„ ๋ฐ›์•„ ๊ณ„์‚ฐํ•˜์—ฌ ์ €์žฅํ•ด ๋†“๋Š”๋‹ค. ( ์บ์‹ฑ )
๊ฒฐ๊ณผ์ ์œผ๋กœ 3๋ฒˆ ์ถœ๋ ฅ๋˜๋Š” ๊ฒฝ์šฐ ํ•œ ๋ฒˆ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™๋‹ค.

method ๋Š” ์ถœ๋ ฅ๋  ๋•Œ ๋งˆ๋‹ค ๊ณ„์‚ฐํ•œ๋‹ค.
๊ฒท๊ณผ์ ์œผ๋กœ 3๋ฒˆ ์ถœ๋ ฅ๋˜๋Š” ๊ฒฝ์šฐ ์„ธ ๋ฒˆ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™๋‹ค.

Vue watch

<body>
    <div id="app">
        <p>์›๋ณธ ๋ฉ”์„ธ์ง€ : ""</p>
        <p>์—ญ์ˆœ์œผ๋กœ ํ‘œ์‹œํ•œ ๋ฉ”์„ธ์ง€ : ""</p>
        <input type="text" v-model="msg">
    </div>
</body>
<script>
   new Vue({
       el: "#app",
       data: {
           msg: '',
           reverseMsg: '',
       },
       watch: {
           msg: function(newVal, oldVal){
               this.reverseMsg = newVal.split('').reverse('').join('');
           },
       },
   });
</script>
  • ์‹คํ–‰ ๊ฒฐ๊ณผ