解决Vue报错:Uncaught (in promise) NavigationDuplicated: Avoided redundant navigation to current location...

这篇具有很好参考价值的文章主要介绍了解决Vue报错:Uncaught (in promise) NavigationDuplicated: Avoided redundant navigation to current location...。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、重复点击导航时,控制台出现报错 ,虽然不影响功能使用,但也不能坐视不管。

解决Vue报错:Uncaught (in promise) NavigationDuplicated: Avoided redundant navigation to current location...,vue.js,javascript,前端,ecmascript,前端框架

解决方案:

方案一:只需在 router 文件夹下,添加如下代码:
import Vue from 'vue'
import VueRouter from 'vue-router'
import Home from '@/views/Home'
import Main from '@/views/Main'
import User from '@/views/User'
Vue.use(VueRouter)

// 0. 如果使用模块化机制编程,导入Vue和VueRouter,要调用 Vue.use(VueRouter)
// 1. 定义 (路由) 组件。
// 可以从其他文件 import 进来

// 2. 定义路由
// 每个路由应该映射一个组件。 其中"component" 可以是
// 通过 Vue.extend() 创建的组件构造器,
// 或者,只是一个组件配置对象。
// 我们晚点再讨论嵌套路由。
const routes = [
  // //主路由
  {
    path: '/',
    component: Main,
    redirect:"home",
    children: [//子路由,嵌套路由
      {
        path: 'home',
        component: Home
      },
      {
        path: 'user',
        component: User
      },
      {
        path: "/acl/user",
        name: "user",
        title: "用户管理",
        icon: "setting",
        component: () => import("@/views/acl/user/List.vue"),
      },
      {
        path: "/acl/role",
        name: "role",
        title: "角色管理",
        icon: "setting",
        component: () => import("@/views/acl/role/List.vue"),
      },
      {
        path: "/acl/menu",
        name: "menu",
        title: "菜单管理",
        icon: "setting",
        component: () => import("@/views/acl/menu/List.vue"),
      }
      // ,
      // {
      //   title: "权限管理",
      //   icon: "s-order",
      //   name: "/acl",
      //   path: '/acl',
      //   children: [
      //     {
      //       path: "/user1",
      //       name: "user",
      //       title: "用户管理",
      //       icon: "setting",
      //       component: () => import("@/views/acl/user/List.vue"),
      //     },
      //     {
      //       path: "/acl/role",
      //       name: "role",
      //       title: "角色管理",
      //       icon: "setting",
      //       component: () => import("@/views/acl/role/List.vue"),
      //     },
      //     {
      //       path: "/acl/menu",
      //       name: "menu",
      //       title: "菜单管理",
      //       icon: "setting",
      //       component: () => import("@/views/acl/menu/List.vue"),
      //     },
      //   ],
      // },
    ]
  },



]

// 3. 创建 router 实例,然后传 `routes` 配置
// 你还可以传别的配置参数, 不过先这么简单着吧。
const router = new VueRouter({
  routes // (缩写) 相当于 routes: routes
})

// 4. 创建和挂载根实例。(在main.js里继续挂载)
// 记得要通过 router 配置参数注入路由,
// 从而让整个应用都有路由功能

// 解决重复点击导航时,控制台出现报错
const VueRouterPush = VueRouter.prototype.push
VueRouter.prototype.push = function push (to) {
  return VueRouterPush.call(this, to).catch(err => err)
}
 
export default router
方案二、使用 catch 方法捕获 router.push 异常。
this.$router.push(route).catch(err => {
  console.log('输出报错',err)
})
方案三、在跳转时,判断是否跳转路由和当前路由是否一致,避免重复跳转产生问题。

index路由文件

import Vue from 'vue'
import VueRouter from 'vue-router'
import Home from '@/views/Home'
import Main from '@/views/Main'
import User from '@/views/User'
Vue.use(VueRouter)

// 0. 如果使用模块化机制编程,导入Vue和VueRouter,要调用 Vue.use(VueRouter)
// 1. 定义 (路由) 组件。
// 可以从其他文件 import 进来

