生成二级路由信息存储工具
请为我制作两款工具。
请你遵循以下要求:
- 写入指定文件:我会提供给你代码生成的文件,请在我提供给你的代码文件内,补全生成代码,完成我的需求。
- 逐步生成工具:不要一次性生成两个工具。我会告诉你什么时候开始生成工具。按照前后阶段逐步生成工具。
- 代码解释:在你生成完代码后,请你及时的为我解释代码。
- 编撰使用文档:我会给你提供一个 md 文件,请你同步地为生成的工具提供使用文档。
- 就地声明并暴露类型信息:你不可避免的需要定义类型信息,请你直接在我给你的 ts 文件内,定义并对外导出类型即可。不需要在其他文件内写入。
- 类型约束:在涉及到路由的内容时,请你满足类型化路由的约束。
基于路由名称的键值对存储工具
模仿目录 apps\admin\src\store 内的代码写法,制作一个基于路由名称的,基于 pinia 实现的数据存储对象。
核心功能
本质上是一个 map 对象。
key 值是路由的名称,也就是 name。存储的值是路由信息。
setRouteInfo
必须实现这样的函数:对外暴露一个 action 函数,设置路由信息 setRouteInfo 。
传参是一个对象:
- key 路由的名称。类型约束为 RouteRecordName 。
- info 各种可能得路由信息,可以遇见是键值对对象。
- 存储数据时,要求你使用
storageLocal()函数,实现数据的本地存储,以便确保数据不会在刷新页面后丢失。 - 设置数据时,请你使用 lodash-es 的 merge 函数,确保数据可以动态的增加路由属性。
getRouteInfo
必须实现这样的函数:对外暴露一个 action 函数,获取路由信息 getRouteInfo 。
传参是一个值:
- key 路由的名称。类型约束为 RouteRecordName 。
重复赋值的情况
在出现重复赋值时,请确保每次设置时,都可以接收到新的属性,新的值可以覆盖前面的值。使用 merge 函数实现。
组合式 API
实现存储工具时,必须使用组合式 api 工具,不要模仿项目内已经有的 store 写法,不要使用选项式 api 的写法。
对外提供一个封装 store 对象的 hook 函数
模仿目录 apps\admin\src\store 内的代码写法,在定义 store 工具时,同时对外提供一个 hook 函数,便于使用。
跳转详情页路由工具
在跳转详情页时,将会使用该组合式 api 提供的工具,实现这两个功能:
在跳转路由时,会涉及到页面的前后关系。这里称呼为前驱页面、后继页面。
工具高耦合
基于路由名称的键值对存储工具 和本工具 跳转详情页路由工具 是高耦合的。一个负责纯粹的数据存储,另一个负责封装跳路由时的数据处理细节。但是二者是高度耦合的,请注意二者的联系。必要时,你可以同时修改 基于路由名称的键值对存储工具 。
功能 1: 前驱页设置路由数据并跳路由
设计一个函数,gotoDetailPage。函数参数和 router.push 跳路由函数一样。
比如:
router.push({
name,
params: {
id: row.编号,
},
});那么 gotoDetailPage 函数的参数就至少要包括 name 和 params 参数。且需要做到和 router.push 函数一样的类型校验。目前,router.push 跳路由函数需要满足类型化路由的类型约束。
在前驱页跳转前,需要按照以下逻辑完成:
- 根据传参的具名路由,用 getRouteByName 函数获取到目标路由的信息。即
后继页的路由信息。
const targetRoute = getRouteByName(name);- 使用组合式 api 的 router,获取到
前驱页的路由地址。
const router = useRouter();
router.currentRoute.value.path;- 设置一次当前路由的 activePath 信息。
一定要设置来自 targetRoute 的 activePath,具体伪代码如下:
targetRoute.meta.activePath = router.currentRoute.value.path;- 存储路由信息。
使用 setRouteInfo 函数,存储路由信息。传参规则如下:
- key
后继页的路由名称。 - info 后继页的 mate 信息的 activePath,一定要手动设置 activePath 项。设置成
前驱页的路由地址。
伪代码应该类似于下面的写法:
setRouteInfo({
// 后继页的路由地址
key: targetRoute.path,
info: {
// 必须要存储 meta 信息
meta: {
// 必须要设置 activePath ,且要设置成 前驱页的路由地址
activePath: router.currentRoute.value.path,
},
// 其他的路由信息 可以酌情设置
},
});- 跳路由。
在存储完路由信息后,就开始跳路由。根据 gotoDetailPage 提供的参数,使用 router.push 函数,跳转到后继页。
功能 2:后继页在特定的路由守卫 beforeEnter 内获取并设置数据
设计一个函数,handleDetailPageBeforeEnter。函数参数和 beforeEnter 路由单独的路由守卫函数一样,都要有 to, from, next 函数。
执行以下逻辑:
- 在 handleDetailPageBeforeEnter 函数内,先准备当前路由信息。
const route = useRoute();- 从当前路由信息内,获取路由地址。
route.path;- 根据当前路由名称,从 getRouteInfo 函数内获取到需要使用的路由信息。
getRouteInfo(route.path);- 根据传入的 to 参数,设置 to 参数的 meta.activePath 值。
to.meta.activePath = getRouteInfo(route.path).meta.activePath;实际使用的预期写法:
definePage({
meta: {
title: "某某标题名称",
icon: "f7:menu",
},
beforeEnter: (to, from, next) => {
handleDetailPageBeforeEnter(to, from, next);
return next();
},
});