vue路由跳转前的校验(路由守卫)

文章详细阐述了在Vue.js中如何使用VueRouter进行路由的权限控制,包括全局守卫、独享守卫和组件守卫的实现方式,以及结合WebStorage进行用户权限验证。同时,讨论了路由的hash模式和history模式的优缺点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.作用

对路由进行权限控制,一般去取存在浏览器上的某个值。【配合WebStorage】

2.分类

全局守卫、独享守卫、组件守卫

  1. 全局守卫:
    $router中有个meta{}我们可以在里面设置个值eg:
    meta{
    isAuth:true;
    }
    在这里插入图片描述
src/router/index.js:
//该文件专门用于创建整个应用的路由器
import VueRouter from "vue-router";
//引入组件
import Home from '../pages/Home'
import About from '../pages/About'
import News from '../pages/News'
import Message from '../pages/Message'
import Detail from '../pages/Detail'

//创建一个路由器
const router = new VueRouter({
    routes:[
        {
            name:'guanyv',
            path:'/about',
            component:About,
            meta:{title:'关于'}
        },
        {
            name:'zhuye',
            path:'/home',
            component:Home,
            meta:{title:'主页'},
            children:[
                {
                    name:'xinwen',
                    path:'news',
                    component:News,
                    meta:{isAuth:true,title:'新闻'}
                },
                {
                    name:'xiaoxi',
                    path:'message',
                    component:Message,
                    meta:{isAuth:true,title:'消息'},
                    children:[
                        {
                            name:'xiangqing',
                            path:'detail',
                            component:Detail,
                            meta:{isAuth:true,title:'详情'},
							props($route){
								return {
									id:$route.query.id,
									title:$route.query.title,
								}
							}
                        }
                    ]
                }
            ]
        }
    ]
})

//全局前置路由守卫————初始化的时候、每次路由切换之前被调用
router.beforeEach((to,from,next) => {
    console.log('前置路由守卫',to,from)
    if(to.meta.isAuth){
        if(localStorage.getItem('school')==='atguigu'){
            next()
        }else{
            alert('学校名不对,无权限查看!')
        }
    }else{
        next()
    }
})

//全局后置路由守卫————初始化的时候被调用、每次路由切换之后被调用
router.afterEach((to,from)=>{
	console.log('后置路由守卫',to,from)
	document.title = to.meta.title || '硅谷系统'
})

//导出路由器
export default router

2.独享路由守卫

src/router/index.js:
//该文件专门用于创建整个应用的路由器
import VueRouter from "vue-router";
//引入组件
import Home from '../pages/Home'
import About from '../pages/About'
import News from '../pages/News'
import Message from '../pages/Message'
import Detail from '../pages/Detail'


//创建一个路由器
const router = new VueRouter({
    routes:[
        {
            name:'guanyv',
            path:'/about',
            component:About,
            meta:{title:'关于'}
        },
        {
            name:'zhuye',
            path:'/home',
            component:Home,
            meta:{title:'主页'},
            children:[
                {
                    name:'xinwen',
                    path:'news',
                    component:News,
                    meta:{title:'新闻'},
                    //独享守卫,特定路由切换之后被调用
                    beforeEnter(to,from,next){
                        console.log('独享路由守卫',to,from)
                        if(localStorage.getItem('school') === 'atguigu'){
                            next()
                        }else{
                            alert('暂无权限查看')
                        }
                    }
                },
                {
                    name:'xiaoxi',
                    path:'message',
                    component:Message,
                    meta:{title:'消息'},
                    children:[
                        {
                            name:'xiangqing',
                            path:'detail',
                            component:Detail,
                            meta:{title:'详情'},
							props($route){
								return {
									id:$route.query.id,
									title:$route.query.title,
								}
							}
                        }
                    ]
                }
            ]
        }
    ]
})

//全局后置路由守卫————初始化的时候被调用、每次路由切换之后被调用
router.afterEach((to,from)=>{
	console.log('后置路由守卫',to,from)
	document.title = to.meta.title || '硅谷系统'
})

//导出路由器
export default router

3.组件内守卫:

src/pages/About.vue:
<template>
    <h2>我是About组件的内容</h2>
</template>

<script>
    export default {
        name:'About',
        //通过路由规则,离开该组件时被调用
        beforeRouteEnter (to, from, next) {
            console.log('About--beforeRouteEnter',to,from)
            if(localStorage.getItem('school')==='atguigu'){
                next()
            }else{
                alert('学校名不对,无权限查看!')
            }
        },
        //通过路由规则,离开该组件时被调用
        beforeRouteLeave (to, from, next) {
            console.log('About--beforeRouteLeave',to,from)
            next()
        }
    }
