Vue

๐Ÿค– vue auto routing + ๋„ค๋น„๊ฒŒ์ด์…˜ ๊ฐ€

frontChoi 2022. 5. 5. 17:09
๋ฐ˜์‘ํ˜•
import { createRouter, createWebHistory } from 'vue-router'
import routes from 'vue-auto-routing'
import { createRouterLayout } from 'vue-router-layout';
import store from '../store';

const RouterLayout = createRouterLayout(layout => {
  return import('@/layouts/' + layout + '.vue')
})

const router = createRouter({
  history: createWebHistory(process.env.BASE_URL),
  routes: [
    {
      path: '/',
      component: RouterLayout,
      children: routes
    }
  ]
});

//์ง„์ž…ํ•˜๊ธฐ์ „ ํ™•์ธ
router.beforeEach((to,from,next)=>{
  if(to.matched.some((res) => { return res.meta.requiresAuth } )){
    
    if(!store.state.token){
      alert('No have Token')
      router.push('/about');
      return false
    }
    else{
      next();
    }
    
  }
  next();
})

export default router

1.๐Ÿš“ vue-auto-routing ์„ค์น˜

vue-auto-routing์€ ํด๋”๊ตฌ์กฐ ๊ธฐ๋ฐ˜์œผ๋กœ ์ž๋™์ ์œผ๋กœ route๋ฅผ ๋งŒ๋“ค์–ด์ฃผ๋Š” ์—ญํ• ์„ ํ•œ๋‹ค. ๋”ฐ๋กœ ๊ฒฝ๋กœ๋ฅผ ์ถ”๊ฐ€ํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค๋Š” ์žฅ์ ์ด ์žˆ๋‹ค.

vue-auto-routing ์„ค์น˜ ์ˆœ์„œ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค

npm install vue-router@4
vue add auto-routing

 

๋‹ค์Œ์œผ๋กœ main.js์— use๋ฅผ ํ†ตํ•ด router๋ฅผ ์‚ฌ์šฉํ•ด์ฃผ๋„๋ก ํ•œ๋‹ค.

์ฐธ๊ณ ๋กœ router > index.js์˜ ๋‚ด์šฉ์€ "vue add auto-routing"๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด ์ž๋™์ ์œผ๋กœ ์žก์•„์ค€๋‹ค.

// router > index.js
import { createRouter, createWebHistory } from 'vue-router'
import routes from 'vue-auto-routing'
import { createRouterLayout } from 'vue-router-layout'

const RouterLayout = createRouterLayout(layout => {
  return import('@/layouts/' + layout + '.vue')
})

const router = createRouter({
  history: createWebHistory(process.env.BASE_URL),
  routes: [
    {
      path: '/',
      component: RouterLayout,
      children: routes
    }
  ]
})

export default router




//main.js
import { createApp } from 'vue'
import App from './App.vue';
import router from './router';

const app =  createApp(App);
app.use(router);
app.mount('#app');

 

๋‹ค์Œ์œผ๋กœ๋Š” App.vue์— router-view๋ฅผ ์ถ”๊ฐ€ํ•ด์ค€๋‹ค.

 

<template>
  <router-view/>
</template>

<script>
export default {
  name: 'App'
}
</script>

<style>
</style>

 

2.๐ŸงŸ‍โ™€๏ธ vue auto routing ๊ตฌ์กฐ 

 

vue routing์€ ํฌ๊ฒŒ layouts, pages๋ฅผ ๋‚˜๋‰˜์–ด์ง„๋‹ค

layouts : ์ „์ฒด ํ‹€์„ ์žก์•„์ฃผ๋Š” ๊ตฌ์กฐ

pages : layouts ๋ฐ‘์— ๋งŒ๋“ค์–ด์ง€๋Š” ํ™”๋ฉด

 

๋ชจ์Šต์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

์œ„ ๋ชจ์Šต์€ ๊ฐœ๋…์ ์ธ ๋ชจ์Šต์ด๊ณ  ์‹ค์ œ ๋ชจ์Šต์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค

 

