safety-eval-service-frontend/.cursor/skills/specs/06-搜索区规范/01-搜索表单组件/SKILL.md

97 lines
3.1 KiB
Markdown
Raw Permalink Normal View History

2026-08-14 16:54:03 +08:00
---
name: jjb-search-form
description: 定义 JJB 项目搜索表单组件使用规范。在使用 SearchForm、formLine、Form.Item 或 PageLayout 集成搜索区时使用。必须参考 MD/d.ts 文档。
---
# 搜索区规范(一级页面)
## 搜索表单组件
- 除提示词明确不需要的情况下,所有页面搜索区 **必须** 使用:
```javascript
import SearchForm from '~/components/SearchForm'
```
必须严格参考node_modules中对应依赖包的 MD 文档或 d.ts 文件!不得猜测组件属性!
- **FormLine 规范**
`SearchForm``formLine` 属性中,所有搜索控件 **必须** 使用 `ControlWrapper` 封装:
```javascript
import ControlWrapper from '@cqsjjb/jjb-react-admin-component/ControlWrapper'
```
| 控件 | 写法 |
|------|------|
| 文本输入 | `<ControlWrapper.Input label="标签" placeholder="请输入" allowClear />` |
| 下拉选择 | `<ControlWrapper.Select label="标签" placeholder="请选择" allowClear style={{ width: "100%" }}>...</ControlWrapper.Select>` |
| 日期范围 | `<ControlWrapper.DatePicker.RangePicker label="标签" />` |
| 级联选择 | `<ControlWrapper.Cascader label="标签" placeholder="请选择" options={...} />` |
| 树选择 | `<ControlWrapper.TreeSelect label="标签" placeholder="请选择" treeData={...} />` |
**注意**`ControlWrapper` 没有 `Custom` 属性,不要自行拼装。
- **布局挂载规范**
- **标准布局**:若页面结构简单,**必须**将 `SearchForm` 放置在 `PageLayout``formLine` 属性中,以实现搜索区与页面头部的紧凑集成。
- **复杂布局**:若搜索需求涉及复杂交互或多行展示,可根据实际场景将 `SearchForm` 放置于 `PageLayout` 的主体内容区。
### 代码演示
```jsx
import React, { useState, useEffect } from 'react';
import { Button, Form, Table } from 'antd';
import PageLayout from '@cqsjjb/jjb-react-admin-component/PageLayout';
import SearchForm from '~/components/SearchForm';
import ControlWrapper from '@cqsjjb/jjb-react-admin-component/ControlWrapper';
import { tools } from '@cqsjjb/jjb-common-lib';
const { router } = tools;
function DemoList(props) {
const [form] = Form.useForm();
const [loading, setLoading] = useState(false);
const getData = async () => {
setLoading(true);
try {
// 请求数据
} finally {
setLoading(false);
}
};
useEffect(() => {
form.setFieldsValue(router.query);
getData();
}, []);
return (
<PageLayout title="页面标题">
<SearchForm
style={{ marginBottom: 24 }}
form={form}
loading={loading}
formLine={[
<Form.Item key="name" name="name">
<ControlWrapper.Input label="名称" placeholder="请输入" allowClear />
</Form.Item>,
]}
onReset={(values) => {
router.query = { ...router.query, ...values, current: 1, pageSize: 10 };
getData();
}}
onFinish={(values) => {
router.query = { ...router.query, ...values, current: 1, pageSize: 10 };
getData();
}}
/>
{/* Table ... */}
</PageLayout>
);
}
```