vue3 vuex
업데이트:
카테고리: vue3
/작성완료시 Todo_list 로 이동
router.push를 이용해서 list로 이동하면 되지만 성공완료 메세지가 보이지 않는다.
페이지 이동을 하면서 컴포넌트가 유실되기 때문!
⇒ 최상위 컴포넌트인 App
에 성공완료 메세지를 넣어두면 어디에서든지 잘 보이게된다.
변경된 status 값이 넘어가지 않기에 변경이 되지않는다
emit으로 값을 넘겨줄 수 있으나 점점 컴포넌트가 깊어지기 때문에 복잡해진다.
Vuex
- 상태 관리 라이브러리
- 글로벌하게 관리되는 데이터는 store에서 관리한다.
- 설치 :
npm install vuex@next --save
src>store>index.js
생성- 해당 코드 작성
- 설치 :
// store>index.js
import { createStore } from "vuex";
export default createStore({
state: {
}
})
//main.js
import { createApp } from 'vue'
import App from './App.vue'
import router from './router'
import store from './store'
createApp(App).use(store).use(router).mount('#app')
createApp.use(store)
추가
state
데이터의 관리 (아래 형식과 같이 작성)
state: {
showToast: false,
toastMessage: '',
toastAlertType: '',
toastTimeOut: null
}
컴포넌트 사용법
import { useStore } from 'vuex'
export default {
setup() {
const store = useStore()
const example = store.state.exampe
}
}
옆과 같이 store.state.변수이름
으로 작성한 데이터에 접근할 수 있다.
⇒ store에서 변화가 있을때 해당 컴포넌트에서 변화를 감지하지 못하기때문에 computed
로 감싸준다.
computed로 싸인 객체의 값
mutations
state 값에 접근하여 변경할 수 있다!
mutations: {
UPDATE_TOAST_MESSAGE(state, payload) {
state.toastMessage = payload
},
UPDATE_TOAST_ALERT_TYPE(state, payload) {
state.toastAlertType = payload
},
UPDATE_TOAST_STATUS(state, payload) {
state.showToast = payload
},
UPDATE_TOAST_TIME_OUT(state, payload) {
state.toastTimeOut = payload
}
}
mutation의 함수는 모두 대문자로 작성해야 하며, state와 변경할 값을 인자로 받는다!
vue에서는 store.commit(’함수이름’)
으로 사용!
이때 mutation 은 동기적으로 작동되야한다 (완료가 되는 순)
객체나 배열로 추가 및 삭제를 할 떄에는 아래의 코드를 활용한다.
state.toasts.push(payload)
state.toasts.shift() // 첫번째 값 삭제, 특정 행을 삭제하려면 splice 활용
actions
actions: {
tiggerToast({commit}, message, type = 'success'){
commit('UPDATE_TOAST_MESSAGE', message)
commit('UPDATE_TOAST_ALERT_TYPE', type)
commit('UPDATE_TOAST_STATUS', true)
const toastTimeOut = setTimeout(() => {
commit('UPDATE_TOAST_MESSAGE', '')
commit('UPDATE_TOAST_STATUS', false)
commit('UPDATE_TOAST_ALERT_TYPE', '')
}, 3000)
commit(`UPDATE_TOAST_TIME_OUT`, toastTimeOut)
}
}
액션에서는 해당 mutation 함수를 받아서 실질적으로 일어나는 행동을 작성하면 된다.
함수({사용할 컨텍스트}, payload(하나))
받는 데이터는 하나를 받게 되기때문에 여러개를 받을시 객체 형태로 작성해야한다.
이때 값 변경은 state를 직접 호출하는 것이 아닌 mutation의 함수로 값을 변경해야된다!
다른 파일에서는 store.dispatch('함수이름', 넘겨줄 데이터)
로 사용한다.
getters
vuex에서 사용하는 computed 느낌!
getters: {
toastMessageWithSmile (state) {
return state.toastMessage + '^^'
}
}
위와 같이 함수로 작성 return
이 반드시 필요!
store.getters.함수이름
으로 사용!
vuex modules
데이터가 많아짐에 따라 점점 커지고 관리하기가 힘들어짐
state를 관련된 것끼리 관리가 가능하다!
modules: {
toast: {
namespaced: true,
state: {},
mutations: {},
...
}
}
모듈안에 객체이름을 넣고 namespaced: true
로 설정한뒤 해당 객체의 데이터와 함수들을 다 넣어주면 된다.
vue 에서 사용할 때는 앞에 객체이름을 작성해주면 된다.
store.state.toast.변수이름
store.getters['toast/toastMessageWithSmile']
store.dispatch(’toast/tiggerToast’)
파일로 분리
store>modules>객체이름
으로 나누고 아래에 파일은 index.js
로 생성
toast 폴더
export default {
namespaced: true,
state: {},
mutations: {},
...
}
modules
import toast from './toast'
export default {
toast
}
불러올 객체 폴더를 넣어준다. 이때 toast: toast
로 작성해야되지만 javascript 문법상 앞뒤가 똑같으면 생략이 가능하다!
transition-group
toast.js에서 모든 함수를 관리하게 되면 vue에서는 함수를 사용할 필요가 없어 코드가 깔끔해진다.
여러개의 태그에 액션을 취해야 할때 transition은 하나의 요소밖에 접근을 하지 못해서 에러가 발생
transition-group
태그를 감싸면 해결된다.