vue의 상태관리툴
| topics | 200-프론트개발 202 Vue.js 206 상태관리 |
| types | 학습 도구 |
| tags |
Vue 상태관리 툴 (Vuex vs Pinia)
vuex pinia
pinia는 현재(vue3버전)에서 vue의 공식 상태관리 툴
- vuex가 업그레이드 된형태로 vue개발 인원중한명이 만듬
- pinia는 이전 버전인 vue2버전에서도 잘 작동함
- vuex는 actions, mutations, state 로 구성된 flux패턴
- pinia는 여기서 mutation이 빠졌음.
- pinia는 서버사이드 렌더링 지원
vuex
리액트의 리덕스라고할수이따(리덕스도 FLUX패턴)
FLUX
MVC패턴에서 모델과 뷰가 서로 양방향으로 영향을 받다보니
예측하기가 어려워짐
Therefore Flux패턴 두두둥장
단방향
생각한 순환 순서 : (action)>mutation> state > view
- state : 여러 컴포넌트에 공유되는 데이터
- 접근 방법 :
this.$store.state.message
- 접근 방법 :
- getter : 연산된 state값을 접근하는 속성
- 접근 방법 :
this.$store.getters.[method]
- 접근 방법 :
- mutation : state값을 변경하는 이벤트 로직
- 접근 방법 :
this.$store.commit("function_name",인자) - 사용이유
- 사실 걍 변경을 위해선 state값에 접근해도 됨.
- 명시적으로 상태변화수행
- 어느 컴포넌트에서 해당 state가 변경되었는지 확인가능
- devtool에서 관찰가능
- 이후에사실 없어짐ㅎ,ㅎ,ㅎ,ㅎㅎ\
- 접근 방법 :
- action : 비동기처리로직을 선언하는 메서드
- 접근 방법 :
this.$store.dispatch(함수 명) - 사용이유
- 언제 호출햇는지확인하기위해
- 동기 > mutation, 비동기 > action
- 접근 방법 :
helper
앞에 map붙이면 됨
this.$store.어쩌구.변수(함수)명
을 this.변수(함수)명
으로 호출 가능케함
computed(){
...mapState('num;)
//num(){ return this.$store.state.num;}
}
- 스프레드 연산자를 앞에 붙여야함 Why?
- 안에잇는 변수함수를 바깥으로거내야하니깐
- 유연한문법
- 배열 이름같을때 객체 이름다를
// 메서드 명 그대로시에 배열로다가 하면됨 ...mapMutations([ 'clickBtn', 'addNumber' ]) //하지만 새로운 메서드이름으로 호출하고 싶다. ...mapMutations({ popupMsg:'clickBtn' }) 32333322
pinia
option api, composition api 둘다 사용 가능함.
- 순환 순서 : actions> state > view
- 중앙저장소 : store
- 정의 : defineStore
- 사용 : useStore
- 이건 내생각에는 optional이 더좋은듯
- 왜냐면 composition으로 사용하는 큰 이유중에하나가 주제별(도메인별로) 모아주기 위해서인데
- 상태관리는 store을 이용하기에 이미 주제별로 모아진 후이다.
// 전역에서 couter로 store에 접근 가능
// optional api
export const useCounterStore = defineStore('counter', {
state: () => ({ count: 0, name: 'Eduardo' }),
getters: {
doubleCount: (state) => state.count * 2,,
doubledoubleCount:()=> this.doubleCount*2
},
actions: {
increment() {
this.count++
},
},
})
// composition api
export const useCounterStore = defineStore('counter', () => {
const count = ref(0)
const name = ref('Eduardo')
const doubleCount = computed(() => count.value * 2)
function increment() {
count.value++
}
// ref > state , computed > getter, function() > action
return { count, name, doubleCount, increment }
})
왜 피니아
피니아는 Vue의 스토어 라이브러리로 컴포넌트/페이지 간에 상태를 공유할 수 있습니다. 컴포지션 API에 익숙하다면 간단한 export const state = reactive({})로 전역 상태를 공유할 수 있다고 생각할 수 있습니다. 이는 SPA에는 해당되지만 SSR의 경우, 앱이 보안 취약성에 노출됩니다. 그러나 작은 SPA에서도 피니아를 사용하면 많은 이점이 있습니다:
- 테스트 유틸리티
- 플러그인: 플러그인으로 Pinia 기능 확장
- JS 사용자를 위한 적절한 TypeScript 지원 또는 자동 완성
- 서버 사이드 렌더링 지원
- Devtools 지원
- 액션, 뮤테이션을 추적하는 타임라인
- 사용되는 컴포넌트에서 스토어가 나타남
- 타임 트래블 및 더 쉬운 디버깅
- 핫 모듈 교체 (HMR)
- 페이지를 새로고침하지 않고 스토어 수정
- 개발 중 기존 상태 유지