주어진 패턴에 따라 같은 컴포넌트에 라우트를 매핑해야 하는 경우가 있다. Vue Router 에서는 동적 세그먼트를 사용해서 작업 할 수 있으며 이를 파라미터 라고 한다.
const routes = [
{
path: '/user/:id',
// 동적 세그먼트는 콜론으로 시작한다.
component: UserView
}
]
this.$route.params.id;
이전에 구현해 놓은 프로젝트에서 링크 클릭시 해당 링크의 id 값으로 페이지가 넘어가도록 처리하기 위해서 몇가지 단계를 거치면 된다.
function fetchItem(id) {
return axios.get(`${config.baseUrl}item/${id}.json`);
}
export const store = createStore({
actions: {
FETCH_USER({ commit }, name) {
fetchUser(name)
.then(({ data }) => {
commit('SET_USER', data)
})
.catch(error => {
console.log(error)
})
},
}
})
<template>
<div>
<p>name : {{ fetchedUser.id }}</p>
<p>karma : {{ fetchedUser.karma }}</p>
<p>created: {{ fetchedUser.created }}</p>
</div>
</template>
<script>
import { mapGetters } from 'vuex';
export default {
// 일반적으로 computed를 먼저 작성해 줘야 한다.
computed: {
...mapGetters(['fetchedUser'])
},
created() {
const userName = this.$route.params.id;
this.$store.dispatch('FETCH_USER', userName)
}
}
</script>
<style>
</style>
<template>
<div>
<p v-for="user in fetchedsNews" v-bind:key="user">
<a :href="user.url">{{ user.title }}</a>
<small>
{{ user.time_ago }}
<router-link :to="`/user/${user.user}`">{{ user.user }}</router-link>
</small>
</p>
</div>
</template>
기존 javascript에서 HTML 내용을 그대로 넣을때
innerHTML을 사용했는데 vue 에서는v-html을 통해서 사용 가능하다.
<template>
<div>
<section>
<router-link :to="`/user/${fetchedsItem.user}`">{{ fetchedsItem.user }}</router-link>
<small>{{ fetchedsItem.time_ago }}</small>
<h2>{{ fetchedsItem.title }}</h2>
</section>
<section>
<div v-html="fetchedsItem.content">
<!-- 내부는 비워놓아야 한다 -->
</div>
</section>
</div>
</template>
<Transition>을 통해서 컴포넌트의 탬플릿에서 사용 가능하다.
<template>
<ToolBar></ToolBar>
<transition name="page">
<router-view></router-view>
</transition>
</template>
<style>
.page-enter-active,
.page-leave-active {
transition: opacity 0.5s ease;
}
.page-enter-from,
.page-leave-to {
opacity: 0;
}
</style>