Skip to content

Latest commit

Β 

History

History
109 lines (84 loc) Β· 4.89 KB

state.md

File metadata and controls

109 lines (84 loc) Β· 4.89 KB

μƒνƒœ

단일 μƒνƒœ 트리

VuexλŠ” 단일 μƒνƒœ 트리 λ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€. 즉, 이 단일 κ°μ²΄λŠ” λͺ¨λ“  μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μˆ˜μ€€μ˜ μƒνƒœλ₯Ό ν¬ν•¨ν•˜λ©° "원본 μ†ŒμŠ€" 역할을 ν•©λ‹ˆλ‹€. μ΄λŠ” 각 μ• ν”Œλ¦¬μΌ€μ΄μ…˜λ§ˆλ‹€ ν•˜λ‚˜μ˜ μ €μž₯μ†Œλ§Œ κ°–κ²Œ λœλ‹€λŠ” 것을 μ˜λ―Έν•©λ‹ˆλ‹€. 단일 μƒνƒœ 트리λ₯Ό μ‚¬μš©ν•˜λ©΄ νŠΉμ • μƒνƒœλ₯Ό μ‰½κ²Œ 찾을 수 μžˆμœΌλ―€λ‘œ 디버깅을 μœ„ν•΄ ν˜„μž¬ μ•± μƒνƒœμ˜ μŠ€λƒ… 샷을 μ‰½κ²Œ κ°€μ Έμ˜¬ 수 μžˆμŠ΅λ‹ˆλ‹€.

단일 μƒνƒœ νŠΈλ¦¬λŠ” λͺ¨λ“ˆμ„±κ³Ό μΆ©λŒν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. λ‚˜μ€‘μ— μƒνƒœμ™€ 변이λ₯Ό ν•˜μœ„ λͺ¨λ“ˆλ‘œ λΆ„ν• ν•˜λŠ” 방법에 λŒ€ν•΄ μ„€λͺ…ν•©λ‹ˆλ‹€.

Vuex μƒνƒœλ₯Ό Vue μ»΄ν¬λ„ŒνŠΈμ—μ„œ κ°€μ Έμ˜€κΈ°

그러면 Vue μ»΄ν¬λ„ŒνŠΈμ—μ„œ μ €μž₯μ†Œ λ‚΄λΆ€μ˜ μƒνƒœλ₯Ό μ–΄λ–»κ²Œ ν‘œμ‹œν•˜λ‚˜μš”? Vuex μ €μž₯μ†ŒλŠ” λ°˜μ‘μ μ΄κΈ° λ•Œλ¬Έμ— μ €μž₯μ†Œμ—μ„œ μƒνƒœλ₯Ό "검색"ν•˜λŠ” κ°€μž₯ κ°„λ‹¨ν•œ 방법은 κ³„μ‚°λœ μ†μ„±λ‚΄μ—μ„œ 일뢀 μ €μž₯μ†Œ μƒνƒœλ₯Ό κ°€μ Έμ˜€λŠ” κ²ƒμž…λ‹ˆλ‹€.

// Counter μ»΄ν¬λ„ŒνŠΈλ₯Ό λ§Œλ“­λ‹ˆλ‹€
const Counter = {
  template: `<div>{{ count }}</div>`,
  computed: {
    count () {
      return store.state.count
    }
  }
}

store.state.countκ°€ λ³€κ²½λ˜λ©΄ κ³„μ‚°λœ 속성이 λ‹€μ‹œ λ³€κ²½λ˜κ³  κ΄€λ ¨ DOM μ—…λ°μ΄νŠΈκ°€ νŠΈλ¦¬κ±°λ©λ‹ˆλ‹€.