// 2. 定义路由
// 每个路由应该映射一个组件。 其中"component" 可以是
// 通过 Vue.extend() 创建的组件构造器,
// 或者,只是一个组件配置对象。
// 我们晚点再讨论嵌套路由。
const routes = [
  // //主路由
  {
    path: '/',
    component: Main,
    redirect:"home",
    children: [//子路由,嵌套路由
      {
        path: 'home',
        component: Home
      },
      {
        path: 'user',
        component: User
      },
      {
        path: "/acl/user",
        name: "user",
        title: "用户管理",
        icon: "setting",
        component: () => import("@/views/acl/user/List.vue"),
      },
      {
        path: "/acl/role",
        name: "role",
        title: "角色管理",
        icon: "setting",
        component: () => import("@/views/acl/role/List.vue"),
      },
      {
        path: "/acl/menu",
        name: "menu",
        title: "菜单管理",
        icon: "setting",
        component: () => import("@/views/acl/menu/List.vue"),
      }
      // ,
      // {
      //   title: "权限管理",
      //   icon: "s-order",
      //   name: "/acl",
      //   path: '/acl',
      //   children: [
      //     {
      //       path: "/user1",
      //       name: "user",
      //       title: "用户管理",
      //       icon: "setting",
      //       component: () => import("@/views/acl/user/List.vue"),
      //     },
      //     {
      //       path: "/acl/role",
      //       name: "role",
      //       title: "角色管理",
      //       icon: "setting",
      //       component: () => import("@/views/acl/role/List.vue"),
      //     },
      //     {
      //       path: "/acl/menu",
      //       name: "menu",
      //       title: "菜单管理",
      //       icon: "setting",
      //       component: () => import("@/views/acl/menu/List.vue"),
      //     },
      //   ],
      // },
    ]
  },



]

// 3. 创建 router 实例,然后传 `routes` 配置
// 你还可以传别的配置参数, 不过先这么简单着吧。
const router = new VueRouter({
  routes // (缩写) 相当于 routes: routes
})

// 4. 创建和挂载根实例。(在main.js里继续挂载)
// 记得要通过 router 配置参数注入路由,
// 从而让整个应用都有路由功能

// 解决重复点击导航时,控制台出现报错
// const VueRouterPush = VueRouter.prototype.push
// VueRouter.prototype.push = function push (to) {
//   return VueRouterPush.call(this, to).catch(err => err)
// }
 
export default router

菜单组件

<template>
  <div class="hello">
    <!-- <el-radio-group v-model="isCollapse" style="margin-bottom: 20px">
      <el-radio-button :label="false">展开</el-radio-button>
      <el-radio-button :label="true">收起</el-radio-button>
    </el-radio-group> -->

    <el-menu
      default-active="1-4-1"
      class="el-menu-vertical-demo"
      @open="handleOpen"
      @close="handleClose"
      :collapse="isCollapse"
      background-color="#545c64"
      text-color="#fff"
      active-text-color="#ffd04b"
    >
      <!-- 循环菜单数据 -->
      <label v-for="item in menuData" :key="item.name">
        <!-- 判断是否有子菜单,如果有就创建submenu,没有就创建menu-item -->
        <el-submenu
          :index="item.name"
          v-if="item.children"
          @click="clickMenu(item)"
        >
          <template slot="title">
            <i :class="`el-icon-${item.icon}`"></i>
            <span>{{ item.title }}</span>
          </template>
          <label>
            <!-- 自己调用自己 -->
            <CommonAsideMenuTRee
              :menuData="item.children"
            ></CommonAsideMenuTRee>
          </label>
        </el-submenu>
        <el-menu-item v-else :index="item.name" @click="clickMenu(item)">
          <template slot="title">
            <i :class="`el-icon-${item.icon}`"></i>
            <span>{{ item.title }}</span>
          </template>
        </el-menu-item>
      </label>
      <!-- <el-menu-item
        v-for="item in noChildren"
        :key="item.name"
        index="item.name"
      >
        <i :class="`el-icon-${item.icon}`"></i>
        <span slot="title">{{ item.label }}</span>
      </el-menu-item>

      <el-submenu
        v-for="item in hasChildren"
        :key="item.name"
        index="item.name"
      >
        <template slot="title">
          <i :class="`el-icon-${item.icon}`"></i>
          <span slot="title">{{ item.label }}</span>
        </template>
        <el-menu-item-group v-for="child in item.children" :key="child.name">
          <el-menu-item index="child.name">{{ child.label }}</el-menu-item>
        </el-menu-item-group>
      </el-submenu>   -->
    </el-menu>
  </div>
