TIL/Vue.js
Vuex - State, Getters, Mutations, Actions
Edlin
2022. 5. 17. 09:21
π Vueμ λν μ΄ν΄κ° μλ€λ κ°μ νμ μ 리λ μλ£μ
λλ€.
π 곡μ μ¬μ΄νΈλ₯Ό μ 리ν λ΄μ©μ
λλ€. μμΈν λ΄μ©μ 곡μ μ¬μ΄νΈλ₯Ό μ°Έκ³ ν΄μ£ΌμΈμ π
π Vuexμ λͺ¨λμ λ³Έ μ₯μμ λ€λ£¨μ§ μμ΅λλ€.
1. Vuexλ λκΉ?
- μν κ΄λ¦¬ + λΌμ΄λΈλ¬λ¦¬
- μν κ΄λ¦¬?
- Vueμ 3κ°μ§ κΈ°λ₯: data, template, methods
- state = data : μ±μ μλνλ μλ³Έ μμ€, μ‘°μνκ³ μ νλ λ°μ΄ν°
- view: μνμ μ μΈμ λ§€ν. μ¬μ©ν dataλ₯Ό μ μΈνλ κ³³
- methods: dataλ₯Ό μ€μ λ‘ μ‘°μνλ κ³³
- μν κ΄λ¦¬?
- Components κ° λ§μ΄ μ¬μ©νλ data(state)λ₯Ό μ€μ μ§μ€ μ μ₯μμμ κ΄λ¦¬νκΈ° μν μν
new Vue({
// 1. μν = data
data(){
return {
a: 0
};
}
// 2. View = html element
template: `
<div> {{a}} </div>
`
// 3. Action = data μ‘°μκ³Ό κ°μ ν¨μ
methods: {
doubleA() {
this.a *= 2
}
}
});
2. Vuex λ±μ₯ μ΄μ
- Vueλ μ»΄ν¬λνΈ κ° λ¨λ°©ν₯ ν΅μ μ μ 곡νλ€.
- μμμμ νμλ‘λ§ λ°μ΄ν° μ λ¬μ΄ κ°λ₯νλ€. (props)
- νμμμ μμλ‘ λ°μ΄ν° μ λ¬μ ν λλ μ΄λ²€νΈλ₯Ό λ°μμν¨λ€. ($emit)
β λ°μ΄ν°μ μΌκ΄μ νλ¦μ 보μ₯ν μ μλ€.
3. Vuex
β storeλ₯Ό μ΄μ©νμ¬ λ°μ΄ν°μ μΌκ΄μ νλ¦μ 보μ₯νλ€.
- store: μ ν리μΌμ΄μ μν(λ°μ΄ν°)λ₯Ό 보κ΄νκ³ μλ 컨ν μ΄λ
- λκΈ°μ , λΉλκΈ°μ μΌλ‘ μνμ λμν μ μλ€. (=λ°μν)
- μ μ₯μ μ½λ μμ
const store = new Vuex.store({
state: {
stored_data: 0
},
mutations: {
update_stored_data(state) {
stored_data++;
}
}
});
store.commit('update_stored_data');
console.log(store.state.stored_data);
4. Vuex ꡬμ±
1) State
- λ¨μΌ μν νΈλ¦¬ μ¬μ©
- μ»΄ν¬λνΈμμ λ§μ΄ μ°Έμ‘°λλ dataκ° μ μΈλμ΄ μλ€.
- Vuex storeμμ μ»΄ν¬λνΈμ μ¬μ©λλ state(data)λ₯Ό νλμ νμΈ κ°λ₯νλ€.
- λ¨μΌ νΈλ¦¬ ννλ‘ μ κ·Ό κ°λ₯νλ€.
- mutationsμ μ μλ methodμ μν΄ λ³κ²½μ΄ κ°λ₯νλ€.
- λκΈ° μ²λ¦¬κ° νμν κ²½μ° mutationsμ methodλ₯Ό νΈμΆνλ€. (λλ¬Έμλ‘ μμ±, ꡬλΆμ μν΄)
- μ»΄ν¬λνΈμμ μ§μ λ³κ²½ β
- actionsμ methodλ₯Ό νΈμΆνλ κ²μ dispatchλΌκ³ νλ€.
- λΉλκΈ°μ μ²λ¦¬κ° νμν κ²½μ° actionsμ methodλ₯Ό νΈμΆνλ€.
2) Getters
- stateμ μ‘°μμ΄ νμν κ²½μ° gettersλ₯Ό νΈμΆνλ€. (filterμ μν )
- μ€μ λ°μ΄ν° λ³κ²½μ΄ μΌμ΄λλ κ²μ μλλ€.
- μΈμλ‘ stateκ° μ£Όμ΄μ§λ€.
3) Mutations
- μ μ₯μμ μ κ·Όνμ¬ state(λ°μ΄ν°)λ₯Ό λ³κ²½νλ€.
- μΈμλ‘ stateκ° μ£Όμ΄μ§λ€.
4) Actions
- λΉλκΈ°μ μ²λ¦¬λ₯Ό λ΄λΉνλ€.
- stateλ₯Ό μ§μ μ κ·Όνμ§ μκ³ state λ³κ²½μ΄ νμν κ²½μ° mutationsμ κ±°μΉλ€.
- mutationsμ μ κ·Όνκ³ μ ν λ, context.commit(mutations μ΄λ¦)μ νΈμΆνλ€.
- μΈμλ‘ contextκ° μ£Όμ΄μ§λ€.
5) Helper
- mutations, getters, actions, stateμ μ μΈμ μλ΅νκ³ κΉλνκ² μ κ·ΌνκΈ° μν λ°©μ
- mapState, mapGetters, mapMutations, mapActionsκ° μλ€.
- ES6μ SpreadOperatorμ μ¬μ©νλ€.
- spread μ°μ°μλ νΉμ κ°μ²΄ λλ λ°°μ΄μ λ€λ₯Έ κ°μ²΄λ λ°°μ΄λ‘ 볡μ νκΈ° μν κ²
let obj1 = {
a: 5, b: 10
};
let obj2 = {...obj1, c: 20};
6) μ½λ
// store/index.js
const store = new Vuex.Store({
state: {
data: 0
},
mutations: {
UPDATE_DATA(state) {
data++;
}
},
actions: { // λΉλκΈ° μ²λ¦¬ λ΄λΉ
update_data(context) {
// λΉλκΈ° μ²λ¦¬ ν...
// λ°μ΄ν° setting
context.commit('UPDATE_DATA');
}
},
getters: {
append_to_data(state) {
return "value: " + state.data;
}
}
});
// xxx.vue
...
<script>
import { mapState, mapMutations, mapGetters, mapActions } from "vuex";
export default {
name: "",
data() {
return {};
},
computed: {
...mapState(["data"]),
...mapGetters(["append_to_data"]),
...
},
methods: {
...mapActions(["update_data"]),
...mapMutations(["UPDATE_DATA"])
}
}
</script>
API λ¬Έμ: https://v3.vuex.vuejs.org/kr/β
π μλͺ»λ λ΄μ©μ΄ μλ€λ©΄ νΌλλ°± λΆνλ립λλ€ π