๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
TIL/Vue.js

Vuex - State, Getters, Mutations, Actions

by Edlin 2022. 5. 17.

๐Ÿ”Š 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/โ€‹

 

๐Ÿ’ญ ์ž˜๋ชป๋œ ๋‚ด์šฉ์ด ์žˆ๋‹ค๋ฉด ํ”ผ๋“œ๋ฐฑ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค ๐Ÿ˜‰

๋Œ“๊ธ€