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

Vue Router 核心知识汇总

Vue Router 是 Vue3 官方路由管理器,负责页面跳转、路由参数传递、权限控制等核心功能,也是 CRM 系统 “多页面结构” 的基础。结合你之前关注的Pinia + onActivated,下面从「核心定位→基础用法→高级实战→与 Pinia/onActivated 协同」全维度讲解,贴合 CRM 开发场景。

一、核心定位(CRM 开发中为什么必须用?)

CRM 系统本质是 “多页面业务系统”(登录页、工作台、订单列表、订单详情、客户管理等),Vue Router 解决的核心问题:

  1. 页面跳转:比如登录后跳工作台、点击订单跳详情页;
  2. 路由传参:比如订单详情页通过路由获取orderId
  3. 权限控制:比如未登录用户禁止访问工作台、不同角色访问不同页面;
  4. 页面缓存:配合KeepAlive实现列表页缓存(结合onActivated刷新)。

二、基础用法(快速上手)

1. 安装与全局注册

bash

运行

# 安装(Vue3 对应 router@4) npm install vue-router@4

typescript

运行

// src/router/index.ts(路由入口) import { createRouter, createWebHistory } from 'vue-router'; import Login from '@/views/Login.vue'; import Dashboard from '@/views/Dashboard.vue'; import OrderList from '@/views/OrderList.vue'; import OrderDetail from '@/views/OrderDetail.vue'; // 定义路由规则 const routes = [ { path: '/', // 默认路由 redirect: '/login' // 重定向到登录页 }, { path: '/login', name: 'Login', // 命名路由(用于 KeepAlive 缓存) component: Login }, { path: '/dashboard', name: 'Dashboard', component: Dashboard, meta: { requiresAuth: true } // 标记:需要登录才能访问 }, { path: '/orders', name: 'OrderList', component: OrderList, meta: { requiresAuth: true, keepAlive: true } // 需要登录 + 缓存组件 }, { path: '/orders/:id', // 动态路由参数(订单ID) name: 'OrderDetail', component: OrderDetail, meta: { requiresAuth: true }, props: true // 把路由参数映射为组件 props(可选) } ]; // 创建路由实例 const router = createRouter({ history: createWebHistory(import.meta.env.BASE_URL), // HTML5 历史模式 routes }); // 全局注册(src/main.ts) import { createApp } from 'vue'; import { createPinia } from 'pinia'; import App from './App.vue'; import router from './router'; const app = createApp(App); app.use(createPinia()); app.use(router); app.mount('#app');

2. 路由出口(App.vue)

vue

<template> <!-- 路由出口:渲染匹配的组件 --> <router-view v-slot="{ Component }"> <!-- 缓存指定组件(结合 keepAlive 标记) --> <keep-alive :include="['OrderList', 'Dashboard']"> <component :is="Component" /> </keep-alive> </router-view> </template>

3. 组件中使用路由(跳转 / 传参)

(1)基础跳转(比如登录页跳工作台)

vue

