Vuexλ λ¨μΌ μν νΈλ¦¬ λ₯Ό μ¬μ©ν©λλ€. μ¦, μ΄ λ¨μΌ κ°μ²΄λ λͺ¨λ μ ν리μΌμ΄μ μμ€μ μνλ₯Ό ν¬ν¨νλ©° "μλ³Έ μμ€" μν μ ν©λλ€. μ΄λ κ° μ ν리μΌμ΄μ λ§λ€ νλμ μ μ₯μλ§ κ°κ² λλ€λ κ²μ μλ―Έν©λλ€. λ¨μΌ μν νΈλ¦¬λ₯Ό μ¬μ©νλ©΄ νΉμ μνλ₯Ό μ½κ² μ°Ύμ μ μμΌλ―λ‘ λλ²κΉ μ μν΄ νμ¬ μ± μνμ μ€λ μ·μ μ½κ² κ°μ Έμ¬ μ μμ΅λλ€.
λ¨μΌ μν νΈλ¦¬λ λͺ¨λμ±κ³Ό μΆ©λνμ§ μμ΅λλ€. λμ€μ μνμ λ³μ΄λ₯Ό νμ λͺ¨λλ‘ λΆν νλ λ°©λ²μ λν΄ μ€λͺ ν©λλ€.
κ·Έλ¬λ©΄ 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
}
}
}
μ»΄ν¬λνΈκ° μ¬λ¬ μ μ₯μ μν μμ±μ΄λ 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'
])
mapState
λ κ°μ²΄λ₯Ό λ°νν©λλ€. λ€λ₯Έ λ‘컬 μμμ κ³μ°λ μμ±κ³Ό ν¨κ» μ¬μ©νλ €λ©΄ μ΄λ»κ² ν΄μΌ νλμ? μΌλ°μ μΌλ‘, μ΅μ’
κ°μ²΄λ₯Ό computed
μ μ λ¬ν μ μλλ‘ μ¬λ¬ κ°μ²΄λ₯Ό νλλ‘ λ³ν©νλ μ νΈλ¦¬ν°λ₯Ό μ¬μ©ν΄μΌν©λλ€. κ·Έλ¬λ (3 λ¨κ³ ECMAScript μ€ν) κ°μ²΄ μ κ° μ°μ°μ (Object Spread Operator)μ μ¬μ©νλ©΄ λ¬Έλ²μ λ§€μ° λ¨μν ν μ μμ΅λλ€.
computed: {
localComputed () { /* ... */ },
// μ΄κ²μ κ°μ²΄ μ κ° μ°μ°μ(Object Spread Operator)λ₯Ό μ¬μ©νμ¬ μΈλΆ κ°μ²΄μ μΆκ° νμμμ€.
...mapState({
// ...
})
}
Vuexλ₯Ό μ¬μ©νλ€κ³ ν΄μ Vuexμ λͺ¨λ μνλ₯Ό λ£μ΄μΌνλ κ²μ μλλλ€. Vuexμ λ λ§μ μνλ₯Ό λ£μΌλ©΄ μν λ³μ΄κ° λ λͺ ννκ³ λλ²κ·Έ κ°λ₯νμ§λ§, λλ‘λ μ½λλ₯Ό λ³΄λ€ μ₯ν©νκ³ κ°μ μ μΌλ‘ λ§λ€ μ μμ΅λλ€. μν μ‘°κ°μ΄ λ¨μΌ μ»΄ν¬λνΈμ μ격νκ² μν κ²½μ° λ‘컬 μνλ‘ λ¨κ²¨ λ μ μμ΅λλ€. κΈ°νλΉμ©μ νλ¨νκ³ μ±μ κ°λ° μꡬμ λ§λ κ²°μ μ λ΄λ €μΌ ν©λλ€.