首页 > 其他分享 >vue-router解决警告:No match found for location with path "XXXXXXX"

vue-router解决警告:No match found for location with path "XXXXXXX"

时间:2023-04-21 20:05:22浏览次数:40  
标签:redirect vue const No XXXXXXX location router path 路由

  使用vue-router时,在刷新页面时往往会出现这个警告:

  

  这个问题产生的原因往往是因为vue在启动时,会校验当前页面的路由,而我们使用vue-router时,是在导航守卫中动态添加路由的,因此肯定找不到,而这个时候还没进入守卫,自然就会抛出这个警告了:  

    1、app.use(router)
    2、router.install(app)
    3、push(routerHistory.location)
    4、pushWithRedirect(to)
    5、resolve(to)

  resolve函数部分代码如下:  

    function resolve(rawLocation, currentLocation) {
        // const objectLocation = routerLocationAsObject(rawLocation)
        // we create a copy to modify it later
        currentLocation = assign({}, currentLocation || currentRoute.value);
        if (typeof rawLocation === 'string') {
            const locationNormalized = parseURL(parseQuery$1, rawLocation, currentLocation.path);
            const matchedRoute = matcher.resolve({ path: locationNormalized.path }, currentLocation);
            const href = routerHistory.createHref(locationNormalized.fullPath);
            if ((process.env.NODE_ENV !== 'production')) {
                if (href.startsWith('//'))
                    warn(`Location "${rawLocation}" resolved to "${href}". A resolved location cannot start with multiple slashes.`);
                else if (!matchedRoute.matched.length) {
                    warn(`No match found for location with path "${rawLocation}"`);
                }
            }
            // locationNormalized is always a new object
            return assign(locationNormalized, matchedRoute, {
                params: decodeParams(matchedRoute.params),
                hash: decode(locationNormalized.hash),
                redirectedFrom: undefined,
                href,
            });
        }
        
        //省略...
    }

  其中rawLocation就是routerHistory.location,其实就是location.pathname+location.search+location.hash,因为路由是在守卫中动态添加的,这里matcher.resolve自然就匹配不到路由了,因为此时项目才启动,还没进入守卫中。

  虽然这个可能不会对我们的功能有什么大的影响,但是我们还是可以从根本上处理掉它,让我们应用更加完善。

  解决办法

  这个问题的一个解决思路:  

    1、创建router时,添加一个全局的路由,一般可以取名为404,表示没有匹配到路由
    2、当页面刷新时,resolve函数中matcher.resolve未匹配到正确路由时,就会匹配到这个404的路由
    3、因为有匹配到路由,所以就不会有警告,接着进入守卫
    4、在守卫中从后端获取数据,动态构建路由
    5、然后对404路由的路由进行重定向

  1、添加404路由:  

  // 静态路由
  export const constantRouterMap = [
    {
      name: 'root',
      path: '/',
      redirect: '/welcome',
      component: AppLayout,
      children: [
        {
          path: 'welcome',
          name: 'welcome',
          component: () => import(`@/views/welcome/index.vue`),
          meta: {
            title: 'Welcome'
          }
        }
      ]
    },
    {
      name: '404',
      path: '/:catchAll(.*)',
      component: () => import(`@/views/error/404.vue`)
    }
  ]
  
  const router = createRouter({
  	history: createWebHistory(process.env.BASE_URL),
  	routes: constantRouterMap
  })

  2、守卫中假如判断  

  // 进入路由前的过滤器
  router.beforeEach((to, from, next) => {
  
    //省略其它代码...
  
    //判断是否登录
    const token = getToken()
    if (token) {
      const routes = getRoutes()
      //路由是否存在
      if (!routes) {
        //不存在则从远程获取
        getUserInfo().then(res => {
          //创建路由routes
  
          // 动态添加可访问路由表
          routes.forEach(r => {
            router.addRoute(r)
          })
  
          //表示要做一次重定向
          if (to.name === '404') {
            next({ path: to.path, query: to.query })
          } else {
            // 请求带有 redirect 重定向时,登录自动重定向到该地址
            if (from.query.redirect) {
              const redirect = decodeURIComponent(from.query.redirect)
              next({ path: redirect })
            } else {
              next({ ...to, replace: true })
            }
          }
  
          //省略其它代码...
        })
      } else { //存在则跳过
  
        //省略其它代码...
  
        next()
      }
    } else {
      next({ name: 'login', query: { redirect: to.fullPath } })
    }
    
    //省略其它代码...
  })

   这样,刷新页面警告也不会出现了 

 