<script setup lang="ts"> import { useRouter } from 'vue-router'; import { useUserStore } from '@/stores/user'; const router = useRouter(); const userStore = useUserStore(); const handleLogin = async () => { await userStore.login(loginForm.value); // 跳转到工作台 router.push('/dashboard'); // 或用命名路由(推荐,避免硬编码路径) // router.push({ name: 'Dashboard' }); }; </script>
(2)动态路由传参(列表页跳详情页)

vue

<!-- OrderList.vue --> <script setup lang="ts"> import { useRouter } from 'vue-router'; const router = useRouter(); // 点击订单跳详情页,传递 orderId const handleGoDetail = (orderId: string) => { // 方式1:路径传参 router.push(`/orders/${orderId}`); // 方式2:命名路由 + 参数(推荐) // router.push({ name: 'OrderDetail', params: { id: orderId } }); }; </script>
(3)详情页接收参数

vue

<!-- OrderDetail.vue --> <script setup lang="ts"> import { useRoute } from 'vue-router'; import { onMounted } from 'vue'; import { useOrderStore } from '@/stores/order'; const route = useRoute(); const orderStore = useOrderStore(); // 方式1:直接读取路由参数 const orderId = route.params.id as string; // 方式2:通过 props 接收(路由配置中开启 props: true) // const props = defineProps<{ id: string }>(); // const orderId = props.id; // 加载订单详情 onMounted(() => { orderStore.fetchOrderDetail(orderId); }); </script>

三、高级实战(CRM 核心需求)

1. 路由守卫(权限控制)

CRM 最核心的路由需求是 “权限控制”(未登录禁止访问、不同角色访问不同页面),通过「全局前置守卫」实现:

typescript

运行

// src/router/index.ts import { useUserStore } from '@/stores/user'; // 全局前置守卫:跳转前验证权限 router.beforeEach((to, from, next) => { const userStore = useUserStore(); // 判断目标页面是否需要登录 if (to.meta.requiresAuth && !userStore.isLogin) { // 未登录:跳登录页,并记录目标页面(登录后跳转回去) next({ path: '/login', query: { redirect: to.fullPath } }); } else { // 已登录:判断角色权限(比如 admin 才能访问设置页) if (to.path === '/settings' && userStore.userInfo.role !== 'admin') { next('/dashboard'); // 无权限:跳工作台 } else { next(); // 放行 } } }); // 登录页跳转回原目标页面(Login.vue) const handleLogin = async () => { await userStore.login(loginForm.value); // 获取跳转前的目标页面,默认跳工作台 const redirect = route.query.redirect as string || '/dashboard'; router.push(redirect); };

2. 与 Pinia + onActivated 协同(CRM 核心组合)

这是你最关心的点,结合三者实现 “缓存 + 刷新 + 数据一致”:

vue

<!-- OrderList.vue(订单列表页) --> <script setup lang="ts"> import { ref, onMounted, onActivated } from 'vue'; import { useRoute } from 'vue-router'; import { useOrderStore } from '@/stores/order'; const route = useRoute(); const orderStore = useOrderStore(); const searchKey = ref(''); // 封装刷新逻辑 const fetchOrderList = async () => { // 结合路由参数(比如筛选条件)+ Pinia 请求数据 const params = { searchKey: searchKey.value, page: route.query.page || 1 // 路由传分页参数 }; await orderStore.fetchOrderList(params); }; // 第一次渲染:初始化 onMounted(() => { fetchOrderList(); }); // 核心:从详情页返回时,触发刷新(组件已缓存) onActivated(() => { fetchOrderList(); }); </script>

3. 路由参数监听(筛选条件变化刷新)

CRM 列表页常通过路由参数传递筛选条件(比如?status=paid&page=1),监听参数变化刷新数据:

vue

<script setup lang="ts"> import { watch } from 'vue'; import { useRoute } from 'vue-router'; const route = useRoute(); // 监听路由参数变化(比如筛选条件、分页) watch( () => route.query, () => { fetchOrderList(); // 参数变化,重新请求数据 }, { immediate: true } // 初始化时执行一次 ); </script>

四、核心避坑点(CRM 开发常错)

1. 动态路由参数变化,组件不刷新

比如从/orders/1/orders/2,详情页不重新加载数据:

vue

<!-- 解决方案:监听路由参数变化 --> watch( () => route.params.id, (newId) => { orderStore.fetchOrderDetail(newId); // 重新加载新订单数据 }, { immediate: true } );

2. KeepAlive 缓存后,数据不刷新

解决方案:用onActivated替代onMounted做刷新逻辑(前面已讲)。

3. 路由守卫中使用 Pinia 注意点

路由守卫执行时,Pinia 可能还未初始化?→ 直接在守卫内调用useUserStore()即可(Pinia 支持延迟初始化)。

五、与 Pinia/onActivated 协同总结(核心逻辑)

表格

工具

核心职责

协同方式

Vue Router

页面跳转、路由传参、权限控制

1. 动态路由传参给组件(如 orderId);2. 路由参数传递筛选条件;3. 守卫控制页面访问权限

Pinia

全局数据存储、异步请求封装

1. 组件从 Pinia 读取数据;2. Action 封装请求逻辑;3. 权限判断依赖 Pinia 的用户状态

onActivated

缓存组件激活时刷新数据

1. 返回列表页时触发刷新;2. 刷新逻辑同步路由参数和 Pinia 数据

六、最终总结(CRM 开发最佳实践)

  1. 核心组合Vue Router(页面跳转/权限) + Pinia(全局数据) + onActivated(缓存刷新)是 CRM 开发的 “铁三角”,覆盖 100% 核心场景;
  2. 路由设计原则
    • 按业务模块拆分路由(/orders//customers//dashboard);
    • 动态路由传核心参数(如订单 ID),查询参数传筛选 / 分页条件;
    • 给需要缓存的页面加keepAlive标记,配合onActivated刷新;
  1. 权限控制:通过全局前置守卫 + Pinia 的用户状态,实现 “登录验证 + 角色权限” 双层控制;
  2. Mitt 定位:仅在 “跨页面 / 跨框架通信、纯 UI 动作触发” 等极特殊场景补位,核心场景完全不用。

这个 “铁三角” 组合是 Vue3 开发 CRM 系统的最优解,既保证了代码的规范性,又兼顾了用户体验(缓存 + 按需刷新),完全贴合你 “少用冗余工具、聚焦核心逻辑” 的开发思路。

http://www.jsqmd.com/news/736306/

相关文章:

  • Hitboxer:游戏玩家的键盘魔法师,解决方向键冲突的终极方案
  • AI智能体文件处理框架:从多格式解析到语义检索的工程实践
  • 2026年白砂岩厂家排行:地铺板厂家、外墙干挂生产厂家、山水纹砂岩厂家、拉丝面厂家、榉木纹砂岩厂家、火烧面厂家选择指南 - 优质品牌商家
  • 从零搭建到上手培训:PlayEdu开源版Docker部署后的10个必做设置(含学员批量导入技巧)
  • DV 工程架构中,多态(Polymorphism)的应用
  • 观察 Taotoken 在流量高峰期的请求路由与容灾表现
  • 别再瞎用Claude了!我花了半年调教出的顶级配置,效率直接降维打击
  • 软件工程师在TVA产业化浪潮中的角色定位与机遇(2)
  • 【VSCode 2026启动性能优化白皮书】:实测冷启提速317%,附官方未公开的5大内核级调优参数
  • 2026河北无人机表演品牌推荐榜:陕西无人机表演、专业无人机表演、四川无人机表演、安徽无人机表演、山东无人机表演选择指南 - 优质品牌商家
  • 2026年第二十三届五一数学建模竞赛题目B题 多工序协同作业问题-完整建模解析论文代码
  • MCP 2026动态沙箱隔离调整深度拆解(含ASM级指令重定向原理+eBPF Hook点清单)
  • Laravel 12 AI中间件设计全解析,深度解密OpenAI Rate Limit熔断、缓存穿透防护与成本追踪埋点
  • 2kW车载充电机Boost_PFC+全桥LLC两级式AC-DC变换器控制Psim仿真(Mathcad设计书+参考文献)
  • Midscene.js终极指南:5大核心优势解析,如何用AI视觉模型实现真正的跨平台UI自动化
  • ARM CCI-400 PMU架构与性能监控实战
  • Go 语言从入门到进阶 | 第 24 章:项目架构与设计模式
  • MCP 2026智能调度落地实录:从CPU/内存/网络三维动态建模到毫秒级资源再分配的7步闭环
  • 别再为多路输出头疼了!手把手教你用MATLAB搞定Flyback电源设计(附完整代码)
  • 别再死磕手册了!用Vivado 2023.1手把手配置Xilinx SRIO IP核(附Buffer深度选择避坑指南)
  • 【MCP 2026跨服务器编排终极指南】:20年架构老兵亲授5大避坑法则与3个生产级落地模板
  • 【Laravel 12+ AI集成终极指南】:从零部署LangChain+Llama3到生产级API,附12个已验证性能优化陷阱清单
  • 软件工程师在TVA产业化浪潮中的角色定位与机遇(4)
  • 你的AHT20数据老飘?可能是STM32 I2C时序没调对!一份超详细的调试笔记与避坑指南
  • 从ImageNet冠军到移动端:SENet中的SE模块如何用极小代价换大提升?
  • 使用 Taotoken 为 Ubuntu 上的自动化脚本集成多模型对话能力
  • 2026年5月阿里云怎么搭建OpenClaw/Hermes Agent?百炼token Plan配置详解教程
  • 为开源项目 OpenClaw 配置 Taotoken 作为其 AI 能力供应商
  • 为什么你的下一款小说阅读器必须是开源纯净的ReadCat?3个无法拒绝的理由
  • 视频推理中的自蒸馏技术与空间奖励优化