๐Ÿ‘ฉ‍๐Ÿ’ป/Vue

[note] Vue.js์˜ ์ƒํƒœ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ Vuex์˜ ํ•ต์‹ฌ๋“ค (1) state & getters

ํ•œ๋‚˜ 2020. 12. 24. 00:38

์ด์ „ ํ”„๋กœ์ ํŠธ์—์„œ Vue.js์—์„œ ์ปดํฌ๋„ŒํŠธ ๊ฐ„์˜ ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ์„ ๋‹ค๋ฃฐ ๋•Œ event bus ๋“ฑ์œผ๋กœ๋งŒ ๊ด€๋ฆฌํ–ˆ์„ ๋•Œ ์ปดํฌ๋„ŒํŠธ๋ผ๋ฆฌ์˜ ๊ด€๊ณ„์„ฑ์„ ํŒŒ์•…ํ•˜๊ธฐ ์–ด๋ ค์› ๋‹ค. ์‚ฌ์ด์ฆˆ๊ฐ€ ํฐ ์•ฑ์„ ๋‹ค๋ฃฐ ๋•Œ๋Š” ๊ทธ๋ž˜์„œ Vuex๋ฅผ ๋งŽ์ด ์“ฐ๋Š”๋ฐ, ์ฒ˜์Œ Vuex๋ฅผ ์ ‘ํ–ˆ์„ ๋•Œ ๋งŽ์ด ํ—ท๊ฐˆ๋ ธ์–ด์„œ, ํ•œ ๋ฒˆ ์ •๋ฆฌ๋ฅผ ์ญ‰ ํ•ด๋ดค๋‹ค.

 

Vuex๋Š” ํ•ต์‹ฌ์ธ state, mutations, actions๋ฅผ ์ดํ•ดํ•˜๋Š” ๊ฒŒ ์ค‘์š”ํ•œ๋ฐ, state๋Š” vuex๋ผ๋Š” ๊ณตํ†ต ์ค‘์•™ ์ €์žฅ์†Œ๊ฐ€ ๊ฐ€์ง€๋Š”, ๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๊ณต์œ ํ•˜๋Š” data๋‹ค. ์ด state๋ผ๋Š” data๋Š” ๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ ๊ฐ„์— ๊ณต์œ ๋˜๋Š” ์†์„ฑ์ด๊ธฐ ๋•Œ๋ฌธ์— this.$store.state.sampleState ์‹์œผ๋กœ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

 

ํ•˜์ง€๋งŒ, ์ปดํฌ๋„ŒํŠธ๋ผ๋ฆฌ ๋ชจ๋‘ ๊ณต์œ ๊ฐ€ ๋œ๋‹ค๋Š” ์†์„ฑ ๋•Œ๋ฌธ์—, ์ง์ ‘์ ์œผ๋กœ ์ด๋ ‡๊ฒŒ ์ ‘๊ทผํ•ด ์ƒํƒœ๋ฅผ ๋ฐ”๊พธ๋Š” ๊ฒƒ์€ ๊ทธ๋‹ค์ง€ ์ข‹์€ ๋ฐฉ๋ฒ•์ด ์•„๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ, ๋˜๋„๋ก vuex์—์„œ ๊ฐ state์˜ ๋ณ€๊ฒฝ์„ ๋‹ค๋ฃจ๊ณ , ์ด๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๋กœ์ง์„ ๊ฐ ์ปดํฌ๋„ŒํŠธ์—์„œ ๋ถˆ๋Ÿฌ์“ฐ๋Š” ๊ฒƒ์ด ๊น”๋”ํ•˜๋‹ค.

 

// store -> index.js
const store = new Vuex.Store({
  state: {
    counter: 0
  },
  getters: {
    counterTimes: state => {
      return state.counter * 2
    }
  }
})

 

