首页 > 其他分享 >Vue学习笔记:路由开发 Part 08 导航守卫

Vue学习笔记:路由开发 Part 08 导航守卫

时间:2023-08-12 18:03:02浏览次数:56  
标签:Vue users 08 守卫 Part 组件 router 导航 路由

vue-router 提供的导航守卫主要用来通过跳转或取消的方式守卫导航。这里有很多方式植入路由导航中:全局的,单个路由独享的,或者组件级的。

全局前置守卫

可以使用 router.beforeEach 注册一个全局前置守卫。

当一个导航触发时,全局前置守卫按照创建顺序调用。守卫是异步解析执行,此时导航在所有守卫 resolve 完之前一直处于等待中

每个守卫方法接收两个参数:

  • to: 即将要进入的目标 
  • from: 当前导航正要离开的路由 

可以返回的值如下:

  • false: 取消当前的导航。如果浏览器的 URL 改变了(可能是用户手动或者浏览器后退按钮),那么 URL 地址会重置到 from 路由对应的地址。
  • 一个路由地址: 通过一个路由地址跳转到一个不同的地址,就像调用 router.push() 一样,你可以设置诸如 replace: true 或 name: 'home' 之类的配置。当前的导航被中断,然后进行一个新的导航,就和 from 一样。

示例:

在本示例中使用router.beforeEach作为拦截,使用mate设定部分路由必须经过验证。验证规则为判断cookie中auth值是否存在。对不符合条件的请求,转到/login上。

js/getCookie.js

获取指定cookie值,如果不存在,则返回null

function getCookie (name) {
    const cookies = document.cookie.split('; ');

    for (const cookie of cookies) {
        const [cookieName, cookieValue] = cookie.split('=');
        if (cookieName === name) {
            return cookieValue;
        }
    }

    return null; // 如果没有找到匹配的 Cookie,返回 null 或其他默认值
}
export {getCookie}


router/index.js

路由设定:

  • / /user /login无需登录即可访问
  • /user/list /user/detail 需要cookie中有指定值(模拟登录状态)才可访问 
  • 不能直接访问的跳转到Login
import { createRouter, createWebHashHistory } from 'vue-router'
import Root from '../views/RootView.vue'
import Users from '../views/usersview.vue'
import UserList from '../views/User/UserList.vue'
import UserDetail from '../views/User/UserDetail.vue'
import Login from '../views/LoginView.vue'
import { getCookie } from '../js/getCookie'

const routes = [
    {
        path: '/',
        component: Root
    },
    {
        path: '/login',
        name: 'login',
        component: Login
    },
    {
        path: '/user',
        component: Users,
        // meta:{
        //     LoginRequire:true
        // },
        children: [
            {
                path: 'list',
                component: UserList,
                meta: {
                    LoginRequire: true
                }
            },
            {
                path: 'detail/:userid',
                component: UserDetail,
                meta: {
                    LoginRequire: true
                },
            }
        ]
    }
]


const myCookieValue = getCookie('auth');

const router = createRouter({
    history: createWebHashHistory(),
    routes
})

router.beforeEach((to, from, next) => {

    if (to.name !== 'login' && !myCookieValue && to.meta.LoginRequire) {
        console.log('jump to login')
        next({
            name: 'login',
            query: {
                from: from.fullPath
            }
        })
    }
    else {
        next()
    }
}
)
export default router

全局后置钩子

你也可以注册全局后置钩子,然而和守卫不同的是,这些钩子不会接受 next 函数也不会改变导航本身:

router.afterEach((to, from) => {

  sendToAnalytics(to.fullPath)

})

它们对于分析、更改页面标题、声明页面等辅助功能以及许多其他事情都很有用。

它们也反映了 navigation failures 作为第三个参数:

router.afterEach((to, from, failure) => {

  if (!failure) sendToAnalytics(to.fullPath)

})

路由独享的守卫

你可以直接在路由配置上定义 beforeEnter 守卫:

const routes = [
  {
    path: '/users/:id',
    component: UserDetails,
    beforeEnter: (to, from) => {
      // reject the navigation
      return false
    },
  },
]

beforeEnter 守卫 只在进入路由时触发,不会在 params、query 或 hash 改变时触发。例如,从 /users/2 进入到 /users/3 或者从 /users/2#info 进入到 /users/2#projects。它们只有在 从一个不同的 路由导航时,才会被触发。


组件内的守卫

最后,你可以在路由组件内直接定义路由导航守卫(传递给路由配置的)

可用的配置 API

你可以为路由组件添加以下配置:

  • beforeRouteEnter
  • beforeRouteUpdate
  • beforeRouteLeave