标签:redirect,vue,const,No,XXXXXXX,location,router,path,路由
From: https://www.cnblogs.com/shanfeng1000/p/17284240.html

相关文章

  • Vue:表单双绑、组件
    vue一大精髓就是双向绑定vue.js是一个mvvm框架,即数据的双向绑定,即当数据发生变化时的时候,视图也就发生变化,当视图发生变化时,数据也会同步变化双向绑定是对于UI控件来说的,非UI控件不会涉及到数据的双向绑定以input标签举例<divid="app">输入的文本:<inputtype="text"v-......
  • WebStorm 2023.1 vue文件标签中变量无法识别 Unresolved variable or type
    从老版本WebStorm升级到 WebStorm2023.1之后,打开项目莫名爆红 可能是查询的不对,很多博客指明是依赖的问题,实际修改无效问题出在文件类型指向不对修改为: 问题解决 ......
  • Vite + Vue3 +TS 项目搭建
    安装nvm略安装node略使用Vite创建项目vite3.x文档:https://cn.vitejs.dev/guide/#scaffolding-your-first-vite-project使用NPM:$npmcreatevite@latest使用Yarn:$yarncreatevite使用PNPM:$pnpmcreatevite然后直接进入项目初始化的选择,自定义一些......
  • VUE上传图片
    1<!--2气味照相机,上传图片3-->4<template>5<divclass="main_container">6<divclass="bgimg_box":style="'background-image:url('+bgImg+');'">7<d......
  • bug|初始化项目|sass-loader报错:TypeError: this.getResolve is not a function at Ob
    Modulebuildfailed:TypeError:this.getResolveisnotafunctionatObject.loader的解决npmuninstallsass-loader(卸载当前版本)[email protected]......
  • meta seg_anything and grounding_dino
    https://github.com/IDEA-Research/GroundingDINOhttps://github.com/facebookresearch/segment-anything......
  • 动力节点⑤章 vuex——vue视频笔记
    5Vuex5.1vuex概述vuex是实现数据集中式状态管理的插件。数据由vuex统一管理。其它组件都去使用vuex中的数据。只要有其中一个组件去修改了这个共享的数据,其它组件会同步更新。一定要注意:全局事件总线和vuex插件的区别:全局事件总线关注点:组件和组件之间数据如何传递,一个绑定$......
  • 使用PhantomJS解决VUE项目无法被百度收录
    一、安装PhantomJS安装文章:https://www.cnblogs.com/robots2/p/17340143.html二、编写脚本spider.js//spider.js'usestrict';console.log('=====start=====');//单个资源等待时间,避免资源加载后还需要加载其他资源varresourceWait=500;varresourceWaitTimer;/......
  • 读书笔记 - 《Monolith to Microservices》
    如果你的产品目前是B/S或者C/S架构,想要考虑重构成微服务,这本书绝对是一个很好的参考,作者通过自己的实践经历,详述了以下几个方面:不要因为别人都做微服务,你就想要把自己的系统转成微服务,首先需要分析自己系统碰到的问题,找到最适合的解决办法,微服务不是万能的,不能解决所有问题考虑......
  • vue下拉框选择后不显示值,选其他下拉框后才显示出来
    vue下拉框选择后不显示值,选其他下拉框后才显示出来 vue也太坑了解决方法:为该el-select添加change事件中使用$set来对属性赋值,如下:changeData(val){ this.$set(this.formData,this.formData.id,val.value)}......