请教一下 vue-router 中 addRoute 的问题 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
qq309187341
V2EX    Vue.js

请教一下 vue-router 中 addRoute 的问题

  •  
  •   qq309187341 2022-01-12 09:53:26 +08:00 3410 次点击
    这是一个创建于 1436 天前的主题,其中的信息可能已经有所发展或是发生改变。

    如题,使用 addRoute 来动态添加路由的时候,从 store 里面调用 actions 的中一个方法从后端获取路由地址。然后再添加到路由中。 代码如下:

    router.beforeEach(async (to, from, next) => { NProgress.start(); // NProgress 开始 if (allowList.includes(to.name)) { // 若跳转页面非免登录名单,则直接进入 next(); } else { // 若当前页面需要登录 // 则判断当前页面是否已经拥有登录权限 token if (storage.get('token')) { const mainStore = useMainStore(); if (mainStore.routerList === null) { mainStore.getRouterList().then(res => { console.log(res) router.addRoute(res) next() }) } else { next() } } else { // 没有 token 内容,所以进入登录页面 next({ path: '/user' }) } } }) 

    但是浏览器运行到时候却报了警告!

    vue-router.esm-bundler.js:72 [Vue Router warn]: The "next" callback was never called inside of : async (to, from, next) => { NProgress.start(); // NProgress 开始 if (allowList.includes(to.name)) { // 若跳转页面非免登录名单,则直接进入 next(); } else { // 若当前页面需要登录 // 则判断当前页面是否已经拥有登录权限 token if (storage.get('token')) { const mainStore = useMainStore(); if (mainStore.routerList === null) { mainStore.getRouterList().then(res => { console.log(res) router.addRoute(res) next() }) } else { next() } } else { // 没有 token 内容,所以进入登录页面 next({ path: '/user' }) } } } . If you are returning a value instead of calling "next", make sure to remove the "next" parameter from your function. 

    难道 next 方法不能放在函数中????

    9 条回复    2024-11-17 22:10:41 +08:00
    yamedie
        1
    yamedie  
       2022-01-12 09:58:48 +08:00
    改成这种写法试一下吧
    const res = await mainStore.getRouterList();
    // res.xxxxx 略
    next();

    然后动态加载路由也不适合放在路由守卫里吧, 我觉得应该放在 App.vue 的 created 或 main.js 之类的位置
    qq309187341
        2
    qq309187341  
    OP
       2022-01-12 10:05:21 +08:00
    @yamedie 忘记你这种方式好像也是可以的。。。
    我看几个大的脚手架好像都是放在路由守卫里面进行添加的。。。
    tutou
        3
    tutou  
       2022-01-12 10:05:38 +08:00
    首先 async await 要一起用。第二实现你的需求,不用动态添加路由,你都 beforeEach 判断了,没有 token 强制跳登录页面就行了,而且还可以做到登录后再跳回来
    qq309187341
        4
    qq309187341  
    OP
       2022-01-12 10:24:18 +08:00
    @tutou async 是之前写了,忘记删除了。一楼说起来,我才想起来可以使用这种方式解决 next()控制台报错的问题。至于动态路由的问题,只是因为需要根据后端来对不同角色生成不同菜单。
    wu67
        5
    wu67  
       2022-01-12 10:47:47 +08:00
    其实我觉得, 不对路由做改动更好. 在守卫里面判断权限 /token, 然后做重定向即可. 这样可以避免在地址栏输入无权限的 url 时 404.
    walpurgis
        6
    walpurgis  
       2022-01-12 13:26:03 +08:00
    同建议不要动态路由,开发和 debug 都麻烦
    后端只下发权限,前端根据权限把路由配置过滤一遍生成菜单列表,分离模式下后端不应该知道前端路由
    jqtmviyu
        7
    jqtmviyu  
       2022-01-12 14:45:25 +08:00
    估计是因为还要开放一个路由权限控制页面给用户设置, 路由是存在数据库里的, 导航菜单由后端返回生成.
    shakaraka
        8
    shakaraka  
    PRO
       2022-01-12 14:46:05 +08:00
    路走错了。你这功能这么设计本身就有问题
    baolinliu442k
        9
    baolinliu442k  
       2024-11-17 22:10:41 +08:00
    @walpurgis 一语点醒,我一直在搞动态加载,坑太多了,这样还简单点
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5154 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 29ms UTC 07:13 PVG 15:13 LAX 23:13 JFK 02:13
    Do hve faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86