πŸ€– Vue.js λΌμš°νŒ…μ— λŒ€ν•΄ μ•Œμ•„λ³΄μž (1)

YOU KNOW I MEANΒ·2021λ…„ 3μ›” 18일
1
post-thumbnail

λΌμš°νŒ…, λΌμš°ν„°?

routing : μ›ΉνŽ˜μ΄μ§€κ°„ 이동방법

  • νŽ˜μ΄μ§€λ₯Ό 이동할 λ•Œ μ„œλ²„μ— μš”μ²­ν•΄ κ°±μ‹ ν•˜λŠ” 것이 μ•„λ‹ˆλΌ, 미리 ν•΄λ‹Ή νŽ˜μ΄μ§€λ₯Ό ꡬ성해놓고 ν΄λΌμ΄μ–ΈνŠΈμ˜ λΌμš°νŒ…μ„Β μ΄μš©ν•˜μ—¬ 화면을 κ°±μ‹ ν•©λ‹ˆλ‹€.
    • μ΄λŸ¬ν•œ 방식을 SPA (Single Page Application) 라고도 ν•©λ‹ˆλ‹€.
  • λΌμš°νŒ…μ„ μ΄μš©ν•˜λ©΄ λ§€λ„λŸ½κ²Œ ν™”λ©΄ μ „ν™˜μ„ ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • Vue, React, Angular λͺ¨λ‘ λΌμš°νŒ…μ„ μ΄μš©ν•˜μ—¬ 화면을 μ „ν™˜ν•©λ‹ˆλ‹€.
  • λ‹¨μˆœ λΌμš°νŒ…λ§Œ ν•„μš”ν•˜λ©΄ 라이브러리λ₯Ό 쓰지 μ•Šμ•„λ„ λ©λ‹ˆλ‹€.

vue-router

  • Vue μ—μ„œ λΌμš°νŒ… κΈ°λŠ₯을 κ΅¬ν˜„ν•  수 μžˆλ„λ‘ μ§€μ›ν•˜λŠ” 곡식 λΌμ΄λΈŒλŸ¬λ¦¬μž…λ‹ˆλ‹€.
  • <router-view> : νŽ˜μ΄μ§€ ν‘œμ‹œ νƒœκ·Έ , λ³€κ²½λœ URL에 따라 ν•΄λ‹Ή μ»΄ν¬λ„ŒνŠΈλ₯Ό λΏŒλ €μ£ΌλŠ” μ˜μ—­μž…λ‹ˆλ‹€.

λΌμš°ν„° 사전 μ„€μ •

# terminal
npm install vue-router

0. Vue와 Vue λΌμš°ν„°λ₯Ό import ν•©λ‹ˆλ‹€.

// router/index.js
import Vue from 'vue'
import VueRouter from 'vue-router'

Vue.use(VueRouter)

1. 라우트 μ»΄ν¬λ„ŒνŠΈλ₯Ό μ •μ˜ν•©λ‹ˆλ‹€.

const Foo = { template: '<div>foo</div>' }
const Bar = { template: '<div>bar</div>' }

// 보톡 importλ₯Ό ν†΅ν•΄μ„œ μ •μ˜ν•©λ‹ˆλ‹€.
import Foo from '../views/Foo.vue'
import Bar from '../views/user/Bar.vue'

2. 라우트λ₯Ό μ •μ˜ν•©λ‹ˆλ‹€.

  • λ°˜λ“œμ‹œ component와 λ§€ν•‘λ˜μ–΄μ•Ό ν•©λ‹ˆλ‹€.
const routes = [
  { path: '/foo', component: Foo },
  { path: '/bar', component: Bar }
]

3. 'routes' μ˜΅μ…˜κ³Ό ν•¨κ»˜ router μΈμŠ€ν„΄μŠ€λ₯΄ λ§Œλ“­λ‹ˆλ‹€.

const router = new VueRouter({
  routes // `routes: routes`의 μ€„μž„
})

4. 루트 μΈμŠ€ν„΄μŠ€λ₯Ό λ§Œλ“€κ³  mount ν•©λ‹ˆλ‹€.

