λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
Vue.js

Vue.js(3) Vue μΈμŠ€ν„΄μŠ€ 속성 및 μ»΄ν¬λ„ŒνŠΈ

by Jo__y 2022. 10. 9.

Vue μΈμŠ€ν„΄μŠ€

new Vue({
  el:,
  template:,
  data: ,
  methods: ,
  created: ,
  watch: ,
});
  • el: μΈμŠ€ν„΄μŠ€κ°€ κ·Έλ €μ§€λŠ” ν™”λ©΄μ˜ μ‹œμž‘μ 
  • template: 화면에 ν‘œμ‹œν•  μš”μ†Œ
  • data: 데이터
  • methods: 이벀트 ν•¨μˆ˜λ“€
  • created: 라이프사이클 쀑 ν•˜λ‚˜
  • watch: dataμ—μ„œ μ •μ˜ν•œ 속성이 변경됐을 λ•Œ μΆ”κ°€ λ™μž‘μ„ μ •μ˜
  • computed: 데이터λ₯Ό κ³„μ‚°ν•œ κ²°κ³Όλ₯Ό μ†μ„±μœΌλ‘œ μ‚¬μš©ν•˜κΈ° μœ„ν•΄ μ‚¬μš©

methods ν•¨μˆ˜μ €μž₯μ†Œ

computed

  • λ°μ΄ν„°μ˜ 값에 λ”°λΌμ„œ λ°”λ€ŒλŠ” 값을 μ •μ˜ν•˜λŠ” 속성이닀.
  • ν…œν”Œλ¦Ώ 내에 ν‘œν˜„μ‹μ„ 넣을 수 μžˆλ‹€. ν•˜μ§€λ§Œ κ°„λ‹¨ν•œ 연산일 λ•Œλ§Œ μ΄μš©ν•˜λŠ” 것이 μ’‹λ‹€.
    <div id="example">
    {{ message.split('').reverse().join('') }}
    </div>
    μ΄λ ‡κ²Œ 연산식이 λ³΅μž‘ν•˜λ‹€λ©΄? 이λ₯Ό μœ„ν•΄ computed 속성이 μ‘΄μž¬ν•œλ‹€.
<div id="example">
  <p>원본 λ©”μ‹œμ§€: "{{ message }}"</p>
  <p>μ—­μˆœμœΌλ‘œ ν‘œμ‹œν•œ λ©”μ‹œμ§€: "{{ reversedMessage }}"</p>
</div>

var vm = new Vue({
  el: '#example',
  data: {
    message: 'μ•ˆλ…•ν•˜μ„Έμš”'
  },
  computed: {
    // κ³„μ‚°λœ getter
    reversedMessage: function () {
      // `this` λŠ” vm μΈμŠ€ν„΄μŠ€λ₯Ό κ°€λ¦¬ν‚΅λ‹ˆλ‹€.
      return this.message.split('').reverse().join('')
    }
  }
})

watch

λŒ€λΆ€λΆ„μ˜ 경우 computed 속성이 더 μ ν•©ν•˜μ§€λ§Œ μ‚¬μš©μžκ°€ λ§Œλ“  κ°μ‹œμžκ°€ ν•„μš”ν•œ κ²½μš°κ°€ μžˆλ‹€. κ·Έλž˜μ„œ VueλŠ” watch μ˜΅μ…˜μ„ 톡해 데이터 변경에 λ°˜μ‘ν•˜λŠ” 보닀 일반적인 방법을 μ œκ³΅ν•œλ‹€. μ΄λŠ” 데이터 변경에 λŒ€ν•œ μ‘λ‹΅μœΌλ‘œ 비동기식 λ˜λŠ” μ‹œκ°„μ΄ 많이 μ†Œμš”λ˜λŠ” μ‘°μž‘μ„ μˆ˜ν–‰ν•˜λ €λŠ” κ²½μš°μ— κ°€μž₯ μœ μš©ν•˜λ‹€.

