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

VUE如何前端控制及动态路由详细讲解

在Vue.js中,前端控制通常指的是通过Vue的响应式系统、组件化、路由、状态管理等技术来实现对前端应用的控制和管理

一、前端路由控制基础

使用 vue-router 管理路由,通过路由守卫和动态添加路由实现权限控制。

1. 安装和配置
npm install vue-router@4
//路由实例
const router = createRouter({
  history: createWebHashHistory(),
});

二、动态路由实现原理

根据用户权限动态生成路由表,通过 router.addRoute() 添加路由

1. 定义路由模板(静态+动态)
//基础路由
const baseRoutes = [
  {
    path: "/",
    name: "login",
    component: () => import("../views/login.vue"),
  },
  {
    path: "/totalTwo",
    component: () => import("../views/total/totalTwo.vue"),
    children: [],
  },
  {
    path: "/totalOne",
    component: () => import("../views/total/totalOne.vue"),
    children: [],
  },
  {
    path: "/home",
    name: "home",
    component: () => import("../views/home.vue"),
    meta: { title: "首页" },
  },
];
//=============== 动态路由配置
const dynamicRoutes = [
  {
    path: "/about",
    name: "about",
    component: () => import("../views/aboutPage.vue"),
    meta: { requiresAuth: true, permissions: ["2"] },
  },
  {
    path: "/dashboard",
    name: "Dashboard",
    component: () => import("../views/Dashboard.vue"),
    meta: { requiresAuth: true, permissions: ["1"] },
  },
];
console.log(dynamicRoutes, "全部路由");
// 路由实例
const router = createRouter({
  history: createWebHashHistory(),
  routes: [...baseRoutes, ...dynamicRoutes], // 初始化时合并路由  
});
2. 动态添加路由
  // 第一层循环:过滤有权限的路由
  const allowedRoutes = dynamicRoutes.filter((route) => {
    return store.permissions?.some((perm) =>
      route.meta.permissions.includes(perm)
    );
  });
  // 第二层循环:添加路由
  allowedRoutes.forEach((route) => {
    if (!router.hasRoute(route.name)) {
      // 删除parentRoute.name参数和path修改
      router.addRoute(route); // 直接添加为顶级路由
    }
  });
}

三、路由守卫实现权限控制

使用全局前置守卫验证权限

// router/index.js
router.beforeEach((to, from, next) => {
  const isAuthenticated = localStorage.getItem('token')
  
  // 需要登录但未登录
  if (to.meta.requiresAuth && !isAuthenticated) {
    next('/login')
  }
  
  // 已登录但访问/login
  else if (to.path === '/login' && isAuthenticated) {
    next('/dashboard')
  }
  
  // 检查路由权限
  else if (to.meta.role && !userRoles.includes(to.meta.role)) {
    next('/404') // 无权限页面
  }
  
  else {
    next()
  }
})

四、动态菜单生成

根据过滤后的路由生成导航菜单

<!-- 在侧边栏组件中 -->
<template>
  <div v-for="route in accessibleRoutes" :key="route.path">
    <router-link :to="route.path">{{ route.meta?.title }}</router-link>
    <div v-if="route.children">
      <!-- 递归处理子路由 -->
    </div>
  </div>
</template>

<script>
import { computed } from 'vue'
import { useRouter } from 'vue-router'

export default {
  setup() {
    const router = useRouter()
    const accessibleRoutes = computed(() => {
      return router.options.routes.filter(route => 
        !route.meta?.hidden && hasPermission(route)
    })
    return { accessibleRoutes }
  }
}
</script>

相关文章:

  • 日程公布| 第八届地球空间大数据与云计算前沿大会与集中学习(3号通知)
  • idea自动生成注释
  • 传奇类网游页游2.5D游戏场景地图素材Eagle库 沙漠沙海隔壁
  • Visual Studio | 性能探测器
  • Vscode 更换插件下载位置
  • 相机租赁网站基于Spring Boot SSM
  • 数据处理专题(四)
  • Java基础概念汇总
  • JavaScript 学习笔记
  • 【Yolov8部署】 VS2019+opencv-dnn CPU环境下部署目标检测模型
  • MyBatis--简单测试
  • arinc818 fpga单色图像传输ip
  • MySQL DQL,数据查询语言的用法
  • 小智机器人关键函数解析,Application::OutputAudio()处理音频数据的输出的函数
  • Unity LOD Group动态精度切换算法(基于视锥+运动速度)技术详解
  • 若依管理系统前后端不分离本地运行新手教学
  • 私域流量池的智能裂变:技术驱动下的流量融合新范式
  • SQLMesh系列教程:基于指标构建一致的分析语义层应用实践
  • 百度一面:SQL的执行顺序是怎样的?
  • SQL Server 2022 官方IOS 下载
  • dedecms做企业网站/免费合作推广
  • php做网站首页/百度数字人内部运营心法曝光
  • 城乡建设部统计网站/产品推广策划方案
  • 做英文简历的网站/自己建立网站步骤
  • 长辛店镇网站建设/2022年适合小学生的新闻
  • 门户网站开发需要多少钱/微博今日热搜榜