const UserDetails = {
  template: `...`,
  beforeRouteEnter(to, from) {
    // 在渲染该组件的对应路由被验证前调用
    // 不能获取组件实例 `this` !
    // 因为当守卫执行时,组件实例还没被创建!
  },
  beforeRouteUpdate(to, from) {
    // 在当前路由改变,但是该组件被复用时调用
    // 举例来说,对于一个带有动态参数的路径 `/users/:id`,在 `/users/1` 和 `/users/2` 之间跳转的时候,
    // 由于会渲染同样的 `UserDetails` 组件,因此组件实例会被复用。而这个钩子就会在这个情况下被调用。
    // 因为在这种情况发生的时候,组件已经挂载好了,导航守卫可以访问组件实例 `this`
  },
  beforeRouteLeave(to, from) {
    // 在导航离开渲染该组件的对应路由时调用
    // 与 `beforeRouteUpdate` 一样,它可以访问组件实例 `this`
  },
}

在之前的文档中使用watch对相同组件内的路由切换进行处理,在这里可以使用beforeRouteUpdate()进行同样操作。

对于组件式则使用onBeforeUpdate来实现

// watch(() => route.params, async (newUserId) => {
//     await fetchData(newUserId);
// });
onBeforeRouteUpdate(async(to,from)=>{
    await fetchData(to.params.userid)
})

标签:Vue,users,08,守卫,Part,组件,router,导航,路由
From: https://blog.51cto.com/quietguoguo/7060425

相关文章

  • 2023/08/12
    《咱俩谁管谁叫爹》是网上一首搞笑饶舌歌曲,来源于东北酒桌上的助兴游戏。现在我们把这个游戏的难度拔高一点,多耗一些智商。不妨设游戏中的两个人为A和B。游戏开始后,两人同时报出两个整数NA​和NB​。判断谁是爹的标准如下:将两个整数的各位数字分别相加,得到两......
  • VUE3_API 风格
    选项式API(OptionsAPI)使用选项式API,我们可以用包含多个选项的对象来描述组件的逻辑,例如 data、methods 和 mounted。选项所定义的属性都会暴露在函数内部的 this 上,它会指向当前的组件实例<script>exportdefault{//data()返回的属性将会成为响应式的状态/......
  • 2023.08.08杭电多校第七场
    solved:3/13rank:B.RandomNimGame题意:两个人玩Nim游戏取石子,但是每次选择石子都是随机的,问最后先手获胜的概率;瞎写了几组样例算出来都是1/2,遂大胆猜想:除了每堆石子都只有一个时按石子堆数的奇偶判断先手获胜的概率是1还是0,其余情况先手获胜概率都是1/2;根据题解所说,可以用归纳......
  • 20230812巴蜀暑期集训测试总结
    T2考场先是想到(根本没想)了一个\(O(n^5)\)的思路,然后猜了一个比较好打的结论开打。结果小样例和答案差一点,大样例就差的多了。确认不是精度问题后就明显是猜的结论有问题了。这下是彻底没办法了,只有打了那个\(O(n^5)\)的暴力。出分我一看——怎么挂了\(20pts\)?而且按照暴力......
  • 2308-习题 分支循环,goto语句
    1.习题3.1.输入三个整数,从大到小输出这三个数 1#define_CRT_SECURE_NO_WARNINGS2#include<stdio.h>3intmain()4{56inta=0;7intb=0;8intc=0;9inttemp=0;10scanf("%d%d%d",&a,&b,&c);11......
  • LGJOI20230812
    LGJ水场。这场总体题比较简单,所以分比较高。A有\(n\)项工作,完成一项工作需要\(1\)单位时间。每项工作有个截止时间\(t\)和报酬\(v\),需要在第\(t\)单位时间前完成工作才能得到\(v\)的报酬。给定\(T\),求\(T\)时间后获得报酬的最大值。solution:简单贪心。将工作......
  • Gitc错误Failed to connect to 127.0.0.1 port 1080 Connection refused拒绝连接错误
    一、git拒绝连接原因分析使用git从远程仓库下载代码出现上述的错误是因为使用了proxy代理,所以要解决该问题,核心操作就是要取消代理二、解决方式1、查看Linux当前有没有使用代理通过git的配置文件查看有无使用代理(没有成功)查询是否使用代理:gitconfig--globalhttp.proxyg......
  • 使用create-vue创建vue3项目
    create-vue是vue3新的脚手架搭建项目工具,底层构建工具使用vite,而不是vue-cli的webpack。但不是说你不能用以前的vuecreate命令来创建vue3项目,你完全可以用vue-cli来创建。vite:https://cn.vitejs.dev/guide/#scaffolding-your-first-vite-project使用create-vue创建项目使用cr......
  • create-vue和vue-cli创建项目的差异
    这里对比的是vue-cli和create-vue创建vue3项目的文件中的内容差异。原来public中的index.html被移动到根目录:(原因见这里:)https://cn.vitejs.dev/guide/#index-html-and-project-root<!--不同点1:script放在了最前面,方便编写代码,实际上你给他放在最后面也没问题.script属......
  • vue3组合式api生命周期
    生命周期钩子函数Vue3:https://cn.vuejs.org/api/composition-api-lifecycle.htmlVue2:https://v2.cn.vuejs.org/v2/api/#选项-生命周期钩子Vue2(选项式)Vue3(选项式)Vue3(组合式Api)beforeCreate()beforeCreate()created()created()setup()beforeMount()bef......