store๋ฅผ ๊ฐ–๋Š”, js ํŒŒ์ผ์—, ์šฐ๋ฆฌ๋Š” state์— counter๋ผ๋Š” ๋ณ€์ˆ˜๋ฅผ ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•ด ์„ค์ •ํ•ด๋‘๊ณ , getters๋ผ๋Š” ์†์„ฑ์„ ๋˜ ๋”ฐ๋กœ ๋‘˜ ์ˆ˜ ์žˆ์–ด, ์—ฌ๊ธฐ์— state ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๋Š” ๋‹ค์–‘ํ•œ ํ•จ์ˆ˜๋ฅผ ๋ฏธ๋ฆฌ ์„ ์–ธํ•ด๋‘๊ณ , ๊ฐ๊ฐ์˜ ์ปดํฌ๋„ŒํŠธ๋“ค์ด ํ•„์š”ํ•  ๋•Œ๋งˆ๋‹ค state๋ฅผ ๋ถˆ๋Ÿฌ ๋กœ์ง์„ ๋”ฐ๋กœ ์ž‘์„ฑํ•˜๋Š” ๋Œ€์‹ , counterTimes๋ฅผ ๋ถ€๋ฅด๋Š” ์‹์œผ๋กœ ๋Œ€์ฒ˜ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ฝ”๋“œ์˜ ์ค‘๋ณต์„ ๋ง‰๊ธฐ ์œ„ํ•œ Vuex์˜ ์žฅ์น˜๋‹ค.

 

๊ทธ๋Ÿผ store์— ๋“ฑ๋กํ•ด๋‘” getters ์†์„ฑ์€, ์‹ค์ œ ์‚ฌ์šฉ๋  ์ปดํฌ๋„ŒํŠธ์—์„œ ์•„๋ž˜์™€ ๊ฐ™์ด computed ์†์„ฑ ๋‚ด๋ถ€์— ํ˜ธ์ถœํ•ด์ค„ ์ˆ˜ ์žˆ๋‹ค.

// App.vue 
// ..
<div>
	display: {{ counterTimes }}
</div>

<script>
	export default {
   	// ..
    	computed: {
        	counterTimes() {
            	return this.$state.getters.counterTimes
            }
        }
   	}
    
    
</script>

์ด๋•Œ Vuex์˜ ...mapGetters ํ—ฌํผ ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ์ข€ ๋” ๊ฐ€๋…์„ฑ์„ ์ข‹๊ฒŒ ํ•œ ์ฝ”๋“œ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

 

 

// App.vue 
// ..
<div>
	display: {{ counterTimes }}
</div>

<script>
import { mapGetters } from 'vuex' // import ์‹œ์ผœ์ค€ ํ›„,

	export default {
   	// ..
    	computed: {
        	...mapGetters([
            	'counterTimes' // store์˜ getters์— ๋“ฑ๋ก๋œ ์†์„ฑ์˜ ์ด๋ฆ„
            ])
        }
   	}
    
    
</script>

...mapGetters๋Š”, computed ์†์„ฑ์— ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ ๋‚ด์—์„œ ์‚ฌ์šฉ๋  ๋‹ค๋ฅธ ์†์„ฑ๊ณผ ํ•จ๊ป˜ ์“ฐ๊ธฐ ์œ„ํ•จ์ด๋‹ค. ES2015 ๋ฌธ๋ฒ•.

 

๋งŒ์ผ, getters์˜ ์ด๋ฆ„์„ ๋‹ค๋ฅด๊ฒŒ ์„ค์ •ํ•˜๊ณ ์ž ํ•œ๋‹ค๋ฉด, ์•„๋ž˜์ฒ˜๋Ÿผ ์“ธ ์ˆ˜ ์žˆ๋‹ค.

 

// App.vue 
// ..
<div>
	display: {{ counterTimesDiff }}
</div>

<script>
import { mapGetters } from 'vuex' // import ์‹œ์ผœ์ค€ ํ›„,

	export default {
   	// ..
    	computed: {
        	...mapGetters([
            	counterTimesDiff: 'counterTimes' 
                	// 'counterTimes'๋Š” store์˜ getters์— ๋“ฑ๋ก๋œ ์†์„ฑ์˜ ์ด๋ฆ„
            ])
        }
   	}
    
    
</script>