美文网首页
Vue 3 router addroute no match f

Vue 3 router addroute no match f

作者: 齐格Insight | 来源:发表于2024-08-10 10:31 被阅读0次

    问题背景

    在Vue 3,当我在后端添加一个新的动态路由时,会报no match found for location with path 这样的错误,前端也跳转到404页面去了。

    image.png

    明明增加了路由地址,如下,根路由为/eam,但这个 http://localhost/eam/list 路经就是报404

    image.png

    原因分析

    查看Vue 3 router部分的说明文档
    https://router.vuejs.org/guide/advanced/dynamic-routing#Adding-routes

    image.png
    你会发现当 name 名相同时,后面的路由会覆盖前端的路由。

    后端返回的二级跌幅地址 list 对应的路由名也是 list,后面(其他二级路径)有相同的路由地址,导致被覆盖而找不到。

    问题解决

    解决这个问题有两个思路,一个思路是修改这个二级路由地址 list 为别的。另一个思路是对后端返回的路由列表做修改,使得 name保持唯一。我采用第二种思路,因为二级目录很可能重复。

    代码如下:

    function keepNameUniq(menuArr) {
      if (!Array.isArray(menuArr) || menuArr.length == 0) {
        return;
      }
      const map = {}
      iterItem(map, menuArr)
    
      for (const [key, value] of Object.entries(map)) {
        if (value.length > 1) {
          for (let i = 0; i < value.length; i++) {
            value[i].name = value[i].name + '' + i
          }
        }
      }
    }
    
    function iterItem(map, menuArr) {
      menuArr.forEach(item => {
        if (item.name && item.name.length > 0) {
          if (map[item.name]) {
            const arr = map[item.name];
            arr.push(item)
          } else {
            map[item.name] = [item]
          }
        }
    
        if (item.children && item.children.length > 0) {
          iterItem(map, item.children)
        }
      })
    }
    

    调用处如下:


    image.png

    相关文章

      网友评论

          本文标题:Vue 3 router addroute no match f

          本文链接:https://www.haomeiwen.com/subject/ncnkkjtx.html