κ·ΈλŸ¬λ‚˜ 이 νŒ¨ν„΄μ€ μ»΄ν¬λ„ŒνŠΈκ°€ μ „μ—­ μ €μž₯μ†Œ 단독 ν•­λͺ©μ— μ˜μ‘΄ν•˜κ²Œν•©λ‹ˆλ‹€. λͺ¨λ“ˆ μ‹œμŠ€ν…œμ„ μ‚¬μš©ν•  λ•ŒλŠ” μ €μž₯μ†Œ μƒνƒœλ₯Ό μ‚¬μš©ν•˜λŠ” λͺ¨λ“  μ»΄ν¬λ„ŒνŠΈμ—μ„œ μ €μž₯μ†Œλ₯Ό κ°€μ Έμ™€μ•Όν•˜λ©° μ»΄ν¬λ„ŒνŠΈλ₯Ό ν…ŒμŠ€νŠΈ ν•  λ•ŒλŠ” κ°€μ§œλ°μ΄ν„°κ°€ ν•„μš”ν•©λ‹ˆλ‹€.

VuexλŠ” store μ˜΅μ…˜(Vue.use(Vuex)에 μ˜ν•΄ κ°€λŠ₯)으둜 루트 μ»΄ν¬λ„ŒνŠΈμ˜ λͺ¨λ“  μžμ‹ μ»΄ν¬λ„ŒνŠΈμ— μ €μž₯μ†Œλ₯Ό "μ£Όμž…"ν•˜λŠ” λ©”μ»€λ‹ˆμ¦˜μ„ μ œκ³΅ν•©λ‹ˆλ‹€.

const app = new Vue({
  el: '#app',
  // "store" μ˜΅μ…˜μ„ μ‚¬μš©ν•˜μ—¬ μ €μž₯μ†Œλ₯Ό μ œκ³΅ν•˜μ‹­μ‹œμ˜€.
  // 그러면 λͺ¨λ“  ν•˜μœ„ μ»΄ν¬λ„ŒνŠΈμ— μ €μž₯μ†Œ μΈμŠ€ν„΄μŠ€κ°€ μ‚½μž…λ©λ‹ˆλ‹€.
  store,
  components: { Counter },
  template: `
    <div class="app">
      <counter></counter>
    </div>
  `
})

루트 μΈμŠ€ν„΄μŠ€μ— store μ˜΅μ…˜μ„ μ œκ³΅ν•¨μœΌλ‘œμ¨ μ €μž₯μ†ŒλŠ” 루트의 λͺ¨λ“  ν•˜μœ„ μ»΄ν¬λ„ŒνŠΈμ— μ£Όμž…λ˜κ³  this.$store둜 μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. Counter κ΅¬ν˜„μ„ μˆ˜μ •ν•΄μ•Ό ν•©λ‹ˆλ‹€.

const Counter = {
  template: `<div>{{ count }}</div>`,
  computed: {
    count () {
      return this.$store.state.count
    }
  }
}

mapState 헬퍼

μ»΄ν¬λ„ŒνŠΈκ°€ μ—¬λŸ¬ μ €μž₯μ†Œ μƒνƒœ μ†μ„±μ΄λ‚˜ getterλ₯Ό μ‚¬μš©ν•΄μ•Όν•˜λŠ” 경우 κ³„μ‚°λœ 속성을 λͺ¨λ‘ μ„ μ–Έν•˜λ©΄ 반볡적이고 μž₯ν™©ν•΄μ§‘λ‹ˆλ‹€. 이λ₯Ό μ²˜λ¦¬ν•˜κΈ° μœ„ν•΄ μš°λ¦¬λŠ” κ³„μ‚°λœ getter ν•¨μˆ˜λ₯Ό μƒμ„±ν•˜λŠ” mapState 헬퍼λ₯Ό μ‚¬μš©ν•˜μ—¬ ν‚€ μž…λ ₯을 쀄일 수 μžˆμŠ΅λ‹ˆλ‹€.

// 독립 μ‹€ν–‰ ν˜• λΉŒλ“œμ—μ„œ 헬퍼가 Vuex.mapState둜 λ…ΈμΆœλ©λ‹ˆλ‹€.
import { mapState } from 'vuex'

