惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Recent Commits to openclaw:main
Recent Commits to openclaw:main
Cisco Talos Blog
Cisco Talos Blog
S
SegmentFault 最新的问题
大猫的无限游戏
大猫的无限游戏
Project Zero
Project Zero
博客园 - 叶小钗
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
L
Lohrmann on Cybersecurity
C
CXSECURITY Database RSS Feed - CXSecurity.com
V
Vulnerabilities – Threatpost
NISL@THU
NISL@THU
罗磊的独立博客
Hugging Face - Blog
Hugging Face - Blog
酷 壳 – CoolShell
酷 壳 – CoolShell
P
Palo Alto Networks Blog
博客园_首页
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
Last Week in AI
Last Week in AI
量子位
Security Latest
Security Latest
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
小众软件
小众软件
博客园 - 【当耐特】
T
Threat Research - Cisco Blogs
The Cloudflare Blog
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
腾讯CDC
宝玉的分享
宝玉的分享
V2EX - 技术
V2EX - 技术
P
Privacy International News Feed
Security Archives - TechRepublic
Security Archives - TechRepublic
Webroot Blog
Webroot Blog
Apple Machine Learning Research
Apple Machine Learning Research
Jina AI
Jina AI
美团技术团队
Hacker News: Ask HN
Hacker News: Ask HN
人人都是产品经理
人人都是产品经理
S
Securelist
S
Security Affairs
WordPress大学
WordPress大学
J
Java Code Geeks
月光博客
月光博客
N
News and Events Feed by Topic
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
阮一峰的网络日志
阮一峰的网络日志
C
CERT Recently Published Vulnerability Notes
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
T
Tailwind CSS Blog

码云笔记

