this.$router.push(동일path)일 경우 에러가 나고 새로 고침을 하자니 SPA페이지에서 낭비인 것 같기도 해서
어떤 방식을 써야하나? 고민을 하다가 찾은 방식. (기록을 위한 작성)
검색하다가 알게된 블로그에서 3가지 방식을 알려주고 있었다.
v-if 방식, forceUpdate 방식, 그리고 key를 통한 방식.
가장 추천하는 방식으로 (vue가 원하는..?) 진행했다.
레이아웃 단계에서 진행.
base-header 컴포넌트에 gnb가 있으며 nuxt 컴포넌트는 페이지이다.
// BaseLayout.vue
<template>
<div>
<base-header @forceUpdate="handleForceUpdate"/>
</div>
<div>
<Nuxt :key="componentRenderKey"/>
</div>
<div>
<base-footer />
</div>
</template>
<script>
export default {
name: 'BaseLayout',
data() {
return {
componentRenderKey: 0,
}
},
methods: {
handleForceUpdate() {
// 키 값이 올라가면서 :key의 값이 변하여 Nuxt가 리렌더링된다.
this.componentRenderKey = this.componentRenderKey + 1;
// 이때 스크롤까지 초기화되는 것은 아니므로 top으로 올려주기
window.scroll(0, 0);
},
}
}
</script>
// base-header.vue
<template>
<header>
<ul>
<li v-for="nav in gnb">
<nuxt-link
:to="nav.path"
@click.native="() => handleForceUpdate(nav.path)"
>
{{nav.name}}
</nuxt-link>
</li>
// ....
</ul>
</header>
</template>
<script>
export default {
name: 'BaseHeader',
methods: {
handleForceUpdate(to) {
if (to === this.$route.path) {
// 상위컴포넌트(Base Layout)로 이벤트 발생 (emit)
this.$emit('forceUpdate');
} else {
this.$router.push(to);
}
}
}
}
</script>
* 출처: 3가지 방식을 안내해줌
https://michaelnthiessen.com/force-re-render/
'Vue' 카테고리의 다른 글
[Vue3/Typescript] 할일 목록을 만들면서 Vue3 배워보자 - 03 (0) | 2022.03.07 |
---|---|
[Vue3/Typescript] 할일 목록을 만들면서 Vue3 배워보자 - 02 (0) | 2022.03.06 |
[Vue3/Typescript] 할일 목록을 만들면서 Vue3 배워보자 - 01 (0) | 2022.03.06 |
[Nuxtjs 프로젝트] stylelint 설정(.stylelintrc.js) (0) | 2022.02.12 |
Nuxt Universal Mode? (넉스트 유니버설 모드) (0) | 2021.08.23 |
[기초] Vuex 사용하기 (0) | 2021.06.17 |
vue.js로 개발 후 firebase로 배포해보기 (0) | 2019.11.15 |
vue.js 기초- 인스타그램 만들어보기 09_vueX (코딩애플 세미나 후기) (0) | 2019.08.01 |