export default {
  // ...
  computed: mapState({
    // ν™”μ‚΄ν‘œ ν•¨μˆ˜λŠ” μ½”λ“œλ₯Ό 맀우 κ°„κ²°ν•˜κ²Œ λ§Œλ“€μ–΄ μ€λ‹ˆλ‹€!
    count: state => state.count,

    // λ¬Έμžμ—΄ κ°’ 'count'λ₯Ό μ „λ‹¬ν•˜λŠ” 것은 `state => state.count`와 κ°™μŠ΅λ‹ˆλ‹€.
    countAlias: 'count',

    // `this`λ₯Ό μ‚¬μš©ν•˜μ—¬ 둜컬 μƒνƒœμ— μ•‘μ„ΈμŠ€ν•˜λ €λ©΄ 일반적인 ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•΄μ•Όν•©λ‹ˆλ‹€
    countPlusLocalState (state) {
      return state.count + this.localCount
    }
  })
}

λ˜ν•œ 맀핑 된 κ³„μ‚°λœ μ†μ„±μ˜ 이름이 μƒνƒœ ν•˜μœ„ 트리 이름과 같을 λ•Œ λ¬Έμžμ—΄ 배열을 mapState에 전달할 수 μžˆμŠ΅λ‹ˆλ‹€.

computed: mapState([
  // this.countλ₯Ό store.state.count에 맀핑 ν•©λ‹ˆλ‹€.
  'count'
])

객체 μ „κ°œ μ—°μ‚°μž (Object Spread Operator)

mapStateλŠ” 객체λ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€. λ‹€λ₯Έ 둜컬 μ˜μ—­μ˜ κ³„μ‚°λœ 속성과 ν•¨κ»˜ μ‚¬μš©ν•˜λ €λ©΄ μ–΄λ–»κ²Œ ν•΄μ•Ό ν•˜λ‚˜μš”? 일반적으둜, μ΅œμ’… 객체λ₯Ό computed에 전달할 수 μžˆλ„λ‘ μ—¬λŸ¬ 객체λ₯Ό ν•˜λ‚˜λ‘œ λ³‘ν•©ν•˜λŠ” μœ ν‹Έλ¦¬ν‹°λ₯Ό μ‚¬μš©ν•΄μ•Όν•©λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ (3 단계 ECMAScript μŠ€νŽ™) 객체 μ „κ°œ μ—°μ‚°μž (Object Spread Operator)을 μ‚¬μš©ν•˜λ©΄ 문법을 맀우 λ‹¨μˆœν™” ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

computed: {
  localComputed () { /* ... */ },
  // 이것을 객체 μ „κ°œ μ—°μ‚°μž(Object Spread Operator)λ₯Ό μ‚¬μš©ν•˜μ—¬ μ™ΈλΆ€ 객체에 μΆ”κ°€ ν•˜μ‹­μ‹œμ˜€.
  ...mapState({
    // ...
  })
}

μ»΄ν¬λ„ŒνŠΈμ—λŠ” μ—¬μ „νžˆ 둜컬 μƒνƒœκ°€ μžˆμ„ 수 μžˆμŠ΅λ‹ˆλ‹€.

Vuexλ₯Ό μ‚¬μš©ν•œλ‹€κ³ ν•΄μ„œ Vuex에 λͺ¨λ“  μƒνƒœλ₯Ό λ„£μ–΄μ•Όν•˜λŠ” 것은 μ•„λ‹™λ‹ˆλ‹€. Vuex에 더 λ§Žμ€ μƒνƒœλ₯Ό λ„£μœΌλ©΄ μƒνƒœ 변이가 더 λͺ…ν™•ν•˜κ³  디버그 κ°€λŠ₯ν•˜μ§€λ§Œ, λ•Œλ‘œλŠ” μ½”λ“œλ₯Ό 보닀 μž₯ν™©ν•˜κ³  κ°„μ ‘μ μœΌλ‘œ λ§Œλ“€ 수 μžˆμŠ΅λ‹ˆλ‹€. μƒνƒœ 쑰각이 단일 μ»΄ν¬λ„ŒνŠΈμ— μ—„κ²©ν•˜κ²Œ μ†ν•œ 경우 둜컬 μƒνƒœλ‘œ 남겨 λ‘˜ 수 μžˆμŠ΅λ‹ˆλ‹€. κΈ°νšŒλΉ„μš©μ„ νŒλ‹¨ν•˜κ³  μ•±μ˜ 개발 μš”κ΅¬μ— λ§žλŠ” 결정을 λ‚΄λ €μ•Ό ν•©λ‹ˆλ‹€.