Pinia v4 发布:Vue 状态管理进入新时代 Linux LVM:故障排查与数据恢复指南 Java中wait()与sleep()方法的不同点是什么? Bonsai27B 重磅落地!27B 大模型实现手机本地运行 ES2026 第 17 版新增的 5 个新特性 高德重磅上线 ABot‑World Studio,消费级显卡就能搭建专属 3D 虚拟世界 Java中final、finally和finalize的区别是什么? 怎么修改Ollama及其模型的默认路径?Ollama路径修改、迁移与重启的操作教程 iOS27 公开测试版正式上线!AI Siri 与液态玻璃成最大看点 Yuku正式发布!比 Vite+ 快 5.4 倍的前端工具链 Linux lsof 命令详解:进程与文件监控实战 Claude Code CLI命令手册 代码审查重构Bug修复场景化工作流 OpenClaw中连接并使用本地Ollama模型的操作教程 GPT-5.6 今天正式上线:OpenAI 掏出”太阳系”全家桶,Sol / Terra / Luna 齐发,打的却是一张”效率牌” Nacos MySQL持久化部署完整教程 GPT-5.6系列正式上线:OpenAI以效能与性价比重塑AI行业竞争格局 Java中序列化与反序列化的概念是什么? 如何在HTML中实现字体颜色根据背景自动变化? JDK动态代理与CGLIB动态代理的区别是什么? OpenClaw数据加密敏感信息保护的完整教程 砸超亿美元算力!亚马逊秘密启动Moonraker项目,Alexa迎来颠覆性升级 PHP 最轻量、结构化 .docx 到 Markdown 转换器 Elephant TypeScript 7.0 正式发布 蚂蚁灵波开源全球首款 MoE 具身视频大模型 LingBot-Video,为机器人世界模型搭建新底座 SpaceX AI联合Cursor推出Grok 4.5 搅动专业AI赛道格局 英伟达Vera CPU落地商用,改写AI代理时代算力竞争规则 什么是端点检测与响应(EDR)以及它的工作原理介绍 Anime.js 已经 10 岁了!作者查出脑瘤,V5 将开始收费! 星链开启全面升级!SpaceX申请十万颗卫星,构建AI时代全球天基基建 PHP 通用表达式语言 CEL-PHP 2.0.0 正式发布! WordPress 7.0 下载,支持AI建站 Docker Desktop(windows)版本下载 详解 Linux 端口监听检查工具:ss、netstat、lsof 京东 JoyAI 上线 UGC 数字人功能,普通人一键打造专属虚拟分身 Java中Integer缓存池的作用是什么? 应对劳动力短缺 日本加码布局AI机器人产业,2040年拟千万台机器人落地各行各业 Java中深拷贝与浅拷贝的区别是什么? Claude旗舰模型收费规则大变:订阅权益取消,转为按量计费 MySQL中的分布式架构和复制策略 如何在 MySQL 中处理 BLOB 和 CLOB 数据类型? 如何在 MySQL 中处理和优化长时间运行的查询? git提交信息分别用什么icon好? Composer安装与配置教程 35岁华为员工偷偷面试,被面试官嘲讽:你是被淘汰的吧?他的回怼让面试官当场闭嘴 谷歌Nano Banana 2 Lite正式上线:4秒极速出图,大幅降低AI生图成本 锐捷交换机运维配置完全参考手册 Vue 3.5:Effect Scope 与响应式污染隔离机制 IS-IS协议基本概念、工作原理与扩展应用 美团LongCat-2.0重磅开源!国产万亿参数大模型解锁超长上下文新能力 LangChain4j 和 LangGraph4j 区别是什么?哪个更好? Claude Code 的聊天和配置可以一键搬进 Codex 了 码云笔记详解Markdown格式兼容性、图片显示失效与同步冲突解决 python实现自动爬取某论坛帖子并导出到Word文档的实战教程 高德低调内测 AI 零代码工具“袋马”,切入小微商家轻量化应用开发赛道 一文看懂OSPF:基础概念、工作原理和应用场景 PHP (Yii2) 接入企业级 SSO 单点登录实战教程 Google终于支持修改Gmail邮箱了?实测告诉你哪些能改,哪些不能改!(附详细教程+FAQ) UCloud 4.6 元 / 月服务器是真的吗? 2026 云服务器完整选购攻略 Webiny:无服务器应用程序框架 Fyrox:现代化的 Rust 游戏引擎 千问发布全球首个原生语言世界模型Qwen-AgentWorld,AI智能体迈入全环境实操新时代 火山引擎上新豆包音频生成模型1.0,AI音频生成实现一键全流程创作 使用Claude Code经常遇到的10个问题 如何批量清理wordpress所有文章和标签,保留设置,保留分类? 谷歌 NotebookLM 内测文献综述矩阵工具,Gemini3.5 赋能 AI 学术结构化研究 京东开源JoyAI-VL-Interaction模型 解锁AI实时视频视觉交互新形态 破解中小商家海报设计难题!MeiGen-AI开源闭环AI设计方案落地 详解Bash set 命令:set -e、set -x 和 set -u 完全指南 Node Plus ?比 pnpm 快 24 倍! Plan-Execute-Replan 和 ReAct 的区别是什么? Anthropic最新报告揭秘:AI编程人机协作成开发者主流工作模式 详解PostgreSQL 18 逻辑复制冲突检测与解决方法 JDK动态代理与CGLIB动态代理的区别是什么? 详解 Linux 中 localhost、127.0.0.1 与 Loopback(回环地址) OpenAI Codex新手入门教程 安装配置AGENTS.md与MCP全流程详解 程序员必备AGENTS.md配置指南 规避AI编码修改乱象 使用 Codex 必装的 12 个插件,你值得拥有! macOS AI CLI工具安装与避坑指南 OpenClaw Gemini Claude报错全套解决方案 智谱AI正式开源GLM-5. 2 模型:主打1M无损上下文与长程代码任务 小米 MiMo Claw 正式版上线 轻量化 Agent 打通金山办公生态 记录Claude Code Router 接入过程遇到问题及解决方法 千问AI眼镜凭硬核实力领跑2026智能穿戴赛道 程序员特有的习惯你占了几条! 郝景芳新作半数内容由AI创作,文坛郝景芳AI写作争议再起 使用 iftop、nload、bmon、vnstat 监控 Linux 网络带宽 现代富文本编辑器为什么最终都会抛弃 DOM? Vue 的 v-cloak 和 v-pre 指令有什么作用? 去哪里买抖音号?抖音小号在线购买-抖音小号出售批发 实名闲鱼小号出售|闲鱼账号批发|咸鱼发布账号|出售闲鱼发布账号 zfb号购买-支付宝小号购买-实名支付宝购买号-企业支付宝购买-支付宝小号批发 个人支付宝实名账号出售|v2/v3支付宝账号出售|实名支付宝小号购买 闲鱼账号哪里有卖-闲鱼实名账号购买的途径 Java注解的实现原理是什么? Agentation MemPalace 《置身钉内》之好词好句好段摘抄 AI有声书革命!万象有声全自动生产线,7元/万字颠覆网文有声化行业 详解CentOS 7跨版本迁移Rocky Linux9 生产环境安全升级教程 Java中序列化与反序列化的含义是什么? 18. Python 标准库之 Json 模块
如何定义 Vue 的动态路由?如何获取传过来的动态参数?
兰少 普通 · 2026-06-16 · via 码云笔记