//template
<div id="watch-example">
  <p>
    yes/no μ§ˆλ¬Έμ„ λ¬Όμ–΄λ³΄μ„Έμš”:
    <input v-model="question">
  </p>
  <p>{{ answer }}</p>
</div>
//script
var watchExampleVM = new Vue({
  el: '#watch-example',
  data: {
    question: '',
    answer: 'μ§ˆλ¬Έμ„ ν•˜κΈ° μ „κΉŒμ§€λŠ” λŒ€λ‹΅ν•  수 μ—†μŠ΅λ‹ˆλ‹€.'
  },
  watch: {
    // 질문이 변경될 λ•Œ λ§ˆλ‹€ 이 κΈ°λŠ₯이 μ‹€ν–‰λ©λ‹ˆλ‹€.
    question: function (newQuestion) {
      this.answer = 'μž…λ ₯을 κΈ°λ‹€λ¦¬λŠ” 쀑...'
      this.debouncedGetAnswer()
    }
  }
})  

computed VS watch

  • computed : μ„ μ–Έν˜• ν”„λ‘œκ·Έλž˜λ° 방식
    • κ³„μ‚°λœ 값을 좜λ ₯ν•˜κΈ°μœ„ν•¨μ΄λ‹€.
  • watch : λͺ…λ Ήν˜• ν”„λ‘œκ·Έλž˜λ° 방식
    • μ–΄λ–€ 쑰건이 λ˜μ—ˆμ„λ•Œ ν•¨μˆ˜λ₯Ό μ‹€ν–‰μ‹œν‚€κΈ° μœ„ν•¨μ΄λ‹€.
    • 데이터λ₯Ό κ°μ‹œν•΄μ„œ 값이 λ³€ν™”ν•  λ•Œλ§ˆλ‹€ μ •μ˜ν•œ ν•¨μˆ˜κ°€ μ‹€ν–‰λœλ‹€.
    • 데이터 λ³€κ²½μ˜ μ‘λ‹΅μœΌλ‘œ 비동기식 계산이 ν•„μš”ν•œ κ²½μš°λ‚˜ μ‹œκ°„μ΄ 많이 μ†Œμš”λ˜λŠ” 계산을 ν•΄μ•Ό ν• λ•Œ μ‚¬μš©ν•˜λŠ” 것이 μ’‹λ‹€.
      보톡은 λͺ…λ Ήν˜• ν”„λ‘œκ·Έλž˜λ°μΈ watch λ³΄λ‹€λŠ” μ„ μ–Έν˜• ν”„λ‘œκ·Έλž˜λ°μΈ computedλ₯Ό μ‚¬μš©ν•˜λŠ” 것이 더 μ’‹λ‹€.

watchλ₯Ό μ‚¬μš©ν•˜λ©΄, APIλ‘€ ν˜ΈμΆœν•˜κ³  κ·Έ 결과에 λŒ€ν•œ 응닡을 λ°›κΈ° μ „κΉŒμ§€ 쀑간 μƒνƒœλ₯Ό μ„€μ •ν•  μˆ˜μžˆμŠ΅λ‹ˆλ‹€. computedλ₯Ό μ‚¬μš©ν•˜λ©΄ API 호좜 κ²°κ³Όλ₯Ό κΈ°λ‹€λ¦¬λŠ” λ™μ•ˆμ˜ 쀑간 μƒνƒœμ„ μ„€μ •ν•  수 μ—†μŠ΅λ‹ˆλ‹€.

computed VS method

computed와 methods의 차이점은 캐싱 여뢀이닀. computed속성은 λ‚΄λΆ€μ μœΌλ‘œ 데이터λ₯Ό μΊμ‹±ν•˜κ³ μžˆλ‹€. methodsλŠ” 맀번 μƒˆλ‘œ ν˜ΈμΆœν•΄μ„œ κ³„μ‚°ν•œλ‹€.