</template>

<script>
import CommonAsideMenuTRee from "@/components/CommonAsideMenuTRee.vue";
export default {
  name: "CommonAsideMenuTRee",
  components: {
    CommonAsideMenuTRee,
  },
  props: {
    menuData: {
      type: Array,
    },
  },
  data() {
    return {
      isCollapse: false,
      menuList1: [
        {
          path: "/user",
          name: "user",
          label: "用户管理",
          icon: "user",
          url: "UserManage/UserManage",
        },
        {
          path: "/",
          name: "Main",
          label: "首页",
          icon: "s-home",
          url: "Main/Main",
        },
        {
          label: "权限管理",
          icon: "s-order",
          name: "acl",
          component: "",
          path: "",
          children: [
            {
              path: "/acl/user",
              name: "user",
              label: "用户管理",
              icon: "setting",
              component: () => import("@/views/acl/user/List.vue"),
            },
            {
              path: "/acl/role",
              name: "role",
              label: "角色管理",
              icon: "setting",
              component: () => import("@/views/acl/role/List.vue"),
            },
            {
              path: "/acl/menu",
              name: "menu",
              label: "菜单管理",
              icon: "setting",
              component: () => import("@/views/acl/menu/List.vue"),
            },
          ],
        },
      ],
    };
  },
  computed: {
    //没有子菜单
    noChildren() {
      return this.menuList.filter((item) => !item.children);
    },
    //有子菜单
    hasChildren() {
      return this.menuList.filter((item) => {
        return item.children;
      });
    },
  },
  methods: {
    handleOpen(key, keyPath) {
      console.log(key, keyPath);
    },
    handleClose(key, keyPath) {
      console.log(key, keyPath);
    },
    //点击菜单,路由跳转
    clickMenu(item) {
      console.log("this.$route.path ==== " +this.$route.path);
      console.log("item.path =========== "+ item.path);
      console.log("-------------------------------------------------");
      // 判断是否跳转路由和当前路由是否一致,避免重复跳转产生问题
      // 当页面的路由和跳转的路由不一致才跳转
      if(this.$route.path !== item.path && !(this.$route.path === '/home' && item.path === '/')){
        this.$router.push(item.path)
      }
  
    },
  },
};
</script>

<!-- Add "scoped" attribute to limit CSS to this component only -->
<style lang="less" scoped>
.el-menu {
  // height: 100vh;
  border-right: none;
}
</style>

修改后的截图

解决Vue报错:Uncaught (in promise) NavigationDuplicated: Avoided redundant navigation to current location...,vue.js,javascript,前端,ecmascript,前端框架文章来源地址https://www.toymoban.com/news/detail-584203.html

