路由Params
Zova 对路由Params
进行了强化,提供了 Typescript 类型化支持
我们仍然使用页面组件user
完整的演示如何定义和使用类型化的Params
定义Params
在controller.ts
中定义 Params:
src/suite/a-demo/modules/a-demo/src/page/user/controller.ts
typescript
export const ParamsSchema = zz.object({
id: zz.number().optional().default(0),
});
- 使用
zz
定义了一个object
,包含字段:id
路由name
为了支持 Params,需要在路由记录上使用name
字段,并且登记在模块的资源中
1. 路由记录
src/suite/a-demo/modules/a-demo/src/routes.ts
typescript
export const routes: IModuleRoute[] = [
{ path: 'card/header2', component: CardHeader2 },
{ name: 'user', path: 'user/:id?', component: User },
];
- name 设为
user
,系统自动添加模块前缀,生成绝对名称a-demo:user
- path 改为
user/:id?
2. 资源记录
src/suite/a-demo/modules/a-demo/src/resource/pages.ts
typescript
import { TypePageParamsQuery } from 'zova';
import * as NSControllerPageUser from '../page/user/controller.js';
declare module 'zova' {
export interface IPageNameRecord {
'a-demo:user': TypePageParamsQuery<NSControllerPageUser.QueryInput, NSControllerPageUser.ParamsInput>;
}
}
export const pageNameSchemas = {
'a-demo:user': {
params: NSControllerPageUser.ParamsSchema,
query: NSControllerPageUser.QuerySchema,
},
};
- 向
IPageNameRecord
接口添加记录,声明a-demo:user
对应的Params类型
- 向
pageNameSchemas
对象添加记录,声明a-demo:user
对应的ParamsSchema
使用Params
在render.ts
中,可以直接获取 Params,并渲染出来
src/suite/a-demo/modules/a-demo/src/page/user/render.tsx
typescript
export class RenderUser {
render() {
return (
<div>
<div>id: {this.$params.id}</div>
</div>
);
}
}
$params.id
的类型是number
传入Params
接下来,我们需要在导航路由时传入Params
参数
仍然响应页面组件user
中的按钮单击事件,并采用不同的Params
参数导航至当前页面。这样,我们可以看到$params
是响应式的
typescript
export class RenderUser {
render() {
return (
<div>
<div>id: {this.$params.id}</div>
<button
onClick={() => {
const id = this.$params.id + 1;
const url = this.$router.resolveName('a-demo:user', { params: { id } });
this.$router.push(url);
}}
>
Go To Current Page
</button>
</div>
);
}
}
$params
Zova 在controller
bean 的基类中注入了$params
对象,从而可以在 render 实例中通过this.$params
访问 Params 参数