computedλŠ” 쒅속 λŒ€μƒμ΄ λ³€κ²½ 될 λ•Œλ§Œ ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•œλ‹€.. message 값이 λ³€ν•˜μ§€ μ•ŠλŠ” ν•œ reversedMessageλ₯Ό μ—¬λŸ¬λ²ˆ ν˜ΈμΆœν•˜μ—¬λ„ λ‹€μ‹œ κ³„μ‚°ν•˜μ§€ μ•Šκ³  μΊμ‹±ν•œ κ²°κ³Όλ₯Ό μ¦‰μ‹œ λ°˜ν™˜ν•œλ‹€.
μ‹œκ°„μ΄ 많이 κ±Έλ¦¬λŠ” 계산을 ν•  λ•Œ, computed을 μ‚¬μš©ν•˜λ©΄ 더 쒋은 효율의 μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ„ λ§Œλ“€ 수 μžˆλ‹€.
캐싱을 ν•˜μ§€ μ•Šκ³ , 호좜 ν•  λ•Œλ§ˆλ‹€ μƒˆλ‘­κ²Œ 계산을 ν•΄μ•Ό ν•˜λŠ” κ²½μš°μ—λŠ” methodsλ₯Ό μ‚¬μš©ν•΄μ•Ό ν•œλ‹€.


μ»΄ν¬λ„ŒνŠΈ

ν™”λ©΄μ˜ μ˜μ—­μ„ μΌμ •ν•œ λ‹¨μœ„λ‘œ μͺΌκ°œμ–΄ μž¬ν™œμš© κ°€λŠ₯ν•œ ν˜•νƒœλ‘œ κ΄€λ¦¬ν•˜λŠ” 것이닀.

전역등둝

Vue.component('my-component-name', { /* ... */ })

λ₯Ό μ΄μš©ν•΄μ„œ μ»΄ν¬λ„ŒνŠΈλ₯Ό μ „μ—­μœΌλ‘œ λ“±λ‘ν•œλ‹€.

μ»΄ν¬λ„ŒνŠΈμ˜ 이름은 첫 번째 인자둜 λ“€μ–΄κ°€λŠ”λ°, μΌ€λ°₯ν‘œκΈ°λ²• 으둜 μž‘μ„±ν•˜λŠ” 것을 ꢌμž₯ν•œλ‹€.
MyComponentName처럼 νŒŒμŠ€μΉΌν‘œκΈ°λ²•μœΌλ‘œλ„ ν•  수 μžˆμ§€λ§Œ, DOM에 λ°”λ‘œ μ“Έ λ•ŒλŠ” μΌ€λ°₯-ν‘œκΈ°λ²• μ΄λ¦„λ§Œ κ°€λŠ₯ν•˜κΈ° λ•Œλ¬Έμ— ꡳ이 μ“Έ μ΄μœ λŠ” μ—†λ‹€.

// μ‚¬μš©
<div id="app">
  <component-a></component-a>
  <component-b></component-b>
  <component-c></component-c>
</div>

// 등둝
Vue.component('μ»΄ν¬λ„ŒνŠΈμ΄λ¦„', μ»΄ν¬λ„ŒνŠΈ λ‚΄μš©);
Vue.component('component-a', { /* ... */ })
Vue.component('component-b', { /* ... */ })
Vue.component('component-c', { /* ... */ })

new Vue({ el: '#app' })

μ΄λ ‡κ²Œ μ „μ—­λ“±λ‘ν•œ μ»΄ν¬λ„ŒνŠΈλŠ” μ–΄λ–€ 루트 VueμΈμŠ€ν„΄μŠ€ μ—μ„œλ„ μ‚¬μš©ν•  수 μžˆλ‹€.

지역등둝

전역등둝은 단점이 μžˆλ‹€. μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” μ»΄ν¬λ„ŒνŠΈλ„ μ΅œμ’… λΉŒλ“œμ— ν¬ν•¨λ˜λŠ” 것이닀. λΆˆν•„μš”ν•˜κ²Œ μ½”λ“œ 양이 컀진닀.

이 κ²½μš°μ— μ»΄ν¬λ„ŒνŠΈλ₯Ό 일반 μžλ°”μŠ€ν¬λ¦½νŠΈ 객체둜 μ •μ˜ν•  수 μžˆλ‹€.
const ComponentA = { /* ... */ }

