搜索

查看: 3198|回复: 11

[JavaScript] Vue实现动态路由导航的示例

[复制链接]
发表于 2023-5-4 11:47:29 | 显示全部楼层 |阅读模式
Editor 2023-5-4 11:47:29 3198 11 看全部
目录
  • 1、导航守卫
  • 二、功能展示
  • 三、原理
  • 四、功能实现
  • ⛵小结
    1、导航守卫
    “导航” 表示路由正在发生改变

    正如其名,vue-router 提供的导航守卫主要用来通过跳转或取消的方式守卫导航。有多种机会植入路由导航过程中:全局的, 单个路由独享的, 或者组件级的。
    记住参数或查询的改变并不会触发进入/离开的导航守卫。你可以通过观察 $route 对象来应对这些变化,或使用 beforeRouteUpdate 的组件内守卫。
    v-router官网:https://router.vuejs.org/zh/guide/

    我这里用到的是全局前置守卫
    在路由中可以使用router.beforeEach,注册一个全局前置守卫
    const router = new VueRouter({ routes });

    router.beforeEach((to, from, next) => {
      const isover = to.matched.some(record => record.path == '/over')
      if (isover || to.path == '/overview') {
        if (!store.getters.token) {  // 未登录
          next('/login');
          return
        }
        if (!isHome) {
          next();  
          return
        }
      } else {
        next()  // 无需登录验证
      }
    })
    当一个导航触发时,全局前置守卫按照创建顺序调用,守卫是异步解析执行,此时导航在所有守卫resolve完之前一直处于等待中。
    每个守卫方法接收3个参数
    to: Route:即将要进入的目标 路由对象
    from: Route :当前导航正要离开的路由
    next: Function : 一定要调用该方法来resolve这个钩子,执行效果依赖next方法的调用参数
    1.next(): 进行管道中的下一个钩子。如果全部钩子执行完了,则导航的状态就是 confirmed (确认的)。
    2.next(’/’) 或者 next({ path: ‘/’ }): 跳转到一个不同的地址。当前的导航被中断,然后进行一个新的导航。你可以向 next 传递任意位置对象,且允许设置诸如 replace: true、name: ‘home’ 之类的选项以及任何用在 router-link 的 to prop 或 router.push 中的选项。
    3.next(error): (2.4.0+) 如果传入 next 的参数是一个 Error 实例,则导航会被终止且该错误会被传递给 router.onError() 注册过的回调。
    4.** 确保 next 函数在任何给定的导航守卫中都被严格调用一次。它可以出现多于一次,但是只能在所有的逻辑路径都不重叠的情况下,否则钩子永远都不会被解析或报错 **这里有一个在用户未能验证身份时重定向到 /login 的示例:
    // BAD
    router.beforeEach((to, from, next) => {
      if (to.name !== 'Login' && !isAuthenticated) next({ name: 'Login' })
      // 如果用户未能验证身份,则 `next` 会被调用两次
      next()
    })
    // GOOD
    router.beforeEach((to, from, next) => {
      if (to.name !== 'Login' && !isAuthenticated) next({ name: 'Login' })
      else next()
    })
    二、功能展示

    2023022409581612.png

    Vue实现动态路由导航的示例3424 作者:Editor 帖子ID:2710 论坛知鸟论坛_zn60.com


    2023022409581613.png

    Vue实现动态路由导航的示例4277 作者:Editor 帖子ID:2710 论坛知鸟论坛_zn60.com


    三、原理
    对于路由的导航动态实现,我们首先要确定我们拥有的路由有哪些,并且对于命名有一定的良好习惯。其中最重要的就是在我们的路由里面进行设定,设置我们的路由守卫,能对路由进行控制和及时的更新我们的路由数据,然后就可以直接在功能实现区域进行调用实现了。

    四、功能实现
    1.router文件夹

    2023022409581614.png

    Vue实现动态路由导航的示例5476 作者:Editor 帖子ID:2710 论坛知鸟论坛_zn60.com


    在router里面引入我们的store

    2023022409581615.png

    Vue实现动态路由导航的示例8363 作者:Editor 帖子ID:2710 论坛知鸟论坛_zn60.com


    路由守卫
    // 路由守卫
    router.beforeEach((to, from, next) => {
      localStorage.setItem("currentPathName", to.name)  // 设置当前的路由名称,为了在Header组件中去使用
      store.commit("setPath")  // 触发store的数据更新
      next()  // 放行路由
    })
    2.store文件夹

    2023022409581616.png

    Vue实现动态路由导航的示例9398 作者:Editor 帖子ID:2710 论坛知鸟论坛_zn60.com


    import Vue from 'vue'
    import Vuex from 'vuex'

    Vue.use(Vuex)

    const store = new Vuex.Store({
      state: {
        currentPathName: ''
      },
      mutations: {
        setPath (state) {
          state.currentPathName = localStorage.getItem("currentPathName")
        }
      }
    })

    export default store

    3.main.js

    2023022409581617.jpg

    Vue实现动态路由导航的示例4829 作者:Editor 帖子ID:2710 论坛知鸟论坛_zn60.com


    import Vue from 'vue'
    import App from './App.vue'
    import router from './router'
    import store from "@/store";
    import ElementUI from 'element-ui';
    import 'element-ui/lib/theme-chalk/index.css';
    import request from "@/utils/request";
    import './assets/css/global.css'
    // import * as echarts from 'echarts'
    Vue.config.productionTip = false

    Vue.use(ElementUI,{size: "mini"});

    Vue.prototype.request = request;

    new Vue({
      router,
      store,
      render: h => h(App)
    }).$mount('#app')

    4.实现

    2023022409581618.jpg

    Vue实现动态路由导航的示例1764 作者:Editor 帖子ID:2710 论坛知鸟论坛_zn60.com


      
       
          
          
            
    Vue实现动态路由导航的示例3246 作者:Editor 帖子ID:2710 论坛知鸟论坛_zn60.com
            宿舍后台管理
              首页
              {{ currentPathName }}
          
       
       
          
            
    Vue实现动态路由导航的示例7809 作者:Editor 帖子ID:2710 论坛知鸟论坛_zn60.com
            {{user.nickname}}
          
          
            
              个人信息
            
            
              退出登录
            
          
       
      




    ⛵小结
    到此这篇关于Vue实现动态路由导航的示例的文章就介绍到这了,更多相关Vue 动态路由导航内容请搜索知鸟论坛以前的文章或继续浏览下面的相关文章希望大家以后多多支持知鸟论坛!
  • 发表于 2023-6-28 21:47:58 | 显示全部楼层
    音乐之家1 2023-6-28 21:47:58 看全部
    楼主太厉害了!楼主,I*老*虎*U!我觉得知鸟论坛真是个好地方!
    发表于 2023-6-29 13:26:10 | 显示全部楼层
    永远就三年疗 2023-6-29 13:26:10 看全部
    论坛不能没有像楼主这样的人才啊!我会一直支持知鸟论坛。
    发表于 2023-6-29 15:54:55 | 显示全部楼层
    术数古籍专卖疤 2023-6-29 15:54:55 看全部
    这东西我收了!谢谢楼主!知鸟论坛真好!
    发表于 2023-6-29 18:09:10 | 显示全部楼层
    向往草原403 2023-6-29 18:09:10 看全部
    楼主太厉害了!楼主,I*老*虎*U!我觉得知鸟论坛真是个好地方!
    发表于 2023-6-29 18:29:02 | 显示全部楼层
    丁侦球 2023-6-29 18:29:02 看全部
    这东西我收了!谢谢楼主!知鸟论坛真好!
    发表于 2023-6-29 20:40:29 | 显示全部楼层
    123456823 2023-6-29 20:40:29 看全部
    楼主,大恩不言谢了!知鸟论坛是最棒的!
    发表于 2023-6-30 00:02:19 | 显示全部楼层
    麻辣鸡翅 2023-6-30 00:02:19 看全部
    论坛不能没有像楼主这样的人才啊!我会一直支持知鸟论坛。
    发表于 2023-6-30 04:39:26 | 显示全部楼层
    惜颜705 2023-6-30 04:39:26 看全部
    楼主太厉害了!楼主,I*老*虎*U!我觉得知鸟论坛真是个好地方!
    发表于 2023-6-30 10:39:53 | 显示全部楼层
    冀苍鸾 2023-6-30 10:39:53 看全部
    楼主,我太崇拜你了!我想我是一天也不能离开知鸟论坛
    • 您可能感兴趣
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则 返回列表

    RSS订阅| 小黑屋| 知鸟论坛 |网站地图
    本站资源来自互联网用户收集发布,如有侵权请邮件联系处理。 联系邮箱E-mail:zniao@foxmail.com
    快速回复 返回顶部 返回列表