일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 국비코딩
- 정보처리기사실기요약
- VUE
- 자스코테
- 오라클
- typescript
- 자바스크립트 코딩테스트
- 리액트네이티브
- Java의정석
- Oracle
- 정보처리기사정리
- 국비IT
- 정보처리기사요약
- 자바의정석
- 이안의평일코딩
- 스프링
- 정보처리기사실기정리
- CSS
- ReactNative
- php
- react
- 정보처리기사
- 리액트
- 정보처리기사실기
- 자바스크립트
- 타입스크립트
- javascript
- 평일코딩
- spring
- 코딩테스트
- Today
- Total
이안의 평일코딩
[Vue] Vue의 기초(11) - URL 파라미터, Nested routes, router push 본문
:파라미터
URL 파라미터를 만들기 위해 router의 path안에 "/detail/:id"과 같이 /:작명을 하면 된다. (그럼 /detail/0, 1, 2... 가능)
그럼 가져올 때 Detail.vue에서 {{blog[해당하는 id번호].title}} 에서 []안에 $route.params.id를 넣는다.
현재 URL 정보는 $route에 담겨있음.
$route.params는 파라미터자리에 기입된 것을 알려준다.
$route.params.id는 router의 path안에 :파라미터 작명한 것을 넣어주면 URL의 파라미터를 가져온다.
src/router.js
import { createWebHistory, createRouter } from "vue-router";
import List from './views/List.vue';
import Home from './views/Home.vue';
import Detail from './views/Detail.vue';
const routes = [
{
path: "/",
component: Home,
},
{
path: "/list",
component: List,
},
{
path: "/detail/:id",
component: Detail,
},
];
const router = createRouter({
history: createWebHistory(),
routes,
});
export default router;
src/views/Detail.vue
<template>
{{$route.params.id}}
<div>
<h4>상세페이지</h4>
<h5>{{blog[$route.params.id].title}}</h5>
<p>{{blog[$route.params.id].content}}</p>
<router-view></router-view>
<h5 @click="$router.go(-1)">뒤로가기</h5>
</div>
</template>
<script>
export default {
props : {
blog : Array,
}
}
</script>
<style>
</style>
예를 들어 URL에 localhost:8080/detail/0 을 치면 {{$route.params.id}}는 0을 가리키고
lcoalhost:8080/detail/100 을 치면 /:id 값이 100이기 때문에 100이 출력된다.
:파라미터() <- 소괄호 안에 정규식을 입력하면 좀더 업그레이드해서 파라미터를 사용 가능하다.
예를들어 아래와 같이 넣으면 숫자만 찾아주는 정규식 문법이다. *는 반복을 뜻하고 나머지는 vue-router 4를 참고하자.
path: "/detail/:id(\\d+)"
404페이지
import { createWebHistory, createRouter } from "vue-router";
import List from './views/List.vue';
import Home from './views/Home.vue';
import Detail from './views/Detail.vue';
import ErrorPage from './views/ErrorPage.vue';
const routes = [
{
path: "/",
component: Home,
},
{
path: "/list",
component: List,
},
{
path: "/detail/:id",
component: Detail,
},
{
path: "/:anything(.*)",
component: ErrorPage,
},
];
const router = createRouter({
history: createWebHistory(),
routes,
});
export default router;
/:anything(.*) path를 가장 최하위에 두면 우선순위로 출력이 되기 때문에 잘못 입력한 경로에 대해 404 페이지를 찾을 수 없다는 화면이 나오게된다.
Nested routes
특정 페이지 안에서 route를 나누고 싶을 때 사용한다. 예를들어 /detail/0/comment로 접속하고 싶다면 /detail/0 뒤에 children을 만들어 추가해주면 된다. 여기서 주의할 것은 children의 path에 /을 제외해서 상대경로로 적어준다.
src/views/Comment.vue
<template>
댓글입니다
</template>
<script>
export default {
}
</script>
<style>
</style>
src/router.js
import { createWebHistory, createRouter } from "vue-router";
import List from './views/List.vue';
import Home from './views/Home.vue';
import Detail from './views/Detail.vue';
import Author from './views/Author.vue';
import Comment from './views/Comment.vue';
const routes = [
{
path: "/",
component: Home,
},
{
path: "/list",
component: List,
},
{
path: "/detail/:id",
component: Detail,
children: [
{
path: "author",
component: Author,
},
{
path: "comment",
component: Comment,
}
]
},
{
path: "/:anything(.*)",
component: Home,
},
];
const router = createRouter({
history: createWebHistory(),
routes,
});
export default router;
그리고 nested routes에 해당하는 것을 보여주고 싶을 때 <router-view>를 사용한다.
그럼 /detail/0/commnet로 접속하면 Detail.vue + Comment.vue가 보이는 것이다.
src/views/Detail.vue
<template>
<div>
<h4>상세페이지</h4>
<h5>{{blog[$route.params.id].title}}</h5>
<p>{{blog[$route.params.id].content}}</p>
<router-view></router-view>
</div>
</template>
<script>
export default {
props : {
blog : Array,
}
}
</script>
<style>
</style>
$router.push
$route는 현재라미터경로, $router는 페이지 이동관련 기능이다.
src/views/List.vue
페이지 이동시켜주는 함수 $router.push()를 사용하자.
<template>
<div v-for="(a,i) in blog" :key="i">
<h5 @click="$router.push('/detail/'+i)">{{blog[i].title}}</h5>
<p>{{blog[i].date}}</p>
</div>
</template>
<script>
export default {
name: 'List',
props: {
blog : Array,
}
}
</script>
<style>
</style>
$router.go()을 사용하면 페이지를 앞, 뒤로 움직일 수 있다. 뒤로가기는 $router.go(-1)로 구현하면 된다.
<template>
<div>
<h4>상세페이지</h4>
<h5>{{blog[$route.params.id].title}}</h5>
<p>{{blog[$route.params.id].content}}</p>
<router-view></router-view>
<h5 @click="$router.go(-1)">뒤로가기</h5>
</div>
</template>
<script>
export default {
props : {
blog : Array,
}
}
</script>
<style>
</style>
여러개의 컴포넌트를 보여줄 때는 named views. redirection도 가능하니 아래의 링크를 참조하자.
'Front-end > Vue' 카테고리의 다른 글
[Vue] 더보기 버튼 기능 구현하기 (axios로 ajax 요청) (0) | 2021.04.19 |
---|---|
[Vue] 이미지 집어넣기 {backgroundImage : `url(${})`} (0) | 2021.04.19 |
[Vue] Vue의 기초(10) - Bootstrap (0) | 2021.04.14 |
[Vue] Vue의 기초(9) - Lifecycle(라이프사이클), Hooks (0) | 2021.04.14 |
[Vue] Vue의 기초(8) - sort 정렬, spread operator (0) | 2021.04.13 |