μ‚¬μš©ν• λ•ŒλŠ” components μ˜΅μ…˜μ„ 톡해 μ“Έ 수 μžˆλ‹€.

new Vue({
  el: '#app',
  components: {
    'component-a': ComponentA,
    'component-b': ComponentB
  }
})

components객체의 각 μ†μ„±μ—μ„œ ν‚€κ°€ μ—˜λ¦¬λ¨ΌνŠΈμ˜ 이름이 되고 value에 μ»΄ν¬λ„ŒνŠΈ 객체λ₯Ό μ§€μ •ν•˜λ©΄ λœλ‹€.

지역 λ“±λ‘λœ μ»΄ν¬λ„ŒνŠΈλŠ” λ‹Ήμ—°νžˆ ν•˜μœ„ μ»΄ν¬λ„ŒνŠΈμ—μ„œλŠ” μ‚¬μš©μ΄ λΆˆκ°€λŠ₯ν•˜λ‹€.

μ»΄ν¬λ„ŒνŠΈ 톡신

μ»΄ν¬λ„ŒνŠΈλ§ˆλ‹€ 관계가 μƒμ„±λ˜λ©° μΈμŠ€ν„΄μŠ€μ˜ dataλŠ” root μ»΄ν¬λ„ŒνŠΈμ—μ„œ κ΄€λ¦¬ν•˜λŠ”
data λ₯Ό 내리고, 올리고 ν•΄μ•Όν•œλ‹€.

props :
μƒμœ„ μ»΄ν¬λ„ŒνŠΈμ˜ 정보λ₯Ό ν•˜μœ„ μ»΄ν¬λ„ŒνŠΈλ‘œ μ „λ‹¬ν•˜κΈ° μœ„ν•œ νŠΉμ„±μ΄λ‹€.
ν•˜μœ„ μ»΄ν¬λ„ŒνŠΈλŠ”props μ˜΅μ…˜μ„ μ‚¬μš©ν•˜μ—¬ μˆ˜μ‹  ν•  κ²ƒμœΌλ‘œ κΈ°λŒ€λ˜λŠ” propsλ₯Ό λͺ…μ‹œμ μœΌλ‘œ μ„ μ–Έν•΄μ•Όν•œλ‹€.

HTML νƒœκ·Έμ•ˆμ—λŠ” μΌ€λ°₯μΌ€μ΄μŠ€
javascript props() μ—μ„œλŠ” μΉ΄λ©œμΌ€μ΄μŠ€λ‘œ μž‘μ„±ν•΄μ•Όν•œλ‹€.

문법
v-bind:ν”„λ‘­μŠ€ 속성 이름="μƒμœ„ μ»΄ν¬λ„ŒνŠΈμ˜ 데이터 이름"

$.emit() : ν•˜μœ„ μ»΄ν¬ν„΄νŠΈμ—μ„œ μƒμœ„ μ»΄ν¬λ„ŒνŠΈλ‘œ λ³΄λ‚΄λŠ” 것이닀.
! 주의 : camel ν‘œκΈ°λ²• μ‚¬μš©ν•˜λ©΄ μ•ˆλœλ‹€. kebab ν‘œκΈ°λ²• μ‚¬μš©ν•΄μ•Όν•œλ‹€.

문법
v-on:ν•˜μœ„μ»΄ν¬λ„ŒνŠΈμ—μ„œ λ°œμƒν•œ event 이름="μƒμœ„ μ»΄ν¬λ„ŒνŠΈμ˜ method 이름"

같은 λ ˆλ²¨μ—μ„œ μ»΄ν¬λ„ŒνŠΈ 톡신방법
Root μ»΄ν¬λ„ŒνŠΈλ‘œ μ „λ‹¬ν–ˆλ‹€κ°€ λ‚΄λ €μ€˜μ•Όν•œλ‹€.
emit κ³Ό props() λ™μ‹œ μ‚¬μš©

μ°Έμ‘°

λ°˜μ‘ν˜•

λŒ“κΈ€