</script>

3.路由器的两种工作模式

1.对于一个url来说,什么是hash值?—— #及其后面的内容就是hash值

2.hash值不会包含在 HTTP 请求中,即:hash值不会带给服务器

3.hash模式:

1.地址中永远带着#号,不美观
2.若以后将地址通过第三方手机app分享,若app校验严格,则地址会被标记为不合法
3.兼容性较好

4.history模式:

1.地址干净,美观
2.兼容性和hash模式相比略差
3.应用部署上线时需要后端人员支持,解决刷新页面服务端404的问题

4.WebStorage

1.作用:

浏览器通过Winodw.sessionStorage和Window.localStorage属性来实现本地存储机制。

2.相关API:

  1. xxxStorage.setItem(‘key’, ‘value’):该方法接受一个键和值作为参数,会把键值对添加到存储中,如果键名存在,则更新其对应的值
    2.xxxStorage.getItem(‘key’):该方法接受一个键名作为参数,返回键名对应的值
    3.xxxStorage.removeItem(‘key’):该方法接受一个键名作为参数,并把该键名从存储中删除
    4.xxxStorage.clear():该方法会清空存储中的所有数据
    备注:
    SessionStorage存储的内容会随着浏览器窗口关闭而消失
    LocalStorage存储的内容,需要手动清除才会消失
    xxxStorage.getItem(xxx)如果 xxx 对应的 value 获取不到,那么getItem()的返回值是null
    JSON.parse(null)的结果依然是null
### Vue.js 中实现路由跳转的方法 在 Vue.js 中,通过 `vue-router` 可以轻松实现页面之间的跳转。以下是几种常见的方法以及其实现方式。 #### 方法一:基础路径跳转 如果只需要简单的页面跳转而无需传递参数,可以直接定义好路由表并使用 `$router.push()` 或 `<router-link>` 实现跳转。例如: ```javascript // 定义路由配置 (src/router/index.js) import Vue from 'vue'; import Router from 'vue-router'; import HelloWorld from '@/components/HelloWorld'; // 页面组件A import Login from '@/components/Login'; // 页面组件B Vue.use(Router); export default new Router({ routes: [ { path: '/', name: 'HelloWorld', component: HelloWorld, }, { path: '/login', name: 'Login', component: Login, } ] }); ``` 在模板中可以这样写: ```html <router-link :to="{name: 'Login'}">往登录页</router-link> ``` 或者在 JavaScript 中调用: ```javascript this.$router.push({ name: 'Login' }); ``` 以上代码展示了如何从当页面跳转至 `/login` 页面[^2]。 --- #### 方法二:带参数的跳转 当需要向目标页面传递数据时,可以在跳转时附加查询字符串或动态路由参数。例如,在点击按钮后触发函数完成跳转操作。 ##### 使用查询参数 (`query`) ```html <el-button type="primary" @click="navigateToEditPage(essay.id)">编辑文章</el-button> <script> methods: { navigateToEditPage(id) { this.$router.push({ path: '/essayedit', query: { id } }); // 添加查询参数id } } </script> ``` 接收端可以通过 `this.$route.query` 获取这些参数[^3]。 ##### 动态路由匹配 另一种更优雅的方式是利用动态路由参数。修改路由配置如下: ```javascript { path: '/essay/:id/edit', // 动态部分:id name: 'EssayEdit', component: () => import('@/views/EssayEdit') }, ``` 然后执行跳转命令: ```javascript this.$router.push({ name: 'EssayEdit', params: { id: essay.id } }); ``` 注意:这里必须指定路由名称(`name`)而不是路径(`path`),因为只有命名路由支持这种形式的参数传递[^3]。 --- #### 方法三:权限控制下的跳转 对于某些特殊场景比如管理员后台管理界面可能只允许已认证用户进入,则需加入权限校验机制。下面是一个基于导航守卫的例子: ```javascript import Vue from 'vue'; import App from './App.vue'; import router from './router'; Vue.config.productionTip = false; router.beforeEach((to, from, next) => { const isAuthRequired = to.matched.some(record => record.meta.requiresAuth); // 判断是否有requiresAuth标记 if (isAuthRequired && !localStorage.getItem('token')) { // 假设存储令牌于localstorage return next('/login'); // 若未授权则重定向回登陆页 } next(); // 继续正常流程 }); new Vue({ router, render: h => h(App), }).$mount('#app'); ``` 此段脚本会在每次切换视图自动检测是否满足条件再决定下一步动作[^1]。 --- ### 总结 综上所述,Vue 提供了灵活多样的手段来进行跨页面间的转移处理,无论是普通的链接还是复杂的业务逻辑都能很好地应对。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值