"Vuex는 Vue.js 상태관리 패턴 입니다."
사용을 고려하는 이유들은 간단히 보면 아래와 비슷합니다.
1. 각 Components 간의 데이터를 공유하고 처리 가능
2. 화면 구현과 이터 처리하는 로직을 구분함으로서 유지보수가 용이
1. 설치
npm i --save vuex@next
2. Vuex 구조
namespaced를 사용하여 아래와 같이 각 업무 별로 구분해준다.
3. vuex 사용 :
Namespaced를 사용할 경우
실제 vuex를 사용하고자 하는 component에서 아래와 같이 사용한다.
createNamespacedHelpers(moduleName)
그런데 이 경우 moduleName이 정확해야한다.
moduleName : 자신의 module Path + 생성시 정한 Name
예를 들어 아래 toast는 common 하위이므로
Path : common/
Name : toast
즉, ModuleName은 common/toast 이다.
index.js
import { createStore } from 'vuex' import { module as common } from './modules/common/commonStore' import { module as main } from './modules/main/mainStore' export default createStore({ modules: { common, main } })
modules/common/index.js
하위 vuex 모듈을 등록한다.
import { module as toast } from './toastStore' const ModuleName = 'common' // 반드시 초기 Store 생성시 정한 path/Name과 동일해야합니다. const module = { namespaced: true, modules: { toast } } export { module, ModuleName }
실제 사용하는 vuex 정의
modules/main/mainStore.js
const ModuleName = 'main' // 반드시 초기 Store 생성시 정한 path/Name과 동일해야합니다. const module = { namespaced: true, state: { menuList: [] }, getters: { menuList (state) { return state.menuList } }, actions: { setMenuList ({ commit, state }, menuList) { commit('setMenuList', menuList) } }, mutations: { // 화면에 노출될 GNB 카테고리 저장 setMenuList(state, menuList) { state.menuList = menuList } }, modules: { // 하위 모듈 Vuex 정의 } } export { module, ModuleName }
modules/common/toastStore.js
const ModuleName = 'common/toast' // 반드시 초기 Store 생성시 정한 path/Name과 동일해야합니다. const module = { namespaced: true, state: { visible: false, message: '', timer: null, duration: 2000, onClose: null }, actions: { showToast ({ state }, option) { state.message = '' state.onClose = null state.visible = true if(typeof option === 'object') { state.message = option.message if (typeof option.onClose === 'function') { state.onClose = option.onClose } }else{ state.message = option } state.timer = setTimeout(() => { module.actions.hideToast({ state: state }) }, state.duration) }, hideToast({ state }) { clearTimeout(state.timer) state.visible = false state.onClose && (typeof state.onClose === 'function') && state.onClose() } } } export { module, ModuleName }
4. Component에서 Vuex 사용
import { ModuleName as toastName } from '@store/common/toastStore' import { ModuleName as mainName } from '@store/main/mainStore' import { createNamespacedHelpers } from 'vuex' const { mapGetters, mapActions } = createNamespacedHelpers(toastName) // or // vuex를 여러개 사용할때 아래와 같이 다르게 접근 가능 const toastStore = createNamespacedHelpers(toastName) const mainStore = createNamespacedHelpers(mainName) export default { data() { return { text: '' } }, computed: { // vuex getters computed로 정의 ...mapGetters([]), ...toastStore.mapGetters([]), ...mainStore.mapGetters(['menuList']) }, created() { this.setMenuList(['HOME', 'MENU1', 'MENU2']) console.log('menuList : ', this.menuList) }, methods: { // vuex actions를 method로 정의 ...mapActions([]), ...toastStore.mapActions([]), ...mainStore.mapActions(['setMenuList']) } }
컴포넌트 import 없이 사용하기 - 전역등록 (0) | 2023.01.22 |
---|---|
Vue Router v4.x (0) | 2023.01.22 |
Vue Application Package 구조 (0) | 2023.01.22 |
Vue Component 쉽게 debug 하기 (0) | 2023.01.22 |
eslint 적용 - vue3 (0) | 2023.01.22 |
댓글 영역