Vue使用addRoute实现动态路由vue- router

说起动态路由刚开始的时候我觉得很简单,然而显示并不是这样的
刚开始我的思路是这样的:

// JSON 路由模拟的
import { accessedRoutes } from './dynamicRoute'

import { distinguishApi, bdTokenApi } from "@/api/lianxi";
const Layout = import('@/layout/index.vue')
const access_token = "24.bbe13e4dc39905f4fb9c9be1b"
let arrs = []
distinguishApi(
    { image: '' },
    access_token
).then((res) => {
    console.log('res', res)
    // 我这里利用别的请求 然后把json数据赋值
    // 当做请求后返回的数据
    arrs = accessedRoutes
});

const routes = [
    {
        path: '/login',
        name: 'login',
        component: () => import('@/views/login/index.vue'),
        children: [],
        mate: {
            title: '登录',
        }
    }
];

// 这里将请求过来的值 push 到 routes 里面,导出挂载
routes.push({
    path: '/',
    name: 'layout',
    component: Layout,
    children: accessedRoutes
})

export { routes }

后来我发现路由老是加载不出来,我打印了router.options 里面也有值,确实是 push 进去了单页面确实没有渲染,
然后,我把请求去掉直接push 页面上是有的,我试了好多次,我发现我忽略了一点,请求是有延迟的,可能是当请求还没结束,router就已经挂载到 Vue 实例上了。
然后在网上找的资料,有一个 router.addRoute 方法来实现动态路由

// 处理 JSON 文件里面的数据
/**
 * 
 * 动态路由
 */

import { routesChiden } from "./router.json"

const loadView = (view) => { 
    return import(`@/views${view}.vue`)
}
const accessedRoutes = filterAsyncRouter(routesChiden, loadView)

function filterAsyncRouter(row, loadView) {
    for (var i = 0; i < row.length; i++) {
        row[i].component = loadView(row[i].component)
    }
    return row
}

export { accessedRoutes }


// Vuex 全局状态管理

class Enum extends VuexModule {
  private routeLists = [];

  private hasGetRoute = false
  /**
   * 
   * @param data 赋值动态路由
   */
  @Mutation
  setRouteList( data:any) {
    // 先将 JSON 格式的路由列表解析为 JavaScript List
    // 再用路由解析函数解析 List 为真正的路由列表
    this.routeLists = data
    // 修改路由获取状态
    this.hasGetRoute = true
  }
  /**
   * 
   * @returns 获取动态路由
   */
  @Action
  set_getRouteList() {
    return new Promise((resolve) => {
      distinguishApi(
        { image: '' },
        access_token
      ).then((res) => {
        this.setRouteList(accessedRoutes)
        resolve(accessedRoutes)
      });
    })
  }
 }
 
 
//  路由拦截

router.beforeEach((to, from, next) => {
	// 重定向
    if(to.path == '/'){
        next('/home')
    }
    if (!menuStore.getHasGetRoute) {
        // 如果没有获取路由信息,先获取路由信息而后跳转
        menuStore.set_getRouteList().then((res) => {
            console.log('res' , res)
            router.addRoute({
                path: "/",
                name: "layout",
                component: Layout,
                children: menuStore.getRouteList
            })
            next({ ...to, replace: true })
        })
    } else {
        // 如果已经获取路由信息,直接跳转
        next()
    }
})

这里参考地址:https://www.jb51.net/article/182033.htm

在这里我说明一下,参考地址他用的是 router.addRoutes(Array) , 参数是数组
我这边用的是,router.addRoute(Object) , 参数是对象
因为我这边使用的是 vue-cli4.x 版本,在官方文档中解释 router.addRoutes 已经废弃了

vue-router 官方地址 : https://router.vuejs.org/zh/api/#router-resolve

截图

笔记

  • 6
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue3中,可以使用router.addRoute()方法来实现动态路由的添加。这个方法可以接受两个参数,第一个参数可以是父级路由对象或者父级路由的路径,第二个参数是要添加的路由对象。通过调用这个方法,可以动态地向路由中添加单个路由。\[1\] 以下是一个示例代码,展示了如何在Vue3中使用addRoute()方法实现动态路由的添加: ```javascript import { createRouter } from 'vue-router' const router = createRouter({ // 路由配置 }) // 添加单个路由 const route = { path: '/dynamic', name: 'Dynamic', component: () => import('@/views/Dynamic.vue') } router.addRoute(route) export default router ``` 在上面的代码中,我们首先创建了一个路由实例,然后定义了一个要添加的路由对象。最后,通过调用addRoute()方法将这个路由对象添加到路由中。 需要注意的是,在Vue3中,使用addRoute()方法添加的路由会立即生效,无需重新创建路由实例或调用其他方法。这样,新添加的路由就可以在页面上进行渲染了。 希望这个回答对你有帮助! #### 引用[.reference_title] - *1* *3* [vue3动态路由addRoute](https://blog.csdn.net/m0_49343686/article/details/123959075)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [vue3 使用addRoute动态添加路由,兼解决刷新空白或跳到404页面问题](https://blog.csdn.net/YSQ_qsy/article/details/122042229)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值