๐ค vue auto routing + ๋ค๋น๊ฒ์ด์ ๊ฐ
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()๋ฅผ ํตํด ํด๋นํ๋ฉด์ผ๋ก ์ด๋ํ๋ค.