layouts < default.vue๊ฐ€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ฒ˜์Œ ์ง„์ž…ํ•˜๋Š” ํ™”๋ฉด์ด๊ณ , 

pages < index.vue๋Š” default.vue์˜ ์ž์‹์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋ ๊ฒƒ๊ฐ™๋‹ค.

3.๐ŸŽ vuex ์„ค์น˜

vuex๋ฅผ ํ†ตํ•ด ๋„ค๋น„๊ฒŒ์ด์…˜ ๊ฐ€๋“œ๋ฅผ ์‚ฌ์šฉํ• ๋ ค๋ฉด vuex์„ค์น˜๊ฐ€ ํ•„์š”ํ•˜๋‹ค ์„ค์น˜๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

npm install vuex@next --save

๊ทธ๋ฆฌ๊ณ  ํด๋”๊ตฌ์กฐ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค

src > store  > index.js

 

๊ทธ๋ฆฌ๊ณ  ๊ฐ„๋‹จํ•˜๊ฒŒ vuex ํŒŒ์ผ์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

 

import { createStore } from 'vuex';

const store  = createStore({
    state:{

    },
    getters:{
        
    },
    mutations:{

    },
    actions:{}
});

export default store;

๋งˆ์ง€๋ง‰์œผ๋กœ main.js์— ์ถ”๊ฐ€ํ•ด์ค€๋‹ค.

 

//main.js
import { createApp } from 'vue'
import App from './App.vue';
import router from './router';
import store from './store';

const app =  createApp(App);
app.use(router);
app.use(store);
app.mount('#app');

4.๐Ÿš’ vue ๋„ค๋น„๊ฒŒ์ด์…˜ ๊ฐ€๋“œ ์‚ฌ์šฉ

index.vueํ™”๋ฉด์— route์„ค์ • ์ถ”๊ฐ€

<route>
{
  "name": "home",
  "meta": {
    "requiresAuth": true
  }
}
</route>
<template>
  <div class="home">
    <h1>1</h1>
  </div>
</template>

<script>
// @ is an alias to /src
export default {
  name: 'home'
}
</script>

์œ„์—์„œ <route></route>๋ฅผ ํ†ตํ•ด ํ™”๋ฉด์— ๋Œ€ํ•œ ์„ค์ •์„ ํ•ด์ค€๋‹ค. ์ด ํ™”๋ฉด ๊ฐ™์€ ๊ฒฝ์šฐ "requiresAuth" : true ๋ฅผ ํ†ตํ•ด ๊ฒ€์ฆ์ด ํ•„์š”ํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๋ ค์ค€๋‹ค.

 

๋‹ค์Œ์œผ๋กœ๋Š” store์— state์— token์„ ์ถ”๊ฐ€ํ•ด์ค€๋‹ค.

import { createStore } from 'vuex';

const store  = createStore({
    state:{
        token:''
    },
    getters:{
        
    },
    mutations:{

    },
    actions:{}
});

export default store;

 

๋งˆ์ง€๋ง‰์œผ๋กœ router์—์„œ beforeEach๋ฅผ ํ†ตํ•ด ํ•ด๋‹นํ™”๋ฉด์˜ requiresAuth๊ฐ€ true์ด๋ฉด store์— token ์กด์žฌ ์—ฌ๋ถ€๋ฅผ ํ†ตํ•ด ํ™”๋ฉด์— ์ง„์ž…ํ• ์ง€ ๋ง์ง€ ๊ฒฐ์ •ํ•œ๋‹ค. store์— token ๊ฐ’์ด ๋น„์–ด์žˆ์œผ๋ฉด, router.push('/about')๋ฅผ ํ†ตํ•ด aboutํ™”๋ฉด์œผ๋กœ ์ด๋™ํ•˜๊ณ  ๊ทธ ์ด์™ธ์˜ ๊ฒฝ์šฐ์—๋Š” next()๋ฅผ ํ†ตํ•ด ํ•ด๋‹นํ™”๋ฉด์œผ๋กœ ์ด๋™ํ•œ๋‹ค.

 

 

๋ฐ˜์‘ํ˜•