AI 概述

本文讲解Vue动态路由规范,剖析刷新页面出现undefined、Object参数报错的根源。区分params路径参数与query查询参数,介绍路由props传参、命名路由跳转写法,解决同组件切换参数不刷新问题,同时提供参数校验、路由前置拦截等规范开发方案。

如何定义 Vue 的动态路由?如何获取传过来的动态参数?

Vue 项目中刷新页面出现 undefined、Object 类型报错接口,大多是动态路由使用不规范、传参方式混淆导致。本文系统讲解 Vue 动态路由的定义规则、参数获取、页面跳转写法,详解 params 与 query 参数区别,同时梳理组件复用不刷新、参数类型异常等高频坑点,并提供规范、可落地的路由开发最佳实践。

相信大家遇到过这样的情况,页面一刷新,接口直接打成了:

GET /api/stock/undefined/detail
GET /api/user/[object Object]

这种问题我一般不先看接口,也不先怪后端。先看路由。十有八九是动态路由没定义明白,或者传参时把 params 和 query 搅在一起了。

Vue 里所谓动态路由,最常见就是路径里有一段不是写死的。

比如库存详情页,不可能给每个库存单号都配一个页面:

/stock/SK20240601001
/stock/SK20240601002
/stock/SK20240601003

正确做法是把变化的那一段抽出来:

const routes = [
  {
    path: '/stock/:stockNo',
    name: 'stockDetail',
    component: () => import('./pages/StockDetail.vue')
  }
]

这里的 :stockNo 就是动态参数。

它能匹配:

/stock/SK20240601001
/stock/SK20240601002

但是不会匹配:

/stock
/stock/SK001/logs

这个地方别想复杂。冒号后面的名字,就是你后面取参数时用的 key。

在页面里取参数,一般这么写:

import { useRoute } from 'vue-router'
import { onMounted } from 'vue'

const route = useRoute()

onMounted(() => {
  const stockNo = route.params.stockNo

  console.log('[stock-detail] route param stockNo =', stockNo)

  loadStock(stockNo)
})

function loadStock(stockNo) {
  if (!stockNo) {
    console.warn('[stock-detail] empty stockNo, skip request')
    return
  }

  fetch(`/api/stock/${stockNo}/detail`)
}

这里有个小坑,route.params.stockNo 拿到的基本都是字符串。

即使你的路径是:

/user/10086

拿到的也是:

'10086'

不是数字 10086

所以写这种代码我第一眼就不太信:

const userId = route.params.userId

if (userId > 0) {
  loadUser(userId)
}

能跑,不代表写得稳。最好自己转一下,还要挡一下脏参数:

function pickUserId(route) {
  const raw = route.params.userId
  const userId = Number(raw)

  if (!Number.isInteger(userId) || userId <= 0) {
    console.warn('[user-page] bad userId:', raw)
    return null
  }

  return userId
}

路由可以定义多个动态参数。比如仓库货架页:

const routes = [
  {
    path: '/warehouse/:warehouseId/shelf/:shelfCode',
    name: 'shelfDetail',
    component: () => import('./pages/ShelfDetail.vue')
  }
]

访问地址:

/warehouse/12/shelf/A-09

页面里取:

import { useRoute } from 'vue-router'

const route = useRoute()

const warehouseId = route.params.warehouseId
const shelfCode = route.params.shelfCode

console.log('[shelf]', warehouseId, shelfCode)

这个写法能用,但我更喜欢把参数通过 props 传进组件。

路由配置这么写:

const routes = [
  {
    path: '/warehouse/:warehouseId/shelf/:shelfCode',
    name: 'shelfDetail',
    component: () => import('./pages/ShelfDetail.vue'),
    props: route => {
      return {
        warehouseId: Number(route.params.warehouseId),
        shelfCode: String(route.params.shelfCode || '')
      }
    }
  }
]

组件里就不用到处摸 route.params 了:

export default {
  props: {
    warehouseId: Number,
    shelfCode: String
  },

  mounted() {
    console.log('[shelf-detail] props:', this.warehouseId, this.shelfCode)
    this.loadShelf()
  },

  methods: {
    loadShelf() {
      if (!this.warehouseId || !this.shelfCode) {
        console.warn('[shelf-detail] param missing')
        return
      }

      fetch(`/api/warehouse/${this.warehouseId}/shelf/${this.shelfCode}`)
    }
  }
}