到了这里,关于解决Vue报错:Uncaught (in promise) NavigationDuplicated: Avoided redundant navigation to current location...的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • vue3+vue-router4:报错Uncaught (in promise) Error: Invalid navigation guard

    报错图示: Error: Invalid navigation guard Uncaught (in promise) Error: Invalid navigation guard 错误影响描述: 配置开发、测试、生产时候,因为是公众号,所以想在开发环境下免鉴权,不走微信获取openid接口,pinia中定义好openid直接进入项目,遂遇此问题。 因为在async和await中使用,导致n

    2024年02月17日
    浏览(35)
  • 【vue】Vue-Router报错:Uncaught (in promise)Error: Navigation cancelled from “/“ to “/1“ with a new navig

    一、问题: 二、分析: 该错误是因为vue-router的内部 没有对编程式导航进行catch处理 ,所以在使用 this.$router.push() 和 this.$router.replace 进行路由跳转时,往同一地址跳转时或者在跳转的 mounted/activated 等函数中再次向其他地址跳转时会出现报错。但是在3.1.0版本及更高版本中,

    2024年02月04日
    浏览(45)
  • 解决小程序启动后页面报错:Uncaught (in promise) env: Windows,mp,1.06.2209190; lib: 2.26.2

    小程序项目构建成功后启动,报错信息如下,很烦恼,没有具体的报错信息 WAServiceMainContext.js?t=wechats=1666321259431v=2.26.2:1 Uncaught (in promise) env: Windows,mp,1.06.2209190; lib: 2.26.2   查了微信官方文档后解决了,过程如下: 微信开发者中心-链接地址 

    2024年02月13日
    浏览(27)
  • Uncaught (in promise)解决方法

    \\\"Uncaught (in promise)\\\" 是 JavaScript 的一种错误,通常是在执行 Promise 时发生的。解决方法可能有以下几种: 在 catch 块中处理错误。例如:

    2024年02月16日
    浏览(39)
  • ❤ 报`Uncaught (in promise)`错误解决办法

    使用了promise,但是在使用的过程中报Uncaught (in promise)错误,第一次遇到这种错误,记录下,方便以后解决 ❤ 问题: ❤ 解决: 后面加上new Promise((resolve, reject) ={}).catch((e) = {}),就不会报错了

    2024年02月07日
    浏览(50)
  • 报`Uncaught (in promise)`错误解决办法

    使用了promise,但是在使用的过程中报 Uncaught (in promise) 错误,第一次遇到这种错误,所以在此记录下,方便以后解决问题 只要在 new Promise 后面加上 new Promise((resolve, reject) ={}).catch((e) = {}) ,就不会报错了 有收获?希望老铁们来个三连击,给更多的同学看到这篇文章 1、老铁们,

    2024年02月11日
    浏览(50)
  • 成功解决NavigationDuplicated: Avoided redundant navigation to current location:

    这个问题的原因主要是处在当前路由,点击跳转还是到当前路由导致的。 解决方法如下: 方法一:在router文件夹的index.js文件下加入下面代码:    要是当前问题还没解决,可在点击重复路由跳转的地方写成这样来捕获异常:   this.$router.push({ name: \\\"video\\\", query: { periodId: this

    2024年02月05日
    浏览(26)
  • JS报错Uncaught (in promise) TypeError: (intermediate value).format is not a function

    出现“date.format is not a function”错误是因为格式方法未在 JavaScript 中实现。 意思是说Format不是一个方法。去查了一下,发现是javascript已经去掉此方法了,要使用的话,需要添加第三方库。 要解决该错误,需要使用第三方包来格式化我们的日期,例如 moment 或 date-fns。 再或者

    2024年02月17日
    浏览(39)
  • 解决:Uncaught (in promise) Error: Request failed with status code 400

    问题: 在写项目的时候,获取三级联动的数据,一直报以下错误 定位问题: 这个错误信息可能与在前端调用接口时存在问题有关。 400 (Bad Request) 错误可能是由于请求参数不正确或者缺少必要参数导致的。 具体指向: 这个错误信息中指定了一个URL,即 http://localhost:9528/dev-

    2024年02月08日
    浏览(27)
  • vue3 vite Uncaught (in promise) ReferenceError: Cannot access ‘xx‘ before initialization

    Uncaught (in promise) ReferenceError: Cannot access \\\'BasicForm\\\' before initialization这是 组件之间出现循环引用时导致,我们可以通过异步组件: defineAsyncComponent解决, 在VUE3的官网:https://cn.vuejs.org/guide/components/async.html#basic-usage。 直接引用官网提供的异步组件( defineAsyncComponent ),写法多种。以

    2024年02月12日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包