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/​

 

πŸ’­ 잘λͺ»λœ λ‚΄μš©μ΄ μžˆλ‹€λ©΄ ν”Όλ“œλ°± λΆ€νƒλ“œλ¦½λ‹ˆλ‹€ πŸ˜‰