ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

VueUse useRouteParams 详解:在 Vue 3 中响应式读写 vue-router 路由参数

VueUse useRouteParams 详解:在 Vue 3 中响应式读写 vue-router 路由参数 前端【免费下载链接】vueuseCollection of essential Vue Composition Utilities for Vue 3项目地址https://gitcode.com/gh_mirrors/vu/vueuse点击查看免费下载useRouteParams是 VueUse 官方vueuse/router附加包提供的一个组合式工具专门用于把 vue-router 的路由参数route.params封装成可读可写的响应式Ref。本文围绕该工具的 API 设计、类型签名、底层实现与测试保障展开帮助你在 Vue 3 vue-router 的项目中正确使用它来读写userId、page等动态路由参数并理解它与route.params之间的双向同步机制。安装与引入useRouteParams属于 VueUse 的 Router 附加包需要与 vue-router 一同安装npm i vueuse/router vue-router从仓库中 packages/router/package.json 可以看到vueuse/router的当前版本为 15.0.0其 peerDependencies 要求vue:^3.5.0vue-router:^4.0.0 || ^5.0.0也就是说它面向 Vue 3 组合式 API 设计同时兼容 vue-router 4 与 5。安装完成后从包中导入即可import { useRouteParams } from vueuse/router该函数由 packages/router/index.ts 统一导出与useRouteQuery、useRouteHash并列构成了vueuse/router的三个核心工具。基本用法useRouteParams本质上是响应式route.params的简写shorthand。以一个典型的分页路由/users/:userId为例import { useRouteParams } from vueuse/router // 无默认值Refnull | string | string[] const userId useRouteParams(userId) // 带默认值 const userId useRouteParams(userId, -1) // 带 transform 转换 const page useRouteParams(page, 1, { transform: Number }) console.log(page.value) // route.params.page读取时自动转换为数字 // 写回路由等价于 router.replace({ params: { page: 100 } }) page.value 100这段示例来自 packages/router/useRouteParams/index.md也完整出现在 skills/vueuse-functions/references/useRouteParams.md 中是最基础的三种调用形态只传参数名返回Refnull | string | string[]传入默认值当参数缺失时返回该默认值传入options.transform对读写值做双向转换如把字符串1转成数字1。关键点在于返回的ref是可写的。对它赋值会自动触发router.replace默认模式将参数同步到 URL无需手动调用路由 API读取时则永远反映当前路由的真实状态路由跳转后值会自动更新。类型签名与重载从 packages/router/useRouteParams/index.ts 的声明可以看出该函数有两组重载export declare function useRouteParams( name: string, ): Refnull | string | string[] export declare function useRouteParams T extends RouteParamValueRaw RouteParamValueRaw, K T, ( name: string, defaultValue?: MaybeRefOrGetterT, options?: ReactiveRouteOptionsWithTransformT, K, ): RefK含义如下第一种形态返回Refnull | string | string[]。注意这里没有undefined——vue-router 中未命中的参数名取值是undefined而useRouteParams会把它归一化为null或默认值保证类型收敛。第二种形态中T是原始参数值的类型RouteParamValueRaw即string | number之类的可写参数值K是最终暴露给组件的类型。当传入transform: Number时K被推断为numberdefaultValue支持MaybeRefOrGetter即可以直接传值、传ref或传一个 getter 函数。options的完整定义位于 packages/router/_types.ts是useRouteParams、useRouteQuery、useRouteHash三个工具共享的选项类型。选项详解mode: replace | push默认replace控制写回路由的方式。默认使用router.replace不会在历史栈中留下记录传入push则使用router.push产生一条新历史记录。值得注意的是该选项支持MaybeRef可以用响应式值动态控制例如const mode refreplace | push(replace) const page useRouteParams(page, 1, { mode })源码中通过toValue(mode)解包该值后调用对应方法routertoValue(mode)。route与router实例默认通过useRoute()和useRouter()自动获取当前路由与路由器实例。在非标准上下文如测试、组件外需要手动注入时可以显式传入useRouteParams(id, null, { route, router })测试文件 packages/router/useRouteParams/index.test.ts 中大量使用这种注入方式用 mock 的route与router隔离真实导航环境。transform: (val: V) R或{ get?, set? }用于读写值的双向转换支持两种写法// 单函数读与写共用同一个转换 const page useRouteParams(page, 1, { transform: Number }) // 对象形式get/set 分别定义 const object useRouteParams(serialized, undefined, { transform: { get: (value: string) JSON.parse(value), set: (value: any) JSON.stringify(value), }, })对象形式中get负责把路由中的原始字符串转换为组件侧使用的类型读set负责把组件侧值还原为可写入 URL 的形式写。只提供get或只提供set也是合法的未提供的一方使用恒等转换——这一点由 index.test.ts 中的 should handle transform with only get 与 should handle transform with only set 两个用例专门验证。源码级原理解析useRouteParams的实现集中在 packages/router/useRouteParams/index.ts其核心机制可以拆解为四层1.customRef构造响应式读写代理返回的 ref 并非普通ref而是通过customRef手工构造的代理get()中调用track()建立依赖收集并返回transformGet(param ! undefined param ! ? param : toValue(defaultValue))set()中先经transformSet转换若新值与当前值相同则直接返回避免无意义的触发否则更新内部变量、登记到队列、调用trigger()通知订阅者。get的分支逻辑揭示了一个重要细节空字符串会被当作“无值”处理此时回退到默认值。这对应 vue-router 的可选参数语法如/users/:userId?测试 should return default value when use vue-router optional parameters 验证了该场景route.params.page 时useRouteParams(page, default)返回default。2. 写入队列与批量导航所有对参数的写入并不会立即触发路由跳转而是先登记到基于WeakMapRouter, Mapstring, any的_queue中然后在nextTick统一合并成一次导航nextTick(() { if (_paramsQueue.size 0) return const newParams Object.fromEntries(_paramsQueue.entries()) _paramsQueue.clear() const { params, query, hash } route routertoValue(mode) })这种设计带来的收益非常明显同一 tick 内连续修改多个参数如page、lang、code只触发一次路由更新测试 should trigger effects only once 验证了监听器只被调用一次导航时保留当前的query与hash不做破坏测试 should keep current query and hash 专门覆盖了这一点WeakMapRouter, ...按 router 实例隔离队列同一路由器的多个useRouteParams调用共享一个队列天然支持批量合并。3. 写回默认值即清除参数set中有个巧妙逻辑param (v toValue(defaultValue) || v null) ? undefined : v _paramsQueue.set(name, (v toValue(defaultValue) || v null) ? undefined : v)当写入的值等于默认值或为null时会被归一化为undefined并写入队列。由于Object.fromEntries会把值为undefined的键保留为undefined导航后该参数在route.params中即告清除URL 中不再体现。这提供了一种“重置参数”的语义page.value null等价于删除该参数。测试 should avoid trigger effects when the value doesnt change 中page.value 1等于默认值1最终使route.params.page变为undefined且监听器未被触发。4.watch反向同步路由 → ref除了customRef提供的正向同步ref → 路由实现还通过watch(() route.params[name], ...)以flush: sync的方式反向同步watch( () route.params[name], (v) { if (param transformGet(v as T)) return param v _trigger() }, { flush: sync }, )当浏览器前进/后退、其他组件跳转导致参数变化时ref 会同步更新。flush: sync保证在同一个同步执行周期内立即反映路由变化无需等待渲染队列。测试 should change the value when the route changes 验证了route.params { lang: en }后lang.value立即变为en。5. 作用域销毁时的状态清理实现开头声明了tryOnScopeDispose(() { param undefined })并配合测试 should reset state on scope dispose 验证当创建 ref 的effectScope被销毁时该参数对应的内部状态被重置但不会影响其他作用域中同名参数的引用。这保证了组件卸载后不会产生状态泄漏同时也说明useRouteParams具备完整的作用域生命周期管理能力。测试保障概览packages/router/useRouteParams/index.test.ts 是理解该函数行为边界的权威参照除上文已涉及的外还覆盖了默认值支持 ref 或 getterdefaultValue可以传shallowRef(1)或() pt-BR由toValue统一解包transform 后值不变的场景不触发副作用transform: Number下重复赋值相同值不会产生多余导航与监听回调多参数批量写入连续赋值code、page、lang三个参数后所有值均正确同步到route.paramsgetter 对象作为 watch 源时只触发一次配合computed或watch(() ({ page: page.value }))使用时不会产生重复回调。这些测试不仅验证了正确性也精确刻画了“何时触发、何时不触发”的响应式行为契约值得在接入项目前通读一遍。与 useRouteQuery、useRouteHash 的关系useRouteParams是vueuse/router三件套之一packages/router/index.ts 导出全部三者useRouteParams读写route.params对应动态路径段如/users/:userId中的userIduseRouteQuery读写route.query对应?keyvalue查询字符串packages/router/useRouteQuery/index.ts 的实现与本函数几乎同构队列名为_queriesQueue且 query 的默认值判断不含空字符串分支useRouteHash读写route.hash对应#anchor锚点。三者共享 packages/router/_types.ts 中的ReactiveRouteOptions与ReactiveRouteOptionsWithTransform类型定义学习其一即可快速掌握另外两个。完整功能清单可见 packages/router/README.md。实战建议与注意事项类型转换优先用 transform 而非手动取值useRouteParams(page, 1, { transform: Number })让组件内全程拿到数字类型避免处处Number(page.value)的样板代码需要往返序列化如 JSON 对象时使用{ get, set }对象形式。连续修改多个参数时无须多次导航由于内置 nextTick 队列合并机制一个事件循环内对多个useRouteParamsref 赋值只会产生一次router.replace/push可放心批量更新。写默认值或 null 即“移除参数”若希望从 URL 中清除某个参数直接赋值为null或默认值即可无需手动构造新的params对象。保持 query 与 hash 不被误删写回时实现会自动保留当前query与hash因此你可以安全地只关心 params 而不用担心连带破坏其他 URL 信息。可选参数注意空字符串语义路由定义为可选参数/users/:userId?时空串会被视作无值并回退到默认值请据此设计默认值。总而言之useRouteParams用约 120 行代码见 packages/router/useRouteParams/index.ts把 vue-router 的参数读写、类型转换、批量导航、双向同步与生命周期清理完整封装成一个类型安全的响应式 ref是 Vue 3 路由应用中值得优先考虑的参数管理方案。赞分享前端【免费下载链接】vueuseCollection of essential Vue Composition Utilities for Vue 3项目地址https://gitcode.com/gh_mirrors/vu/vueuse点击查看免费下载相关推荐VueUse useRouteParams 完全指南在 airi 的 Vue 3 应用中响应式读写路由参数VueUse useRouteParams 完全指南在 airi 的 Vue 3 应用中响应式读写路由参数 useRouteParams 是 VueUse 为AI 应用人工智能大模型数字人AI Agent语音前端后端桌面应用移动开发即时通讯3D渲染VueUse 的 useRouteParams让 vue-router 动态路由参数变成响应式状态VueUse 的 useRouteParams让 vue router 动态路由参数变成响应式状态 VueUse 的 useRouteParams 是 vu前端VueUse useUrlSearchParams 指南在 Vue 3 应用中响应式读写 URL 查询参数VueUse useUrlSearchParams 指南在 Vue 3 应用中响应式读写 URL 查询参数 导读 useUrlSearchParams 是 VAI 应用人工智能大模型数字人AI Agent语音前端后端桌面应用移动开发即时通讯3D渲染上一篇ETS2 Telemetry Server终极指南如何在手机上实时监控卡车驾驶数据下一篇Crawl4AI终极指南如何用5行代码实现智能网页采集效率提升10倍创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表