vue router children 路由变了 组件没变_Vue动态路由

为什么使用动态路由?

因为后台会存在角色,角色中会有不同的菜单数据,这里面就会出现路由不能写死的问题?如何解决,上动态路由。

ff7ab78be3e547444ff9ca940a94fad4.png

设计思路

  1. 登录的时候对异步请求数据保存到 localstorage 中
  2. 在 router.beforeEach 路由守卫中添加 localstorage 菜单数据加载
  3. 根据加载的菜单数据,递归加载组件,因为本地只保存 component 路径
  4. 最后使用 router.addRoutes 将组装好的数据填充进来就完成了

坑点

为什么路由不报错,进入该路由界面无显示任何数据?

这是因为思想出问题了,一开始在登录中将 component 直接 import 进来了,然后再保存到 localstorage 。所以理所当然认为本地保存了组件信息,这个和周总(同事)讨论过。他也不知道怎么回事,但是我突然就说没有加载组件进来,果然陷入思维困局需要第二者。

解决方案:

component 字段保存组件路径,在需要加载的时候再 import 进来。

function BuildRoutes(routes) {    let element = {        name: routes.name,        path: routes.path,        component: () => import(`@/${routes.component}.vue`)    };    if (routes.component == "") {        delete element.component;    }    if (!isNull(routes.children) || !isUndefined(routes.children)) {        element.children = [];        routes.children.forEach(item => {            element.children.push(BuildRoutes(item));        });        return element;    }    return element;}

如何保证无路由时后台获取?

正如标题所讲,我首先的思路就是在 router.beforeEach 中判断无路由就直接后台请求获取。这样子做就会有一个问题,那就是如何判断后台数据获取到了的问题。因为在守卫中是同步的,而我在这里使用的是异步库 axios 。所以这里就会导致短期会有多个请求

解决方案:

将路由信息在登录中保存,这样子就不会出现多次请求问题,因为登录只会进行一次,所以请求后台数据并保存到本地也只会是一次。

// 递归组装路由信息function dynamicBuild(source) {    let element = {        name: source.label,        path: source.full_url,        component: source.component    };    if (source.children != null) {        element.children = [];        source.children.forEach(item => {            element.children.push(dynamicBuild(item));        });        return element;    }    return element;}
// vuex mutations 函数        generateRoutes: (state, routes) => {            state.addRouters = routes;            let routers = BuildRoutes(routes);            if (isObject(routers)) {                routers = [routers];            }            router.addRoutes(routers);        }
// 动态路由请求数据获取function dynamicRouter() {    menuList().then(res => {        let backendRouter;        backendRouter = dynamicBuild(res.data.data[0]);        storage.setItem({            name: 'backend_router',            value: backendRouter,            expires: new Date().getTime() + 60 * 60 * 1000        });        store.dispatch('GenerateRoutes', backendRouter)    });}

如何保证动态路由信息不会重复添加?

首先在路由守卫当中,我们要保证添加过路由后就不再添加进来。所以我们就要在全局中保存所需要的信息,这里买了 vuex 就是非常好的方法。首先我们应该在 state 中添加一个 addRouters 变量,默认是 null 然后就可以根据这个值来判断是否需要添加了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue RouterVue.js 官方的路由管理器,用于实现单页面应用(SPA)中的路由功能。它可以帮助我们在不同的 URL 地址之间进行切换,并且可以根据不同的路由配置加载不同的组件。 在 Vue Router 中,我们可以通过配置路由的 `children` 属性来实现动态添加子路由。具体的步骤如下: 1. 首先,在父路由的配置中,定义一个空的 `children` 数组,用于存放动态添加的子路由。 2. 在需要动态添加子路由的地方,使用 `router.addRoutes()` 方法来添加子路由。这个方法接受一个包含子路由配置的数组作为参数。 下面是一个示例代码,演示了如何使用 Vue Router 动态添加子路由: ```javascript // 父路由配置 const parentRoute = { path: '/parent', component: ParentComponent, children: [] // 空的 children 数组 } // 动态添加子路由 const childRoutes = [ { path: 'child1', component: Child1Component }, { path: 'child2', component: Child2Component } ] // 在需要添加子路由的地方调用 addRoutes 方法 parentRoute.children = childRoutes // 注册路由 router.addRoutes([parentRoute]) ``` 在上面的示例中,我们首先定义了一个父路由 `parentRoute`,其中的 `children` 数组为空。然后,我们定义了一个包含子路由配置的数组 `childRoutes`,其中包含了两个子路由。最后,我们将 `childRoutes` 赋值给 `parentRoute` 的 `children` 属性,并通过 `router.addRoutes()` 方法将父路由注册到 Vue Router 中。 这样,当访问 `/parent/child1` 或 `/parent/child2` 时,对应的子组件 `Child1Component` 和 `Child2Component` 将会被加载。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值