티스토리 뷰
개요
pinia store
에서vue-router
사용 시undefined
로 인해 정상적인 동작을 하지않는 상황이 발생- 사실 이건 당연한, 간단한 구조적 문제였는데.. 저와 같은 실수를 하는 사람이 없길 바라며 작성하는 게시글입니다..
개발 환경
- build tool:
vite
- framework:
vue3
- state management:
pinia
코드
main.js
import { createApp } from 'vue' import { createPinia } from 'pinia' import App from './App.vue' import router from './router' const app = createApp(App) app.use(createPinia()) app.use(router) app.mount('#app')
stores/common.js
import { defineStore } from 'pinia' import { ref, computed } from 'vue' import { useRouter } from 'vue-router' const router = useRouter() const someVar = ref('') ... function goPage() { router.push('/next') } ... export const useCommonStore = defineStore('common', () => { return { someVar, ... } })
위와 같이 작성 시 goPage() 를 호출하면 아래와 같은 오류가 발생한다.
common.js?t=1696379954131:8 Uncaught TypeError: Cannot read properties of undefined (reading 'push')
그리고 console.log(router)
로 router 를 확인하면 undefined
를 확인할 수 있다.
원인과 해결
문제의 원인은 당연하게도
호출시점
이다. vue-router 를 참조선언 한 후 사용하려면setup
함수 내에서 선언 후 사용해야 하는데 위 소스는 그렇지 않다.
위 stores/common.js 소스는 Vue3 script definition 방식 중 하나인Composition API
사용법에서도setup function
(<script setup>) 방식과 유사하게 작성된 것인데 정상동작을 하기 위해서는 두 가지 방법이 있다.하나는 문제의 원인에 명시 된 것 처럼
setup
함수 내에 선언하여 사용하는 것 이고 다른 하나는router
가 필요한 함수에서 생성하여 사용 하는 방법이다.
setup
함수 내 선언
setup
함수 내 선언하여 사용하는 방법 (defineStore 함수의 두번째인자가 storeSetup 속성이다)
// common.js
import { defineStore } from 'pinia'
import { ref, computed } from 'vue'
import { useRouter } from 'vue-router'
...
const router = ref(null)
...
function goPage() {
router.value.push('/next')
}
export const useCommonStore = defineStore('common', () => {
router.value = useRouter()
return {
someVar,
...
}
})
개별 함수 내 선언
호출이 필요한 함수 내에서 별도로 생성하여 사용하는 방법
// common.js
import { defineStore } from 'pinia'
import { ref, computed } from 'vue'
import { useRouter } from 'vue-router'
const someVar = ref('')
...
function goPage() {
// goPage 함수 내에서 선언
const router = useRouter()
router.push('/go_next')
}
...
export const useCommonStore = defineStore('common', () => {
return {
someVar,
...
}
})
'프로그래밍' 카테고리의 다른 글
[HUGO] 시작하기 (0) | 2025.03.02 |
---|---|
[Vue] nextTick 활용 (#1) (1) | 2025.03.01 |
[Vue] import.meta.env.MODE 값 설정하기 (0) | 2025.02.27 |
[Vue] computed property 값 변경하기 (0) | 2025.02.26 |
[Vue] 전역 변수 사용하기 (#2) (0) | 2025.02.25 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 성스러운 계곡
- Namibia
- 우유니
- MariaDB
- Cusco
- 킹덤 호텔
- aguas calientes
- 토레스 델 파이네
- 캄보디아
- 칠레
- calama
- 나미비아
- 아구아스 칼리엔테스
- 남미
- Oracle
- 볼리비아
- Cambodia
- 쿠스코
- 빈트후크
- vue3
- 햄버거
- 마추피추
- 족발
- Uyuni
- 애드센스
- 칼라마
- 성계 투어
- 빅토리아폴스
- jQuery
- mysql
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 | 29 |
30 | 31 |
글 보관함