[Vue]vuex - Helperํ•จ์ˆ˜

Na Jeongยท2023๋…„ 3์›” 17์ผ
0

Vue

๋ชฉ๋ก ๋ณด๊ธฐ
3/3
post-thumbnail

๐Ÿ‘ฉโ€๐Ÿ’ปHelper

๊ฐ ์†์„ฑ๋“ค์„ ๋” ์‰ฝ๊ฒŒ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

Store์— ์žˆ๋Š” ์•„๋ž˜ 4๊ฐ€์ง€ ์†์„ฑ๋“ค์„ ๊ฐ„ํŽธํ•˜๊ฒŒ ์ฝ”๋”ฉํ•˜๋Š” ๋ฐฉ๋ฒ•

  • state -> mapState
  • getteres -> mapGetters
  • mutations -> mapMutations
  • actions -> mapActions

๐Ÿ“Œํ—ฌํผ์˜ ์‚ฌ์šฉ๋ฒ•

ํ—ฌํผ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ ์ž ํ•˜๋Š” vue ํŒŒ์ผ์—์„œ ์•„๋ž˜์™€ ๊ฐ™์ด ํ•ด๋‹น ํ—ฌํผ๋ฅผ ๋กœ๋”ฉํ•œ๋‹ค.
ํ•„์š”ํ•œ ์†์„ฑ์˜ ํ‚ค๊ฐ’์„ ๋ฐฐ์—ด๋กœ ์ž…๋ ฅํ•˜๊ณ , ๊ฐ์ฒด ์ „๊ฐœ ์—ฐ์‚ฐ์ž(ES6 ๋ฌธ๋ฒ•)๋กœ ์ ์šฉํ•œ๋‹ค.

//App.vue
import { mapState, mapGetters, mapMutations, mapActions } from 'vuex'

export default {
	computed() {
		...mapState(['num'], ...mapGetters(['countedNum'])
    },
    
    methods: {
    	...mapMutations(['clickBtn']), ...mapActions(['asyncClickBtn'])
    }
}

๐Ÿ“ŒmapState

Vuex์— ์„ ์–ธํ•œ state ์†์„ฑ์„ ๋ทฐ ์ปดํฌ๋„ŒํŠธ์— ๋” ์‰ฝ๊ฒŒ ์—ฐ๊ฒฐํ•ด์ฃผ๋Š” ํ—ฌํผ
computed()์— ์„ ์–ธํ•œ๋‹ค.

//App.vue
import { mapState } from 'vuex'

computed() {
	...mapState(['num'])
    //num() { return this.$store.state.num; } ๊ณผ ๊ฐ™์Œ
}

//store.js
state: {
	num: 10
}

<p>{{ this.num }}</p>

๐Ÿ“ŒmapGetters

Vuex์— ์„ ์–ธํ•œ state ์†์„ฑ์„ ๋ทฐ ์ปดํฌ๋„ŒํŠธ์— ๋” ์‰ฝ๊ฒŒ ์—ฐ๊ฒฐํ•ด์ฃผ๋Š” ํ—ฌํผ
computed()์— ์„ ์–ธํ•œ๋‹ค.

//App.vue
import { mapGetters } from 'vuex'

computed() {
	...mapGetters(['reverseMsg'])
}

//store.js
getters: {
	reverseMsg(state) {
    	return state.msg.split('').reverse().join('');
    }
}
 
<p>{{ this.reverseMsg }}</p>
    

๐Ÿ“ŒmapMutations

Vuex์— ์„ ์–ธํ•œ ๋ฉ”์„œ๋“œ๋“ค์„ Vue ์ปดํฌ๋„ŒํŠธ์— ๋” ์‰ฝ๊ฒŒ ์—ฐ๊ฒฐํ•ด์ฃผ๋Š” ํ—ฌํผ
methods ํ•„๋“œ์— ์„ ์–ธํ•œ๋‹ค.

//App.vue
import { mapMutations } from 'vuex'

methods: {
	...mapMutations(['clickBtn']),
    authLogin() {},
    displayTable() {}
}

//store.js
mutations: {
	clickBtn(state) {
    	alert(state.msg);
    }
}

//component
<button @click="clickBtn">popup message</button>

๐Ÿ“ŒmapActions

Vuex์— ์„ ์–ธํ•œ ๋ฉ”์„œ๋“œ๋“ค์„ Vue ์ปดํฌ๋„ŒํŠธ์— ๋” ์‰ฝ๊ฒŒ ์—ฐ๊ฒฐํ•ด์ฃผ๋Š” ํ—ฌํผ
methods ํ•„๋“œ์— ์„ ์–ธํ•œ๋‹ค.

//App.vue
import { mapActions } from 'vuex'

methods: {
	...mapActions(['delayClickBtn']),
}

//store.js
actions: {
	delayClickBtn(context) {
    	setTimeout(() => context.commit('clickBtn'), 2000);
    }
}

//component
<button @click="delayCLickBtn">delay popup message</button>

ํ—ฌํผ์˜ ์œ ์—ฐํ•œ ๋ฌธ๋ฒ•

Vuex์— ์„ ์–ธํ•œ ์†์„ฑ์„ ๊ทธ๋ž˜๋„ ์ปดํฌ๋„ŒํŠธ์— ์—ฐ๊ฒฐํ•˜๋Š” ๋ฌธ๋ฒ•

//๋ฐฐ์—ด ๋ฆฌํ„ฐ๋Ÿด
...mapMutations({
	'clickBtn', //'clickBtn' : clickBtn
    'addNumber' //addNumber(์ธ์ž)
])

Vuex์— ์„ ์–ธํ•œ ์†์„ฑ์„ ์ปดํฌ๋„ŒํŠธ์˜ ํŠน์ • ๋ฉ”์„œ๋“œ์—๋‹ค๊ฐ€ ์—ฐ๊ฒฐํ•˜๋Š” ๋ฌธ๋ฒ•

//๊ฐ์ฒด ๋ฆฌํ„ฐ๋Ÿด
...mapMutations({
	popupMsg: 'clickBtn' //์ปดํฌ๋„ŒํŠธ ๋ฉ”์„œ๋“œ ๋ช… : Store์˜ mutation ๋ช…
})
profile
๋Š์ž„์—†์ด ๋…ธ๋ ฅํ•˜๋Š” ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์ž (โธโธโขโธโธ) เท†

0๊ฐœ์˜ ๋Œ“๊ธ€