当前位置: 首页 > news >正文

vue工程中路由导致的循环依赖问题

vue工程中路由导致的循环依赖问题

  • 问题简述
  • 环境
    • router
    • routes
  • 问题原因分析
  • 解决方案

问题简述

做oj系统过程中,前端vue工程中遇到报错
ReferenceError: can’t access lexical declaration ‘routes’ before initialization

环境

  • vite
  • vue3
  • router中使用外部引入的routes数组

router

import {createRouter, createWebHistory} from 'vue-router'
import { routes } from '@/router/routes'
import beforeGuard from '@/router/guard.ts'


const router = createRouter({
  history: createWebHistory(),
  routes
})


/**
 * 路由前置守卫
 */
router.beforeEach(beforeGuard)

export default router

routes

import HomeView from '@/views/baseView/HomeView.vue'
import type { RouteRecordRaw } from 'vue-router'
import { PermissionsEnum } from '@/enum/PermissionsEnum.ts'
import QuestionManager from '@/views/question/QuestionManager.vue'
import DoAnswer from '@/views/question/DoAnswer.vue'
import AnswerQuestion from '@/views/question/AnswerQuestion.vue'
import QuestionSubmitView from '@/views/question-submit/question-submit-view.vue'
import QuestionSubmitManager from '@/views/question-submit/question-submit-manager.vue'

export const routes: RouteRecordRaw[] = [
  {
    path: '/',
    name: '首页',
    component: HomeView,
    meta: {
      permissions: [PermissionsEnum.UNLOGIN, PermissionsEnum.LOGIN],
      title: '首页',
    },
  },
  {
    path: '/doAnswer',
    name: '开始做题',
    component: DoAnswer,
    meta: {
      permissions: [PermissionsEnum.UNLOGIN, PermissionsEnum.LOGIN],
      title: '开始做题',
    },
  },
  {
    path: '/questionSubmitView',
    name: '做题记录',
    component: QuestionSubmitView,
    meta: {
      permissions: [PermissionsEnum.UNLOGIN, PermissionsEnum.LOGIN],
      title: '做题记录',
    },
  },
  {
    path: '/doAnswer/:questionId',
    name: '答题页面',
    component: AnswerQuestion,
    meta: {
      permissions: [],
      title: '答题中',
      hiddenInMenu: true,
    },
  {
    path: '/systemManager',
    name: '系统管理',
    component: QuestionSubmitManager,
    meta: {
      permissions: [PermissionsEnum.UNLOGIN, PermissionsEnum.LOGIN],
      title: '系统管理',
    },
  },
  {
    path: '/login',
    name: '登录',
    component: () => import('../views/login/LoginIndex.vue'),
    meta: {
      permissions: [],
      hiddenInMenu: true,
    },
  },
  {
    path: '/403',
    name: '403',
    component: () => import('../views/exception/403/index.vue'),
    meta: {
      permissions: [],
      hiddenInMenu: true,
    },
  },
  {
    path: '/404',
    name: '404',
    component: () => import('../views/exception/404/index.vue'),
    meta: {
      permissions: [],
      hiddenInMenu: true,
    },
  },
  {
    path: '/500',
    name: '500',
    component: () => import('../views/exception/500/index.vue'),
    meta: {
      permissions: [],
      hiddenInMenu: true,
    },
  },
  {
    path: '/:pathMatch(.*)*',
    redirect: '/404',
    meta: {
      hiddenInMenu: true,
    }
  },
]

问题原因分析

因为在DoAnswer中使用router跳转页面时使用 import router from ‘@/router’,导致产生循环依赖问题。即当router需要初始化时需要导入DoAnswer组件,但是DoAnswer组件中要使用路由,又需要从@/router中导入router实例,因此报错。

解决方案

在DoAnswer组件中使用 const user = useRouter() 方法获取路由实例对象

<script setup lang="ts">
import { onMounted, type Ref, ref } from 'vue'
import { useRouter } from 'vue-router'

// 搜索表单Ref对象
const searchFormRef = ref()

// 路由
const router = useRouter();
</script>
<template>
<button @click="router.push('/home')">跳转</button>
</template>
<style></style>

相关文章:

  • 使用 IP 代理改 IP 后注意事项如何防封号
  • OpenCV 进阶实战与技巧——图像处理的全面解析
  • Spring MVC 获取请求头参数详解
  • 【HarmonyOS 5】敏感信息本地存储详解
  • 数据结构---B树
  • decompiled.class file bytecode version50(java 6)
  • 分页查询列表每页1000条的优化
  • day1 初识MySQL
  • 词袋模型和TF-IDF(数学公式推导、手动实现、调库使用、示例:使用词袋模型处理多个文档)详解
  • 【前端工程化】-【vue2-ele项目升级】
  • error: failed to run custom build command for `yeslogic-fontconfig-sys v6.0.0`
  • docker 安装 Gitlab
  • 【go】--编译
  • Android基础教程 - 学习完成记录
  • UI基础(1)
  • 【双指针】专题:LeetCode 1089题解——复写零
  • 202527 | RabbitMQ-基础 | 队列 | Direct + Fanout + Topic 交换机 | 消息转换器
  • linux系统安装docker及Qdrant
  • LeetCode 解题思路 38(前 K 个高频元素、数据流的中位数)
  • centos7 yum安装mysql8.0详细步骤(图文教程)
  • 金球看淡,不服就干!这是抬不起腿却昂着头的劳塔罗
  • 呼和浩特65户业主被一房两卖,十年诉讼却难胜
  • 欧盟官员:欧盟酝酿对美关税政策反制措施,包含所有选项
  • 这个五一假期,外贸拓内销好货和识货人在上海“双向奔赴”
  • 俄罗斯期望乌克兰在停火期间采取行动缓和局势
  • 2025年五一档电影票房破4亿,《水饺皇后》领跑