Skip to content

生成二级路由信息存储工具

请为我制作两款工具。

请你遵循以下要求:

  1. 写入指定文件:我会提供给你代码生成的文件,请在我提供给你的代码文件内,补全生成代码,完成我的需求。
  2. 逐步生成工具:不要一次性生成两个工具。我会告诉你什么时候开始生成工具。按照前后阶段逐步生成工具。
  3. 代码解释:在你生成完代码后,请你及时的为我解释代码。
  4. 编撰使用文档:我会给你提供一个 md 文件,请你同步地为生成的工具提供使用文档。
  5. 就地声明并暴露类型信息:你不可避免的需要定义类型信息,请你直接在我给你的 ts 文件内,定义并对外导出类型即可。不需要在其他文件内写入。
  6. 类型约束:在涉及到路由的内容时,请你满足类型化路由的约束。

基于路由名称的键值对存储工具

模仿目录 apps\admin\src\store 内的代码写法,制作一个基于路由名称的,基于 pinia 实现的数据存储对象。

核心功能

本质上是一个 map 对象。

key 值是路由的名称,也就是 name。存储的值是路由信息。

setRouteInfo

必须实现这样的函数:对外暴露一个 action 函数,设置路由信息 setRouteInfo 。

传参是一个对象:

  • key 路由的名称。类型约束为 RouteRecordName 。
  • info 各种可能得路由信息,可以遇见是键值对对象。
  1. 存储数据时,要求你使用 storageLocal() 函数,实现数据的本地存储,以便确保数据不会在刷新页面后丢失。
  2. 设置数据时,请你使用 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 跳路由函数一样。

比如:

ts
router.push({
	name,
	params: {
		id: row.编号,
	},
});

那么 gotoDetailPage 函数的参数就至少要包括 name 和 params 参数。且需要做到和 router.push 函数一样的类型校验。目前,router.push 跳路由函数需要满足类型化路由的类型约束。

前驱页跳转前,需要按照以下逻辑完成:

  1. 根据传参的具名路由,用 getRouteByName 函数获取到目标路由的信息。即后继页的路由信息。
ts
const targetRoute = getRouteByName(name);
  1. 使用组合式 api 的 router,获取到前驱页的路由地址。
ts
const router = useRouter();
router.currentRoute.value.path;
  1. 设置一次当前路由的 activePath 信息。

一定要设置来自 targetRoute 的 activePath,具体伪代码如下:

ts
targetRoute.meta.activePath = router.currentRoute.value.path;
  1. 存储路由信息。

使用 setRouteInfo 函数,存储路由信息。传参规则如下:

  • key 后继页的路由名称。
  • info 后继页的 mate 信息的 activePath,一定要手动设置 activePath 项。设置成前驱页的路由地址。

伪代码应该类似于下面的写法:

ts
setRouteInfo({
	// 后继页的路由地址
	key: targetRoute.path,
	info: {
		// 必须要存储 meta 信息
		meta: {
			// 必须要设置 activePath ,且要设置成 前驱页的路由地址
			activePath: router.currentRoute.value.path,
		},
		// 其他的路由信息 可以酌情设置
	},
});
  1. 跳路由。

在存储完路由信息后,就开始跳路由。根据 gotoDetailPage 提供的参数,使用 router.push 函数,跳转到后继页

功能 2:后继页在特定的路由守卫 beforeEnter 内获取并设置数据

设计一个函数,handleDetailPageBeforeEnter。函数参数和 beforeEnter 路由单独的路由守卫函数一样,都要有 to, from, next 函数。

执行以下逻辑:

  1. 在 handleDetailPageBeforeEnter 函数内,先准备当前路由信息。
ts
const route = useRoute();
  1. 从当前路由信息内,获取路由地址。
ts
route.path;
  1. 根据当前路由名称,从 getRouteInfo 函数内获取到需要使用的路由信息。
ts
getRouteInfo(route.path);
  1. 根据传入的 to 参数,设置 to 参数的 meta.activePath 值。
ts
to.meta.activePath = getRouteInfo(route.path).meta.activePath;

实际使用的预期写法:

ts
definePage({
	meta: {
		title: "某某标题名称",
		icon: "f7:menu",
	},
	beforeEnter: (to, from, next) => {
		handleDetailPageBeforeEnter(to, from, next);
		return next();
	},
});

贡献者

The avatar of contributor named as ruan-cat ruan-cat

页面历史

最近更新