这段代码不是为了显得高级,是为了后面好维护。

页面组件只关心 warehouseId 和 shelfCode,不关心它们来自路由、弹窗、还是父组件。以后这个组件被别的页面复用,少改一堆东西。

再说跳转。

不要这样写:

router.push('/stock/' + stockNo)

能用,但容易在参数里混进 /、空格、中文的时候翻车。业务里单号一般还好,碰到分类名、文件名、设备编码,就不好说了。

我更习惯用命名路由:

router.push({
  name: 'stockDetail',
  params: {
    stockNo: row.stockNo
  }
})

这里要注意一个很烦的小点:用了 params,最好配合 name。别一边写 path,一边塞 params,最后发现参数没按你想的拼上去。

这种代码我见过很多次:

router.push({
  path: '/stock',
  params: {
    stockNo: row.stockNo
  }
})

它看着像要跳到详情页,实际很可能只是去了 /stock。然后页面里一取参数就是 undefined,接口也跟着炸。

如果你非要用 path,那就自己把路径拼完整:

router.push({
  path: `/stock/${encodeURIComponent(row.stockNo)}`
})

动态参数变了,组件不一定会重新创建。

比如你已经在:

/stock/SK001

然后点击列表切到:

/stock/SK002

如果还是同一个组件,mounted 不会再跑一遍。这个坑挺隐蔽,尤其是详情页左右切换时。

这时要监听参数变化:

import { useRoute } from 'vue-router'
import { watch } from 'vue'

const route = useRoute()

watch(
  () => route.params.stockNo,
  stockNo => {
    console.log('[stock-detail] stockNo changed:', stockNo)

    if (!stockNo) {
      return
    }

    loadStock(stockNo)
  },
  {
    immediate: true
  }
)

function loadStock(stockNo) {
  fetch(`/api/stock/${stockNo}/detail`)
}

这个 immediate: true 我一般会加上。第一次进页面也跑,后面参数变化也跑,逻辑集中一点,不用 onMounted 里写一份,watch 里再写一份。

动态路由参数和 query 参数也别混。

这种是动态参数:

/stock/SK001

取:

route.params.stockNo

这种是 query:

/stock?stockNo=SK001

取:

route.query.stockNo

两种都能传值,但语义不一样。

像详情页的主键,我更倾向放路径里:

/order/OD20240601001

像筛选条件、页码、tab,我更倾向放 query 里:

/order/OD20240601001?tab=logs&page=2

对应路由可以这样写:

router.push({
  name: 'orderDetail',
  params: {
    orderNo: order.orderNo
  },
  query: {
    tab: 'logs',
    page: 1
  }
})

页面里:

const orderNo = route.params.orderNo
const tab = route.query.tab || 'base'
const page = Number(route.query.page || 1)

console.log('[order-detail]', { orderNo, tab, page })

最后再补一个我平时会加的拦截。

有些页面参数不合法,别等接口 404 了才知道。路由层先拦一下:

{
  path: '/user/:userId',
  name: 'userProfile',
  component: () => import('./pages/UserProfile.vue'),
  beforeEnter(to) {
    const userId = Number(to.params.userId)

    if (!Number.isInteger(userId) || userId <= 0) {
      console.warn('[router] invalid userId:', to.params.userId)
      return {
        name: 'notFound'
      }
    }

    return true
  }
}

动态路由就这几件事:

路径里用 :xxx 定义参数;页面里从 route.params.xxx 取;跳转时优先用 name + params;参数变化时别只依赖 mounted;数字自己转,脏值自己挡。

真正在项目里出问题的,往往不是不会写 :id,而是默认它永远有值、永远类型正确、页面永远会重新加载。

这几个默认,我现在都不信。

以上关于如何定义 Vue 的动态路由?如何获取传过来的动态参数?的文章就介绍到这了,更多相关内容请搜索码云笔记以前的文章或继续浏览下面的相关文章,希望大家以后多多支持码云笔记。

声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权/违法违规/事实不符,请将相关资料发送至 admin@mybj123.com 进行投诉反馈,一经查实,立即处理!
重要:如软件存在付费、会员、充值等,均属软件开发者或所属公司行为,与本站无关,网友需自行判断
码云笔记 » 如何定义 Vue 的动态路由?如何获取传过来的动态参数?