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

从列表页到详情页:手把手教你用Vue 3 + Router实现动态路由与参数传递(完整项目片段)

从列表页到详情页Vue 3动态路由实战指南在单页应用开发中列表到详情的跳转是最常见也最核心的交互模式之一。想象这样一个场景你正在开发一个电商后台系统商品列表中的每个卡片都需要点击后展示完整详情。传统多页应用会直接跳转新页面但在Vue生态中我们可以通过动态路由实现更优雅的无刷新体验。本文将带你从零实现一个包含参数传递、数据加载的完整流程特别针对Vue 3的Composition API进行优化设计。1. 项目初始化与路由配置首先确保已创建Vue 3项目并安装最新版Vue Routernpm install vue-router4在src/router/index.js中配置基础路由结构。动态路由的核心是在路径中使用冒号标记参数import { createRouter, createWebHistory } from vue-router const routes [ { path: /products, name: ProductList, component: () import(../views/ProductList.vue) }, { path: /products/:id, // 动态段以冒号开头 name: ProductDetail, component: () import(../views/ProductDetail.vue), props: true // 启用props解耦 } ] const router createRouter({ history: createWebHistory(), routes }) export default router关键配置说明配置项作用说明推荐值dynamic segment定义可变的路径部分:idprops将参数作为组件props接收truehistory mode保持URL清洁避免hashcreateWebHistory提示启用props: true后路由参数会以props形式传递给组件这是比直接访问route更解耦的做法2. 列表页跳转逻辑实现在列表组件中我们通常需要处理两种跳转方式script setup import { useRouter } from vue-router const router useRouter() const products ref([ { id: 101, name: 智能手表, price: 899 }, { id: 102, name: 无线耳机, price: 499 } ]) // 方法1直接传递路径 const navigateByPath (id) { router.push(/products/${id}) } // 方法2使用命名路由推荐 const navigateByName (product) { router.push({ name: ProductDetail, params: { id: product.id }, query: { from: list } // 可同时携带查询参数 }) } /script template ul li v-forproduct in products :keyproduct.id h3{{ product.name }}/h3 p¥{{ product.price }}/p !-- 两种跳转方式任选 -- button clicknavigateByName(product)查看详情/button /li /ul /template跳转方式对比路径跳转优点直观简单缺点硬编码路径重构困难命名路由优点通过name引用路径变更不影响逻辑建议中大型项目首选3. 详情页参数接收与数据加载详情页需要完成三个关键任务获取路由参数根据ID加载数据处理加载状态和错误script setup import { ref, onMounted } from vue import { useRoute } from vue-router import api from /api const props defineProps([id]) // 通过props接收参数 const route useRoute() // 备用方案 const product ref(null) const loading ref(false) const error ref(null) // 组合式函数封装数据加载逻辑 const fetchProduct async (id) { try { loading.value true const response await api.getProduct(id) product.value response.data } catch (err) { error.value err.message } finally { loading.value false } } onMounted(() { // 优先使用props.id其次使用route.params.id const targetId props.id || route.params.id if (targetId) fetchProduct(targetId) }) /script template div v-ifloading加载中.../div div v-else-iferror classerror{{ error }}/div div v-else-ifproduct classdetail h1{{ product.name }}/h1 div classmeta span产品ID: {{ product.id }}/span span价格: ¥{{ product.price }}/span /div p{{ product.description }}/p /div /template注意始终考虑参数不存在的情况添加适当的验证逻辑可以避免页面崩溃4. 高级技巧与性能优化4.1 路由守卫数据预加载在进入详情页前预先加载数据// router/index.js router.beforeEach(async (to) { if (to.name ProductDetail) { const id to.params.id try { await store.dispatch(fetchProduct, id) } catch (error) { return /404 // 跳转到错误页 } } })4.2 滚动行为控制让详情页返回列表时保持原先的滚动位置const router createRouter({ history: createWebHistory(), routes, scrollBehavior(to, from, savedPosition) { if (savedPosition) { return savedPosition } else { return { top: 0 } } } })4.3 组件级数据缓存使用keep-alive缓存列表页状态!-- App.vue -- router-view v-slot{ Component } keep-alive component :isComponent v-if$route.meta.keepAlive / /keep-alive component :isComponent v-if!$route.meta.keepAlive / /router-view路由配置中添加meta字段{ path: /products, name: ProductList, component: () import(../views/ProductList.vue), meta: { keepAlive: true } }5. 常见问题解决方案问题1刷新页面后参数丢失原因动态路由参数需要配合数据持久化解决方案// 在详情页添加参数验证 onMounted(() { if (!props.id !route.params.id) { router.push(/products) // 退回列表页 } })问题2相同路由参数变化不触发更新解决方案监听路由变化watch( () route.params.id, (newId) { if (newId) fetchProduct(newId) } )问题3SEO不友好解决方案使用SSR框架如Nuxt.js添加静态meta信息useHead({ title: product.value?.name || 产品详情, meta: [ { name: description, content: product.value?.description || } ] })在最近的一个后台管理系统项目中我们采用了命名路由props解耦的方案。当产品需求变更导致URL结构调整时只需修改路由配置而无需变动组件代码这大大降低了维护成本。特别是在团队协作中这种约定优于配置的方式让接口定义更加清晰。

相关文章:

从列表页到详情页:手把手教你用Vue 3 + Router实现动态路由与参数传递(完整项目片段)

从列表页到详情页:Vue 3动态路由实战指南 在单页应用开发中,列表到详情的跳转是最常见也最核心的交互模式之一。想象这样一个场景:你正在开发一个电商后台系统,商品列表中的每个卡片都需要点击后展示完整详情。传统多页应用会直接…...

从实验室到生产线:手把手教你用MSA搞定新设备验收和日常点检(附免费模板)

从实验室到生产线:手把手教你用MSA搞定新设备验收和日常点检(附免费模板) 在精密制造和质量控制领域,测量系统的可靠性直接决定了产品质量的可信度。想象一下:当三坐标测量机给出的数据偏差0.01mm,可能导致…...

题解:AtCoder AT_awc0021_e Field Watering Plan

本文分享的必刷题目是从蓝桥云课、洛谷、AcWing等知名刷题平台精心挑选而来,并结合各平台提供的算法标签和难度等级进行了系统分类。题目涵盖了从基础到进阶的多种算法和数据结构,旨在为不同阶段的编程学习者提供一条清晰、平稳的学习提升路径。 欢迎大家订阅我的专栏:算法…...

ViGEmBus虚拟手柄驱动:终极Windows游戏控制器兼容性解决方案

ViGEmBus虚拟手柄驱动:终极Windows游戏控制器兼容性解决方案 【免费下载链接】ViGEmBus Windows kernel-mode driver emulating well-known USB game controllers. 项目地址: https://gitcode.com/gh_mirrors/vi/ViGEmBus 还在为Windows游戏手柄兼容性问题而…...

终极指南:如何快速实现esbuild Docker化与容器环境构建优化

终极指南:如何快速实现esbuild Docker化与容器环境构建优化 【免费下载链接】esbuild An extremely fast bundler for the web 项目地址: https://gitcode.com/GitHub_Trending/es/esbuild esbuild作为一款超快速的Web打包工具,正在改变前端开发的…...

当硬盘“失忆“时:RecuperaBit如何从数据废墟中重建你的数字世界

当硬盘"失忆"时:RecuperaBit如何从数据废墟中重建你的数字世界 【免费下载链接】RecuperaBit A tool for forensic file system reconstruction. 项目地址: https://gitcode.com/gh_mirrors/re/RecuperaBit 你是否曾经历过这样的噩梦:硬…...

如何快速解决全志H6机顶盒网络问题:完整故障排除指南

如何快速解决全志H6机顶盒网络问题:完整故障排除指南 【免费下载链接】amlogic-s9xxx-armbian Supports running Armbian on Amlogic, Allwinner, and Rockchip devices. Support a311d, s922x, s905x3, s905x2, s912, s905d, s905x, s905w, s905, s905l, rk3588, r…...

35-Java 多态

Java 多态 在本教程中,我们将通过示例学习多态,不同类型的多态以及如何在Java中实现它们。 多态是面向对象编程的重要概念。它只是意味着不止一种形式。也就是说,同一实体(方法,运算符或对象)在不同情况下…...

object-fit-images 的未来发展:从 polyfill 到现代 CSS 的平滑过渡

object-fit-images 的未来发展:从 polyfill 到现代 CSS 的平滑过渡 【免费下载链接】object-fit-images 🗻 Polyfill object-fit/object-position on : IE9, IE10, IE11, Edge, Safari, ... 项目地址: https://gitcode.com/gh_mirrors/ob/object-fit-i…...

题解:AtCoder AT_awc0043_c Imbalance of the Organization

本文分享的必刷题目是从蓝桥云课、洛谷、AcWing等知名刷题平台精心挑选而来,并结合各平台提供的算法标签和难度等级进行了系统分类。题目涵盖了从基础到进阶的多种算法和数据结构,旨在为不同阶段的编程学习者提供一条清晰、平稳的学习提升路径。 欢迎大家订阅我的专栏:算法…...

终极游戏本性能控制:OmenSuperHub完全指南

终极游戏本性能控制:OmenSuperHub完全指南 【免费下载链接】OmenSuperHub 使用 WMI BIOS控制性能和风扇速度,自动解除DB功耗限制。 项目地址: https://gitcode.com/gh_mirrors/om/OmenSuperHub 想要彻底释放你的惠普OMEN游戏本隐藏性能吗&#xf…...

ComfyUI-FramePackWrapper深度解析:节点化视频生成架构与3大性能优化策略

ComfyUI-FramePackWrapper深度解析:节点化视频生成架构与3大性能优化策略 【免费下载链接】ComfyUI-FramePackWrapper 项目地址: https://gitcode.com/gh_mirrors/co/ComfyUI-FramePackWrapper ComfyUI-FramePackWrapper作为lllyasviel FramePack项目的Comf…...

Excel多文件批量查询完整指南:如何10分钟完成全天数据查找工作

Excel多文件批量查询完整指南:如何10分钟完成全天数据查找工作 【免费下载链接】QueryExcel 多Excel文件内容查询工具。 项目地址: https://gitcode.com/gh_mirrors/qu/QueryExcel 还在为海量Excel文件中的查找任务而头疼吗?QueryExcel——这款免…...

题解:AtCoder AT_awc0036_a Library Loan Management

本文分享的必刷题目是从蓝桥云课、洛谷、AcWing等知名刷题平台精心挑选而来,并结合各平台提供的算法标签和难度等级进行了系统分类。题目涵盖了从基础到进阶的多种算法和数据结构,旨在为不同阶段的编程学习者提供一条清晰、平稳的学习提升路径。 欢迎大家订阅我的专栏:算法…...

不同档位的降 AI 速度需求——30 分钟到 4 小时差在哪?

不同档位的降 AI 速度需求——30 分钟到 4 小时差在哪? 「我答辩还有 1 小时——能压住 AI 率吗?」 取决于你的档位。30% 起点 1 小时够;60% 起点不够;80% 起点远远不够。这一篇按 4 档拆解时间组成。 4 档时间需求总览 档位AI…...

如何用BilibiliDown实现高效B站视频批量下载:5分钟完全指南

如何用BilibiliDown实现高效B站视频批量下载:5分钟完全指南 【免费下载链接】BilibiliDown (GUI-多平台支持) B站 哔哩哔哩 视频下载器。支持稍后再看、收藏夹、UP主视频批量下载|Bilibili Video Downloader 😳 项目地址: https://gitcode.com/gh_mirr…...

让小爱音箱秒变AI助手:MiGPT项目完整配置指南

让小爱音箱秒变AI助手:MiGPT项目完整配置指南 【免费下载链接】mi-gpt 🏠 将小爱音箱接入 ChatGPT 和豆包,改造成你的专属语音助手。 项目地址: https://gitcode.com/GitHub_Trending/mi/mi-gpt 你是否曾对小爱音箱的"人工智障&q…...

object-fit-images 核心原理深度解析:从背景图到现代 CSS 的优雅降级

object-fit-images 核心原理深度解析:从背景图到现代 CSS 的优雅降级 【免费下载链接】object-fit-images 🗻 Polyfill object-fit/object-position on : IE9, IE10, IE11, Edge, Safari, ... 项目地址: https://gitcode.com/gh_mirrors/ob/object-fit…...

不同档位 AI 率对应的降 AI 工具单价——3.2 元到 8 元怎么选。

不同档位 AI 率对应的降 AI 工具单价——3.2 元到 8 元怎么选。 3.2 元 vs 4.8 元 vs 6 元 vs 8 元——降 AI 工具单价拉开近一倍。怎么选? 取决于你的档位。这一篇用 4 档 AI 率对应 4 档单价的速查表给完整决策依据。 4 档 AI 率 vs 4 档单价对应表 AI 率档位推…...

go-critic 代码风格检查:如何遵循 Go 最佳实践和编码规范

go-critic 代码风格检查:如何遵循 Go 最佳实践和编码规范 【免费下载链接】go-critic The most opinionated Go source code linter for code audit. 项目地址: https://gitcode.com/gh_mirrors/go/go-critic go-critic 是一款高度 opinionated 的 Go 源代码…...

别再只会用下载器了!手把手教你用Python解析.torrent文件,自己动手生成磁力链接

从.torrent到磁力链接:Python实战解析与转换指南 在数字资源共享领域,BitTorrent协议始终保持着独特的生命力。许多用户虽然熟悉如何使用客户端软件下载种子文件,却对背后的技术原理知之甚少。本文将带您深入.torrent文件内部,用P…...

Asahi Linux系统架构:深入理解Apple Silicon子系统工作原理

Asahi Linux系统架构:深入理解Apple Silicon子系统工作原理 【免费下载链接】docs Asahi Linux documentation 项目地址: https://gitcode.com/gh_mirrors/docs157/docs Asahi Linux是专为Apple Silicon芯片设计的开源操作系统项目,致力于在Apple…...

Unmanic入门指南:5分钟快速搭建你的首个媒体库优化系统

Unmanic入门指南:5分钟快速搭建你的首个媒体库优化系统 【免费下载链接】unmanic Unmanic - Library Optimiser 项目地址: https://gitcode.com/gh_mirrors/un/unmanic Unmanic是一款强大的媒体库优化工具,能帮助你自动处理和优化媒体文件&#x…...

Cadence IC5141保姆级教程:从反相器到与非门,手把手教你搞定CMOS数字电路仿真

Cadence IC5141实战指南:从反相器到逻辑门的CMOS设计全流程解析 在半导体设计领域,掌握Cadence Virtuoso IC5141就像获得了一把打开数字电路世界的金钥匙。不同于教科书上的理论推导,真实的CMOS设计过程充满了参数调优的艺术和仿真分析的技巧…...

如何快速掌握Label Studio前端测试自动化:Jest与React Testing Library完整指南

如何快速掌握Label Studio前端测试自动化:Jest与React Testing Library完整指南 【免费下载链接】label-studio Label Studio is a multi-type data labeling and annotation tool with standardized output format 项目地址: https://gitcode.com/GitHub_Trendin…...

5步掌握游戏帧率提升秘诀:DLSS Swapper智能图形增强文件管理全攻略

5步掌握游戏帧率提升秘诀:DLSS Swapper智能图形增强文件管理全攻略 【免费下载链接】dlss-swapper 项目地址: https://gitcode.com/GitHub_Trending/dl/dlss-swapper DLSS Swapper是一款专为游戏玩家设计的智能图形增强文件管理工具,它让您能够轻…...

终极指南:Label Studio前端状态管理进阶——从MobX到异步流程优化

终极指南:Label Studio前端状态管理进阶——从MobX到异步流程优化 【免费下载链接】label-studio Label Studio is a multi-type data labeling and annotation tool with standardized output format 项目地址: https://gitcode.com/GitHub_Trending/la/label-st…...

深度解析Zotero SciPDF插件的高性能学术文献自动下载架构设计与实战应用

深度解析Zotero SciPDF插件的高性能学术文献自动下载架构设计与实战应用 【免费下载链接】zotero-scipdf Download PDF from Sci-Hub automatically For Zotero7 项目地址: https://gitcode.com/gh_mirrors/zo/zotero-scipdf Zotero SciPDF是一款专为Zotero 7设计的高性…...

UVa 11853 Paintball

题目描述 你正在一个 100010001000 \times 100010001000 的正方形场地上玩彩弹游戏。场地上有若干对手躲在树后,每个对手位于 (x,y)(x, y)(x,y) 位置,并且可以朝任意方向发射彩弹,攻击范围为 rrr。如果你在移动过程中进入任何对手的攻击范围&…...

中文BERT全词掩码技术终极指南:10个关键要点让你彻底掌握AI理解中文的核心奥秘

中文BERT全词掩码技术终极指南:10个关键要点让你彻底掌握AI理解中文的核心奥秘 【免费下载链接】Chinese-BERT-wwm Pre-Training with Whole Word Masking for Chinese BERT(中文BERT-wwm系列模型) 项目地址: https://gitcode.com/gh_mirro…...