原文来自 vue router路由配置,元信息meta的使用-登录拦截验证_shenroom的博客-CSDN博客

看原文排版更舒服,我只是记录一下

路由基本配置
1.在router文件夹中找到 indexs.js

注意:如果创建项目是没有安装router,不会有router文件夹,该文件夹在src 文件夹的根目录中

// 1.引入路由以及vue,下面的是固定写法,照写就可以
import Vue from 'vue'
import Router from 'vue-router'
Vue.use(Router)

2.创建路由实例
const router = new Router({
linkActiveClass: 'app-active', // 路由点击选中时的颜色(app-active为自定义的class样式类)
routes: [
{ // 根路径
path: '/',
redirect: '/home',
component: () => import('@/pages/home') // 路由懒加载写法
},
{
path: '/home',
name: 'home',
component: () => import('@/pages/home'),
}
})

/* 路由拦截器 路由跳转前的操作 */
router.beforeEach((to, from, next) => {
next()
})
/* 路由拦截器 路由跳转后的操作 */
router.afterEach(to => {

})

3.将路由导出,供外部接收,主要用于main.js接收
export default router
2.配置好router中的index.js文件后需要在main.js 中,挂载路由router到vue实例上

import Vue from 'vue'
import App from './App'
import router from './router' // 导入配置好的路由文件
import store from './store' // 导入配置好的vuex文件
Vue.config.productionTip = false

new Vue({
el: '#app',
router, // 挂载路由到实例中
store,// 挂载vuex到实例中
components: { App },
template: '<App/>'
})
通过上面两步,路由的基本配置已经完成可以正常使用路由了。

路由元信息meta使用
1.路由拦截器

router.beforeEach( to, from, next )

router.afterEach( to, from )

参数说明:

to:表示要跳转的路由对象。

from:表示跳转前的路由对象

next:继续执行跳转的函数,只有跳转前的拦截才有这个参数。

import Router from 'vue-router'
Vue.use(Router)

const router = new Router({
routes: [{
path: '/',
redirect: '/home',
component: () => import('@/pages/home')
}]
})

/* 路由拦截器 路由跳转前的操作 */
router.beforeEach((to, from, next) => {
/* 路由跳转前可进行各种操作,如数据处理,权限验证,取消上页所有网络请求等等,
*一定要注意,数据处理后,一定要执行next(),否则路由不会进行跳转。*/
if(true){
// 进行的操作
next()
}else{
// 进行的一些操作
next()
}

})
/* 路由拦截器 路由跳转后的操作 */
router.afterEach(to => {
// 在这里执行路由跳转成功后所进行的操作
})

export default router
上面已经解了拦截器的基本使用,下面再来看一下,拦截器结合路由元信息meta的使用。

2.路由拦截器中元信息meta对象的使用----登陆拦截验证 和 修改页面的 title

场景描述如下图:

1.用户访问home页面,或者home的子页面mine页面时,由于home只有登陆后才能进入,所以用户在访问这两个页面时需要判断是否登录,如果没有登录就跳转到登录页面,登录成功后自动跳转到用户访问的权限页面。

2.当调转对应的路由页面时,就更改网页的名字,也就是index.heml 中 head 标签里面的 title 的值

(1)、首先准备三个路由页面,home.vue 、 login.vue 、mine.vue

/*------------------------------------------home.vue------------------------------------------*/
<template>
<div>
<h1>首页</h1>
<router-link to="/home/mine">前往首页子页面</router-link>
<router-view></router-view>
<div>
</template>
...
/*------------------------------------------mine.vue------------------------------------------*/
<template>
<div>
<h1>子页面</h1>
<div>
</template>
...
/*------------------------------------------login.vue------------------------------------------*/
<template>
<div>
<h1>登录页面</h1>button
<button @click="login">前往首页子页面</button>
<div>
</template>
<script>
...
methodes:{
login(){
localStorage.login = true // 登录状态
// this.$route.params.redirect 是路由拦截是传过来的拦截页面的路由对象,看下文的路由拦截配置详情,有说明。
if( this.$route.params.redirect ){ // 判断是否有redirect参数
this.$router.push( this.$route.params.redirect ) 登录后跳回被的拦截
}
}
}
...
</script>
(2)、在路由配置router/index.js文件中 设置路由拦截

import Vue from 'vue'
import Router from 'vue-router'
Vue.use(Router)
const router = new Router({
routes: [
{ // 根路径
path: '/',
redirect: '/home',
component: () => import('@/pages/home'), // 路由懒加载写法
},{
path: '/home',
name: 'home',
component: () => import('@/pages/home'),
meta:{
isLogin : true // 自定义一个属性,true需要登录权限
title:"主页"
},
children:[{
path: 'mine',
name: 'mine',
component: () => import('@/pages/home/mine'),
meta:{ // 不做登录权限的设置
title:"用户中心页"
}
}]
},{
path: '/login',
name: 'login',
component: () => import('@/pages/login'),
meta:{
title:"登录页"
}
},
})

//导航前守卫(跳转前)
router.beforeEach(function(to,from,next){
// to: 表示要跳转的页面。from:表示从哪个页面来
let login_in = localStorage.login // 是否已登录
let require = to.matched.some(function(item){ // 是否需要登录
return item.meta.isLogin
})
if( !login_in && require ){ // 当未登录,且跳转的页面需要登录后才能操作时,进行路由拦截
next({ // 跳转登录页
name: "login",
params: { redirect: to } // 将 要跳转(即被拦截) 的路由对象,作为参数,传递到登录页面
});
}else{ // 已登录就正常跳转,不做任何拦截
next() // 正常跳转到下一页
}
})
//导航后守卫(跳转后)
router.afterEach(function(to,from){
document.title = to.meta.title //跳转后设置页面的title
})
export default router
到此所需的功能我们已经实现了。

细心的人可能会发现 beforeEach 拦截器中 变量 require 的值不是应该直接用路由meta.isLogin 的值 即 to.meta.isLogin的值?。为什么使用了数组some()方法对to.matched进行循环,来赋值?to.matched又指的是什么?

这一步很重要,不能直接使用to.meta.isLogin的值,这样的话只是跳转到home.vue时会被拦截,但是如果直接在地址栏访问 home.vue 的子页面mine.vue时如:localhost:8080/#/home/mine ,就不会进行拦截。

因为mine.vue页面,配置路由时没有在meta中设置 isLogin,所以to.meta.isLogin的值是false,会直接跳转不会进行拦截。所以要循环to.matched 进行判断。说了这么多,咱来看一下to.matched指的是什么:

to.matched 返回的是一个数组,里面是存放的是路由对象,指当前匹配的路径中所包含的路由片段所对应的路由对象。

比如:localhost:8080/#/home/mine 这个路径中我看到有两个路由片段home 和 mine

因此to.matched 的数组存放的就是 home 和 mine 的路由实例。用数组some()循环方法,是匹配数组中所有元素,只要有一个元素的某个值到达了条件 item.meta.isLogin 为true,该方法就会返回true。所以直接访问mine页面时,to.matched数组中,home对象的meta.isLogin是true,达到了条件,所以整体返回了true,此时 require 的值即为true。 不懂数组some()方法的可以去恶补一下ES6-数组新增的方法。
————————————————
版权声明:本文为CSDN博主「shenroom」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_41772754/article/details/87915596

vue router路由配置,元信息meta的使用-登录拦截验证的更多相关文章

  1. 前端MVC Vue2学习总结(八)——Vue Router路由、Vuex状态管理、Element-UI

    一.Vue Router路由 二.Vuex状态管理 三.Element-UI Element-UI是饿了么前端团队推出的一款基于Vue.js 2.0 的桌面端UI框架,手机端有对应框架是 Mint U ...

  2. vue+element-ui路由配置相关

    vue+element-ui路由配置相关 转自:http://www.cnblogs.com/MonaSong/p/6703804.html vue-router2中说明了,子路由前面可以不加'/', ...

  3. router路由配置

    vue项目中router路由配置   介绍 路由:控制组件之间的跳转,不会实现请求.不用页面刷新,直接跳转-切换组件>>> 安装 本地环境安装路由插件vue-router:    c ...

  4. Vue - Router 路由

    路由的注册 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF ...

  5. Vue结合路由配置递归实现菜单栏

    作者:小土豆biubiubiu 博客园:https://www.cnblogs.com/HouJiao/ 掘金:https://juejin.im/user/58c61b4361ff4b005d9e8 ...

  6. 你可以不知道原因,但是,我们不能停止努力。httplook抓取路由配置界面信息

    因为实验室的项目要求,需要动态控制路由的配置信息,我们知道.路由选择需要购买的访问后,:http://192.168.1.1 路由配置页面.配置,不须要人手工操作.甚至定时任务配置的时候,就须要进一步 ...

  7. vue入门----------路由配置

    在使用脚手架搭建好项目后要配置路由 1.首先要安装vue-router,你可以在项目的package.json文件中的dependencies项目中添加"vue-route": & ...

  8. Vue Router的配置

    1.beforeEnter function requireAuth (route, redirect, next) { if (!auth.loggedIn()) { redirect({ path ...

  9. vue的路由配置

    路由,其实就是指向的意思,当我点击页面上的home按钮时,页面中就要显示home的内容,如果点击页面上的about 按钮,页面中就要显示about 的内容.Home按钮 => home 内容, ...

  10. Vue系列:Vue Router 路由梳理

    Vue Router 是 Vue.js 官方的路由管理器.它和 Vue.js 的核心深度集成,让构建单页面应用变得易如反掌.包含的功能有: 嵌套的路由/视图表 模块化的.基于组件的路由配置 路由参数. ...

随机推荐

  1. Win10 内存内存占用过高的一种解决方案

    前言 最近win10的电脑一开机,什么都没启动,内存占用率高达90%,笔记本虽然是8G的内存,但不应该如此不堪.在网上找到一个十分有效的解决方案. 正文 使用 win10系统自带内存诊断工具 按下 h ...

  2. redis 乱码:\xac\xed\x00\x05t\x00\x02

    前言 学习 spring-boot 的 redis 相关部分,测试时,发现 使用redisTemplate.opsForValue().set("name","tst&q ...

  3. vulnhub - BREACH: 1

    vulnhub - BREACH: 1 描述 作为多部分系列中的第一部分,Breach 1.0 旨在成为初学者到中级的 boot2root/CTF 挑战.解决将需要可靠的信息收集和持久性相结合.不遗余 ...

  4. c 语言学习第四天

    if 语句 格式: // 1 // 其他语句... if(表达式){ // 其他语句... } // 其他语句... // 2 if(表达式){ }else{ } // 3 if(表达式1){ }el ...

  5. 【JavaScript高级01】JavaScript基础深入

    1,数据类型 JavaScript将数据分为六大类型,分别为数值类型(number).字符串类型(string).布尔类型(boolean).undefined(定义未赋值).null(赋值为空值). ...

  6. Java maven反应堆构建学习实践

    Java maven反应堆构建学习实践 实践环境 Apache Maven 3.0.5 (Red Hat 3.0.5-17) 应用示例 示例项目结构 maven示例项目组织结构如下 maven-stu ...

  7. ElementUI Dialog 结合Vue实现对话框body“二分”布局

    Dialog 结合Vue实现对话框body"二分"布局 需求描述 如下图, 把对话框body内容部分,分成上下两部分,其中上部分高度根据窗口大小动态调整,如果内容过多,则出现滚动条 ...

  8. 03 OLED显示屏实现

    目录 前言 一.软件模拟IIC协议 1.开启IIC协议 2.结束IIC协议 3.传输数据 二.OLED的操作 1.传输数据的准备 2.写入命令 3.写入数据 4.初始化函数 5.设置光标 6.显示字符 ...

  9. argparse学习笔记

    argparse是 Python 的一个内置模块,用于编写用户友好的命令行接口.使用 argparse,你可以很容易地为 Python 脚本添加参数解析功能,使得脚本可以接受命令行选项和参数.学起来也 ...

  10. SpringBoot配置过滤器、拦截器

    拦截器概述 Spring Boot提供了一种简单且强大的方式来定义和使用拦截器(Interceptor).Spring Boot的拦截器基于Spring框架的拦截器机制,可以在请求的处理过程中插入自定 ...