在前一篇文章中,https://www.lanwuyaojiu.cn/blogm/blogart-41.html,我往用vue cli 创建的demo中添加了路由和vuex插件。今天我就将在其基础上再稍微增加一点点内容,设置一个页面需要登录后才能访问。这里涉及到vue-router的入门应用和vuex中store的简单赋值。
第一步,确定思路,开始index访问,点击bar,未登录被拦截跳转到登录页,点击登录后,跳转回index。目前只有bar页面,先造view/index.vue和login/login.vue。
//index.vue
<template>
<div>this is index</div>
</template>
<script>
export default {
name: 'Index'
}
</script>//login.vue
<template>
<div class="login">这是登录
<input type="button" value="登录" @click="DL" />
</div>
</template>
<script>
export default{
created:function(){
console.log("login created");
},
mounted:function(){
console.log("login mounted");
},
methods:{
DL(){
console.log("do login");
this.$store.commit("dologin", true);//调用store的登录更新方法
this.$router.push("/");//让路由跳转页面到index,在main.js中的路由配置了 "/" 指向index.vue
}
}
}
</script> 创建完页面后,在main.js中增加login.vue使用到的store中的dologin 方法和"/"指向index的路由,和根据官方文档示例,添加路由拦截。
//main.js
import Vue from 'vue';
import App from './App.vue';
import VueRouter from 'vue-router'; //引入router
import Vuex from 'vuex'; //引入vuex
import Foo from './view/foo.vue';
import Bar from './view/bar.vue';
import Login from './login/login.vue'; //这里新引入新增加的login页面
Vue.config.productionTip = false;
Vue.use(VueRouter); //导入vue-router
Vue.use(Vuex); //导入vuex
// 1. 定义 (路由) 组件。
// 可以从其他文件 import 进来 类似 import page from 'page.vue'
// 2. 定义路由
// 每个路由应该映射一个组件。 其中"component" 可以是
// 通过 Vue.extend() 创建的组件构造器,
// 或者,只是一个组件配置对象。
const routes = [
{ path: '/login', component: Login },//增加登录页的路由
{ path: '/foo', component: Foo },
{ path: '/bar', component: Bar,meta: { requiresAuth: true } },//设置meta元数据用于路由器拦截,这里设置bar页面需要登录后
{path:'/',component:() => import('./view/index.vue')} //增加index的路由,这里是直接在使用位置import就不设置别名
];
// 3. 创建 router 实例,然后传 `routes` 配置
// 你还可以传别的配置参数, 不过先这么简单着吧。
const router = new VueRouter({
routes:routes // (缩写) routes 相当于 routes: routes
});
router.beforeEach((to, from, next) => {//路由在匹配到路径时,在跳转前
if (to.matched.some(record => record.meta.requiresAuth)) {//如果元数据是需要验证登录,进入拦截
// this route requires auth, check if logged in
// if not, redirect to login page.
if (!store.state.userLogin) {//判断当前是否登录了
next({
path: '/login',
query: { redirect: to.fullPath }
});//没有登录,让路由向登录页跳转
} else {
next();//已经登录了的按原计划跳转
}
} else {
next() // 确保一定要调用 next() //其他不需要登录的路径按原来计划跳转
}
})
//console.log(router);
//vuex store
const store = new Vuex.Store({
state: {
count: 0,userLogin:false //增加登录状态管理
},
mutations: {
increment (state) {
state.count++
},
dologin(state){
state.userLogin=true; //更新登陆状态
}
}
})
//-----------------------------------------结束增加的部分
new Vue({
render: h => h(App),
router:router, //增加router对象
store:store //增加store对象
}).$mount('#app'); 一起就绪,编译运行。由于这次进行的是入门操作,没遇到什么大错误。

