Composition API
Vue가 Version2에서 Version3가 되면서 가장 큰 변화는 setup
하는 과정이라고 할 수 있습니다.
기존의 방식을 Options
라고하며, 현재 등장한 방법을 Composition
이라고 합니다.
하지만, 아직 우리는 Options API
를 사용할 수 있습니다.
<script setup>
에서 Route와 Router 접근
setup
내부에는 this
를 사용할 수 없습니다. 따라서, Comsition API
를 사용한다면, <script setup>
으로 인해 this.$router
or this.$route
로 접근할 수 없습니다.
이를 사용하려면 useRouter()
or useRoute()
를 호출하여 사용할 수 있습니다.
<script setup>
import { useRouter, useRoute } from 'vue-router'
const router = useRouter()
const route = useRoute()
function pushWithQuery(query) {
router.push({
name: 'search',
query: {
...route.query,
...query,
},
})
}
</script>
route
객체는 동적인(반응형) 객체입니다. 때문에 대부분의 경우 route
객체를 감시하는 것을 지양해야 합니다. 대신에 변경이 예상되는 하위 속성을 감시할 수 있습니다.
<script setup>
import { useRoute } from 'vue-router'
import { ref, watch } from 'vue'
const route = useRoute()
const userData = ref()
watch(
() => route.params.id,
async newId => {
userData.value = await fetchUser(user)
}
)
</script>
Navigation Guard
이전에 우리는 beforeRouteLeave
와 beforeRouteUpdate
에 대해 학습했습니다.Composition API
에서는 Vue Router update
와 leave
를 다음과 같이 사용합니다.
<script setup>
import { onBeforeRouteLeave, onBeforeRouteUpdate } from 'vue-router'
import { ref } from 'vue'
// onBeforeRouteLeave에서도 `this`에 접근할 수 없습니다.
onBeforeRouteLeave((to, from) => {
const answer = window.confirm(
'정말 화면을 이동하겠습니까? 변경사항은 저장되지 않습니다!'
)
// 취소 버튼 클릭시 같은 페이지에 머뭅니다.
if (!answer) return flase
})
const userData = ref()
// onBeforeRouteUpdate에서도 `this`에 접근할 수 없습니다.
onBeforeRouteUpdate(async (to, from) => {
// 이동하려는 페이지의 `id`값이 기존과 같다면 동작하지 않겠죠??
if(to.params.id !== from.params.id) {
userData.value = await fetchUser(to.params.id)
}
})
</script>
Composition API
의 Guard는 <router-view>
에 의해 렌더링된 모든 컴포넌트에서 사용할 수 있습니다.
컴포넌트 내 가드처럼 라우트 컴포넌트에서 직접 사용할 필요가 없는 것이죠.
728x90
반응형
'FrameWorks > Vue' 카테고리의 다른 글
VueRouter의 Transitions 파헤치기 (0) | 2024.08.03 |
---|---|
VueRouter의 RouterView Slot 파헤치기 (0) | 2024.07.29 |
VueRouter의 Data Fetching 파헤치기 (0) | 2024.06.27 |
VueRouter의 Router Meta Field 파헤치기 (0) | 2024.06.27 |
VueRouter의 Navigation Guard 파헤치기 (0) | 2024.06.27 |
댓글