получить данные с vuex:
import {createStore} from "vuex"; const store = createStore( { state:{ user:{ data:{name:'Zura'}, token:null } }, getters:{}, actions:{}, mutations:{}, modules:{} } ) export default store;
import { mapState } from 'vuex'; export default{ components:{ HelloWorld }, computed:{ ...mapState(['user']) } } </script> <template> user->{{ user }} </template>
Чтобы отрендерить дочерний компонент внутри компонента
const routes = [ { path:'/', name:'Dashboard', redirect:'/dashboard', component:DefaultLayout, children:[ { path:'/dashboard',name:'Dashboard',component:Dashboard } ] },
И теперь по адресу — / перекинет на dashboard и внутри компонента — DefaultLayout (в его router-view) покажется компонент дочерний — Dashboard
Импортируем остальные компоненты, и указываем те что надо отображать внутри лейаута router.js:
import { createRouter, createWebHistory } from "vue-router"; import Dashboard from "../views/Dashboard.vue"; import Surveys from "../views/Surveys.vue"; import Login from "../views/Login.vue"; import Register from "../views/Register.vue"; import DefaultLayout from "../components/DefaultLayout.vue"; const routes = [ { path:'/', name:'Dashboard', redirect:'/dashboard', component:DefaultLayout, children:[ { path:'/dashboard',name:'Dashboard',component:Dashboard }, { path:'/surveys',name:'Surveys',component:Surveys } ] }, { path:'/login', name:'Login', component:Login }, { path:'/register', name:'Register', component:Register }, ]; const router = createRouter({ history: createWebHistory(), routes }) export default router;
Проверка на авторизацию:
import { createRouter, createWebHistory } from "vue-router"; import Dashboard from "../views/Dashboard.vue"; import Surveys from "../views/Surveys.vue"; import Login from "../views/Login.vue"; import Register from "../views/Register.vue"; import DefaultLayout from "../components/DefaultLayout.vue"; import store from "../store"; const routes = [ { path:'/', name:'Dashboard', redirect:'/dashboard', component:DefaultLayout, meta:{requiresAuth:true}, children:[ { path:'/dashboard',name:'Dashboard',component:Dashboard }, { path:'/surveys',name:'Surveys',component:Surveys } ] }, { path:'/login', name:'Login', component:Login }, { path:'/register', name:'Register', component:Register }, ]; const router = createRouter({ history: createWebHistory(), routes }); router.beforeEach((to,from,next)=>{ if(to.meta.requiresAuth && !store.state.user.token){ next({name:'Login'}) }else if(store.state.user.token && (to.name === 'Login' || to.name === 'Register')){ next({name:'Dashboard'}); }else{ next(); } }) export default router;
Мы добавили в роутере на страницу дашборда —
meta:{requiresAuth:true}, что означает что ее может смотреть только авторизованный
И в роутере, при переходе между страницами мы проверяем — существует ли в сторе запись о логинизации пользователя и является ли страница с обязательной логинизацией:
router.beforeEach((to,from,next)=>{ if(to.meta.requiresAuth && !store.state.user.token){ next({name:'Login'}) }else if(store.state.user.token && (to.name === 'Login' || to.name === 'Register')){ next({name:'Dashboard'}); }else{ next(); } })
Также есть проверка, если пользователь залогинен и попал на страницу логина или регистрации — то перекинуть его на страницу Dashboard, в противном случае отправить на страницу по которой он заходил.
И поменяв в ручную токен в сторе:
import {createStore} from "vuex"; const store = createStore( { state:{ user:{ data:{name:'Zura'}, token:'123' } }, getters:{}, actions:{}, mutations:{}, modules:{} } ) export default store;
Прелесть именованных маршрутов:
<router-link :to="{name:'Register'}">
46 14