safety-eval-service-frontend/.cursor/skills/declare-request-usage/SKILL.md

89 lines
2.2 KiB
Markdown
Raw Permalink Normal View History

2026-08-14 16:54:03 +08:00
---
name: "declare-request-usage"
description: "规范使用 declareRequest 声明 API 并在组件中通过 props 调用的模式。当新增/调用 declareRequest 声明的接口时,必须遵循此规范。"
---
# declareRequest 使用规范
## 核心原则
**不要直接 import `declareRequest` 声明的函数并直接调用。** 必须通过 `Connect` 注入的 `props` 访问。
## 正确步骤
### 1. 声明 API (在 `src/api/` 下)
```js
// src/api/xxx/index.js
import { declareRequest } from "@cqsjjb/jjb-dva-runtime";
export const someApi = declareRequest(
"xxxLoading", // loading key与 namespace 同名前缀
"Get > /path/to/api", // 请求方式与路径
"someData: [] | res.data || []", // 响应数据映射(可选)
);
```
### 2. 使用 API (在页面组件中)
**正确**:通过 `Connect` 注入的 `props` 访问
```jsx
import { Connect } from "@cqsjjb/jjb-dva-runtime";
import { NS_XXX } from "~/enumerate/namespace";
function MyPage(props) {
const handleLoad = () => {
// ✅ 通过 props 调用
props.someApi(params).then((res) => {
// 处理结果
});
};
}
export default Connect(
[NS_XXX], // 传入正确的 namespace
true,
)(MyPage);
```
**正确**:父组件通过 props 传递给子组件
```jsx
// 父组件
function Parent(props) {
return <Child someApi={props.someApi} />;
}
// 子组件通过 props 接收
function Child({ someApi }) {
const handleLoad = () => {
someApi(params); // ✅ 正确
};
}
```
**错误**:直接 import 并调用
```jsx
// ❌ 错误!不要这样做
import { someApi } from "~/api/xxx";
function MyComponent() {
// ❌ someApi 不是可调用的函数
someApi(params);
}
```
## 为什么
`declareRequest` 注册的是 Redux action需要通过 `Connect` 绑定到组件的 props 后才能正常工作。直接 import 得到的不是可调用的函数,会导致 `is not a function` 错误。
## 检查清单
- [ ] API 声明在 `src/api/` 下的对应文件中
- [ ] `declareRequest` 的 loading key 与 namespace 的 loading 前缀一致
- [ ] 组件通过 `Connect([NS_XXX], true)` 连接
- [ ] 通过 `props.apiName(params)` 调用,而非直接 import 调用
- [ ] 子组件需要的 API 函数通过 props 从父组件传入