fix(automation): 保存配置时存错作业 —— 5 张卡共用一个 form 实例
## 现象(用户报的)
点「账号资料定时补全」的保存,提示却是**「积分到期补记 配置已保存」**。
## 根因:不是提示文案错,是**真的存错了作业**
`jobs.map()` 里**每张卡各包一个 `<Form form={forms}>`,但它们共用同一个
`Form.useForm()` 实例**。React 里多个 `<Form>` 绑同一实例时,
**`onFinish` 会被最后挂载的那个覆盖** —— 于是:
点第 1 张卡的「保存」→ 触发的是**最后一张卡**(积分到期补记)的 onFinish
→ saveJob(积分到期补记)
## 实际影响(不涉及数据损坏)
- `saveJob(job)` 读的是**那个 job 自己的**字段值 → 所以「积分到期补记」
只是被用它自己的值**重存了一遍**(无副作用)
- 而用户真正想保存的「账号资料定时补全」**根本没被保存** —— 静默失败
## 修法
把 Form **提到外面只包一层**(`Form.Item` 靠 `[job.key, 字段]` 天然区分各自的值),
保存按钮从 `htmlType="submit"` 改成显式的 `onClick={() => saveJob(job)}` ——
不再依赖"哪个 Form 的 onFinish 生效"这种隐含约定。
并在原处留了注释说明为什么**不能**各自包 Form(否则下一个人很可能又这么写)。
## 说明
前端这类"共用实例"的错误没有自动化测试兜住(仓库没有组件测试),
所以这次是靠用户点出来的。已在代码注释里写清原因,降低复发概率。
## 验证
前端 build 通过、lint 0 errors。
This commit is contained in:
@@ -273,6 +273,7 @@ export default function AutomationPage() {
|
||||
description="两个作业是联动的上下游:巡检把失效账号标记为 invalid,「CK 自动重登」的候选条件正是这个标记,所以巡检一发现失效,重登作业在下一个周期就会把它救回来(需打开重登开关)。刻意分成两个作业是为了止损粒度 —— 巡检只读、零风险;重登会真实登录(消耗邮箱验证码、可能遇到极验),出问题可单独关掉重登而不影响检测。巡检本身不会替换任何 Cookie、也不会改账号状态。"
|
||||
/>
|
||||
|
||||
<Form form={forms} layout="inline">
|
||||
{jobs.map((job) => (
|
||||
<Card
|
||||
key={job.key}
|
||||
@@ -313,7 +314,11 @@ export default function AutomationPage() {
|
||||
</Descriptions.Item>
|
||||
</Descriptions>
|
||||
|
||||
<Form form={forms} layout="inline" onFinish={() => saveJob(job)}>
|
||||
{/* ⚠️ 这里**不能**各自包一个 <Form form={forms}>:
|
||||
多个 <Form> 绑同一个 form 实例时,`onFinish` 会被最后挂载的那个覆盖 ——
|
||||
点第一张卡的保存,跑的其实是**最后一张卡**的保存(真踩过:
|
||||
存「账号资料定时补全」提示的是「积分到期补记」,即存错了作业)。
|
||||
Form 统一提到这一层外面,各卡只用 Form.Item 的 [job.key, 字段] 区分。 */}
|
||||
<Form.Item
|
||||
name={[job.key, "enabled"]}
|
||||
label="启用"
|
||||
@@ -345,9 +350,9 @@ export default function AutomationPage() {
|
||||
<Space>
|
||||
<Button
|
||||
type="primary"
|
||||
htmlType="submit"
|
||||
disabled={!canManage}
|
||||
loading={savingKey === job.key}
|
||||
onClick={() => void saveJob(job)}
|
||||
>
|
||||
保存
|
||||
</Button>
|
||||
@@ -367,7 +372,6 @@ export default function AutomationPage() {
|
||||
</Popconfirm>
|
||||
</Space>
|
||||
</Form.Item>
|
||||
</Form>
|
||||
{!canManage && (
|
||||
<Typography.Text type="secondary">
|
||||
当前账号只能查看,修改配置需要 automation:manage 权限。
|
||||
@@ -375,6 +379,7 @@ export default function AutomationPage() {
|
||||
)}
|
||||
</Card>
|
||||
))}
|
||||
</Form>
|
||||
</Card>
|
||||
|
||||
<Card
|
||||
|
||||
Reference in New Issue
Block a user