Vue.js_Router
๐ Vue.js
๐ Vue.js Router
Vue Router
- ๋ผ์ฐํ : ์น ํ์ด์ง ๊ฐ์ ์ด๋ ๋ฐฉ๋ฒ
- Vue.js ์ ๊ณต์ ๋ผ์ฐํฐ
- ๋ผ์ฐํฐ๋ ์ปดํฌ๋ํธ์ ๋งคํ
- Vue๋ฅผ ์ด์ฉํ SPA๋ฅผ ์ ์ํ ๋ ์ ์ฉ
- URL์ ๋ฐ๋ผ ์ปดํฌ๋ํธ๋ฅผ ์ฐ๊ฒฐํ๊ณ ์ค์ ๋ ์ปดํฌ๋ํธ๋ฅผ ๋ณด์ฌ์ค๋ค.
Vue Router ์ค์น
-
CDN ๋ฐฉ์
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script src="https://unpkg.com/vue-router/dist/vue-router.js"></script>
-
NPM ๋ฐฉ์ ( ์ฃผ )
- npm install vue-router
Vue Router ์ฐ๊ฒฐ
- routes ์ต์ ๊ณผ ํจ๊ป router instance ์์ฑ
const Main = {
template: `<div>๋ฉ์ธ ํ์ด์ง</div>`,
};
const Board = {
template: `<div>์์ ๊ฒ์ํ</div>`,
};
const router = new VueRouter({
// ๋ผ์ฐํธ ์ปดํฌ๋ํธ ์ ์
routes: [
{
path: "/",
component: Main,
},
{
path: "/board",
component: Board,
},
],
});
Vue Router ์ด๋ ๋ฐ ๋๋๋ง
- ๋๋๋ง์ด๋ HTML,CSS,JS ๋ฑ ๊ฐ๋ฐ์๊ฐ ์์ฑํ ๋ฌธ์๋ฅผ ๋ธ๋ผ์ฐ์ ์์ ๊ทธ๋ํฝ ํํ๋ก ์ถ๋ ฅํ๋ ๊ณผ์ ์ ๋งํ๋ค.
- ๋ค๋น๊ฒ์ด์ ์ ์ํด router-link ์ปดํฌ๋ํธ ์ฌ์ฉ
- ์์ฑ์ โtoโ prop ์ ์ฌ์ฉ
- ๊ธฐ๋ณธ์ ์ผ๋ก
<router-link>
๋<a>
ํ๊ทธ๋ก ๋ ๋๋ง
<router-link to="/">HOME</router-link>
<router-link to="/board">๊ฒ์ํ</router-link>
- ํ์ฌ ๋ผ์ฐํธ์ ๋ง๋ ์ปดํฌ๋ํธ๊ฐ ๋ ๋๋ง ๋๋ค.
<!-- ํ์ฌ ๋ผ์ฐํธ์ ๋ง๋ ์ปดํฌ๋ํธ๊ฐ ๋๋๋ง -->
<router-view></router-view>
Vue Router ์ค์
๋ผ์ฐํฐ ์ค์
const router = new VueRouter({
routes: [
...,
{
path: '/board/:no',
component: BoardView,
},
...,
],
});
- ๋ผ์ฐํฐ ๋งํฌ
<router-link to="/board/30">30๋ฒ ๊ฒ์๊ธ</router-link>
-
์ ์ฒด ๋ผ์ฐํฐ ์ ๋ณด
this.$router
-
ํ์ฌ ํธ์ถ๋ ๋ผ์ฐํฐ ์ ๋ณด
this.$route
this.$route.params.no
this.$route.path
์ด๋ฆ์ ๊ฐ์ง๋ ๋ผ์ฐํธ
- ๋ผ์ฐํธ๋ ์ฐ๊ฒฐํ๊ฑฐ๋ ํ์์ ์ํํ ๋ ์ด๋ฆ์ด ์๋ ๋ผ์ฐํธ๋ฅผ ์ฌ์ฉ
- Router Instance๋ฅผ ์์ฑํ๋ ๋์ routes ์ต์ ์ ์ง์
const router = new VueRouter({
routes: [
...,
{
path: '/board',
name: 'board',
component: Board,
},
{
path: '/board/:no',
name: 'boardview',
component: BoardView,
},
...,
],
});
<!-- ๋ ๊ฐ๋ค ๊ฐ์ ๊ฒ์ ํธ์ถํ๋ค -->
<router-link :to="{name: 'boardview', params: {no: 3}}">3๋ฒ ๊ฒ์๊ธ</router-link>
<a @click="$router.push({name: 'boardview', params: {no: 3}});">3๋ฒ ๊ฒ์๊ธ</router-link>
ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ์ ๋ผ์ฐํฐ
-
<router-link>
๋ฅผ ์ฌ์ฉํ์ฌ ์ ์ธ์ ๋ค๋น๊ฒ์ด์ ์ฉ anchor ํ๊ทธ๋ฅผ ๋ง๋๋ ๊ฒ ์ธ์๋ ๋ผ์ฐํฐ์ instance method๋ฅผ ์ฌ์ฉํ์ฌ ํ๋ก๊ทธ๋๋ฐ์ผ๋ก ์ํ
$router.push("home");
$router.push({ path: "home" });
// param์ ๋ฐ์์ฌ ๋
$router.push({ name: "boardview", params: { no: 3 } });
// query๋ฅผ ๋ฐ์์ฌ ๋
$router.push({ path: "/board", query: { pg: 1 } });
์ค์ฒฉ๋ ๋ผ์ฐํธ
- ์ฑ UI๋ ์ผ๋ฐ์ ์ผ๋ก ์ฌ๋ฌ ๋จ๊ณ๋ก ์ค์ฒฉ๋ ์ปดํฌ๋ํธ ๊ตฌ์กฐ์
- URL์ ์ธ๊ทธ๋จผํธ๊ฐ ์ค์ฒฉ ๋ ์ปดํฌ๋ํธ์ ํน์ ๊ตฌ์กฐ์ ์ผ์นํ๋ ๊ฒ์ ํ์ฉ
- ์๋ฅผ ๋ค๋ฉด ๊ฒ์ํ ( board ) ํ์ด์ง์์ ๋น๋๊ธฐ ํต์ ์ ํตํด ์ปดํฌ๋ํธ๋ฅผ ๊ต์ฒดํ๋ ๊ฒฝ์ฐ children ๋ฐฐ์ด์ ๋ฃ์์ผ๋ก์จ ์ค์ฒฉ ๋ ์ปดํฌ๋ํธ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๊ฒ ๋๋ค.
- router/index.js์ ์ฃผ๋ก ๊ตฌํํ๋ค.
// ๋ผ์ฐํธ ์ปดํฌ๋ํธ
import HomeView from "@/views/HomeView.vue";
import LoginView from "@/views/LoginView.vue";
import BoardView from "@/views/BoardView.vue";
import BoardList from "@/components/board/BoardList.vue";
import BoardWrite from "@/components/board/BoardWrite.vue";
import BoardDetail from "@/components/board/BoardDetail.vue";
import BoardModify from "@/components/board/BoardModify.vue";
import BoardDelete from "@/components/board/BoardDelete.vue";
routes: [
...,
{
path: '/board',
name: 'board',
component: BoardView,
redirect: '/board/list',
children: [
// ๊ฒ์ํ ๋ชฉ๋ก
{
path: 'list',
name: 'boardlist',
component: BoardList,
},
// ๊ฒ์ํ ๊ธ์ฐ๊ธฐ
{
path: 'write',
name: 'boardwrite',
component: BoardWrite,
},
...
],
},
],
๋ผ์ฐํธ ๋ฆฌ๋ค์ด๋ ํธ
- ์น ํ์ด์ง ์ด๋
routes: [
...,
{
path: '/board',
name: 'board',
component: Board,
// component๋ฅผ ์คํํ๋ฉด /board/list ํ์ด์ง๋ก ์ด๋ํ๋ค
redirect: '/board/list', or redirect: { name: 'list' }
children: [
...
],
},
],