2 ๋ถ„ ์†Œ์š”

๐Ÿ“š 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 ์—ฐ๊ฒฐ

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: [
      ...
    ],
  },
],