const app = new Vue({
  router
}).$mount('#app')

// main.js
new Vue({
  router,
  vuetify,
  store,
  render: h => h(App)
}).$mount('#app')
  • λΌμš°ν„°λ₯Ό μ£Όμž…ν•˜λ©΄ this.$router 와 ν˜„μž¬ λΌμš°ν„°(router)λ₯Ό this.$route 둜 μ ‘κ·Όν•  수 μžˆμŠ΅λ‹ˆλ‹€.

μ½”λ“œ 예제 λ³΄λŸ¬κ°€κΈ°

선언적 방식

  • <router-link to="path" replace> : νŽ˜μ΄μ§€ 이동 νƒœκ·Έ, 화면에선 <a> νƒœκ·Έλ‘œ μΉ˜ν™˜λ©λ‹ˆλ‹€.
    • replaceλ₯Ό μ‚¬μš©ν•  경우 μ†μ„±μœΌλ‘œ λ„£μ–΄μ€λ‹ˆλ‹€.

ν”„λ‘œκ·Έλž˜λ° 방식

  • router.push('path') :
// login pathλ₯Ό 가진 μ»΄ν¬λ„ŒνŠΈ νŽ˜μ΄μ§€λ‘œ μ΄λ™ν•©λ‹ˆλ‹€.
this.$router.push('/login');
  • router.replace('path') : μƒˆλ‘œμš΄ νžˆμŠ€ν† λ¦¬ ν•­λͺ©μ— μΆ”κ°€ν•˜μ§€ μ•Šκ³  ν˜„μž¬ ν•­λͺ©μ„ λŒ€μ²΄ν•©λ‹ˆλ‹€.
  • router.go(n)
// ν•œ 단계 μ•žμœΌλ‘œ κ°‘λ‹ˆλ‹€. history.forward()와 κ°™μŠ΅λ‹ˆλ‹€. history.forward()와 κ°™μŠ΅λ‹ˆλ‹€.
router.go(1)

// ν•œ 단계 λ’€λ‘œ κ°‘λ‹ˆλ‹€. history.back()와 κ°™μŠ΅λ‹ˆλ‹€.
router.go(-1)

// 3 단계 μ•žμœΌλ‘œ κ°‘λ‹ˆλ‹€.
router.go(3)

// μ§€μ •ν•œ 만큼의 기둝이 μ—†μœΌλ©΄ μžλ™μœΌλ‘œ μ‹€νŒ¨ ν•©λ‹ˆλ‹€.
router.go(-100)
router.go(100)

<a> νƒœκ·Έ λŒ€μ‹  <router-link> λ₯Ό μ“°λŠ” 이유

  • history λͺ¨λ“œμ™€ hashbang λͺ¨λ“œλŠ” μ£Όμ†Œ 체계가 λ‹¬λΌμ„œΒ <a>Β νƒœκ·Έλ₯Ό μ‚¬μš©ν•  경우 λͺ¨λ“œ λ³€κ²½μ‹œ μ£Όμ†Œκ°’μ„ 일일이 λ³€κ²½ν•΄ μ€˜μ•Όν•©λ‹ˆλ‹€. ν•˜μ§€λ§ŒΒ λŠ” λ³€κ²½ν•  ν•„μš”κ°€ μ—†μŠ΅λ‹ˆλ‹€.
    • hashbang(#!) : URLμ—μ„œ λ°œκ²¬ν•  수 μžˆλŠ” 특수문자 "#!" μž…λ‹ˆλ‹€. (κ΅­λ‚΄μ—μ„œ 거의 μ‚¬μš©μ„ μ•ˆν•©λ‹ˆλ‹€.)
  • <a>Β νƒœκ·Έλ₯Ό ν΄λ¦­ν•˜λ©΄ 화면을 κ°±μ‹ ν•˜λŠ”λ°Β <router-link> λŠ” κ°±μ‹  없이 화면을 이동할 수 μžˆμŠ΅λ‹ˆλ‹€.

0개의 λŒ“κΈ€