Skip to content

Commit 0b0b90f

Browse files
committed
feat: 添加表单数据本地持久化存储功能,刷新页面后保留用户输入
1 parent aa1343d commit 0b0b90f

File tree

1 file changed

+68
-6
lines changed
  • src/components/ChallengeContributePage

1 file changed

+68
-6
lines changed

src/components/ChallengeContributePage/index.tsx

Lines changed: 68 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import * as React from 'react';
22
import { useState, useEffect } from 'react';
3-
import { Form, Switch, message, Alert, Input } from 'antd';
3+
import { Form, Switch, message, Alert, Input, Button } from 'antd';
44
import * as YAML from 'yaml';
55
import { challenges } from '../ChallengeListPage/ChallengeData';
66

@@ -24,6 +24,9 @@ import FormSubmitSection from './components/FormSubmitSection';
2424
// 导入样式
2525
import { styles } from './styles';
2626

27+
// localStorage键名
28+
const STORAGE_KEY = 'challenge_contribute_form_data';
29+
2730
/**
2831
* 挑战贡献页面组件
2932
*/
@@ -52,12 +55,30 @@ const ChallengeContributePage: React.FC = () => {
5255
isExpired: false,
5356
});
5457

55-
// 初始化下一个可用的ID
58+
// 从localStorage加载保存的表单数据
5659
useEffect(() => {
57-
const nextId = calculateNextId();
58-
form.setFieldsValue({ id: nextId });
60+
try {
61+
const savedData = localStorage.getItem(STORAGE_KEY);
62+
if (savedData) {
63+
const parsedData = JSON.parse(savedData) as ChallengeFormData;
64+
setInitialFormValues(parsedData);
65+
form.setFieldsValue(parsedData);
66+
console.log('已从本地存储恢复表单数据');
67+
}
68+
} catch (error) {
69+
console.error('从本地存储恢复数据失败:', error);
70+
}
5971
}, [form]);
6072

73+
// 初始化下一个可用的ID
74+
useEffect(() => {
75+
// 只有当localStorage中没有保存的ID时,才使用自动计算的ID
76+
if (!initialFormValues.id) {
77+
const nextId = calculateNextId();
78+
form.setFieldsValue({ id: nextId });
79+
}
80+
}, [form, initialFormValues.id]);
81+
6182
// 计算下一个可用ID
6283
const calculateNextId = (): number => {
6384
if (!challenges || challenges.length === 0) {
@@ -68,8 +89,16 @@ const ChallengeContributePage: React.FC = () => {
6889
};
6990

7091
// 表单值变更处理
71-
const handleFormValueChange = () => {
92+
const handleFormValueChange = (changedValues: any, allValues: any) => {
7293
setIsFormDirty(true);
94+
95+
// 将表单数据保存到localStorage
96+
try {
97+
localStorage.setItem(STORAGE_KEY, JSON.stringify(allValues));
98+
console.log('表单数据已保存到本地存储');
99+
} catch (error) {
100+
console.error('保存数据到本地存储失败:', error);
101+
}
73102
};
74103

75104
// 生成YAML数据
@@ -99,6 +128,26 @@ const ChallengeContributePage: React.FC = () => {
99128
}
100129
};
101130

131+
// 清除保存的表单数据
132+
const clearSavedData = () => {
133+
try {
134+
localStorage.removeItem(STORAGE_KEY);
135+
message.success('已清除本地存储的表单数据');
136+
// 重置表单
137+
form.resetFields();
138+
const nextId = calculateNextId();
139+
form.setFieldsValue({
140+
id: nextId,
141+
platform: 'Web',
142+
isExpired: false
143+
});
144+
setIsFormDirty(false);
145+
} catch (error) {
146+
console.error('清除本地存储的表单数据失败:', error);
147+
message.error('清除数据失败');
148+
}
149+
};
150+
102151
// 表单提交
103152
const handleFinish = async () => {
104153
try {
@@ -133,6 +182,9 @@ const ChallengeContributePage: React.FC = () => {
133182
// 显示成功消息
134183
message.success('挑战已成功提交!');
135184

185+
// 清除本地存储的表单数据
186+
localStorage.removeItem(STORAGE_KEY);
187+
136188
// 3秒后重置成功状态
137189
setTimeout(() => {
138190
setIsSubmitSuccess(false);
@@ -149,7 +201,17 @@ const ChallengeContributePage: React.FC = () => {
149201
<div style={styles.container}>
150202
<Alert
151203
message="注意事项"
152-
description="请填写完整的挑战信息,以便其他用户理解和解决此挑战。所有标记为必填的字段都必须填写。"
204+
description={
205+
<div>
206+
<p>请填写完整的挑战信息,以便其他用户理解和解决此挑战。所有标记为必填的字段都必须填写。</p>
207+
<p>表单数据会自动保存到浏览器本地存储,刷新页面后可以继续编辑。</p>
208+
<div style={{ marginTop: 8 }}>
209+
<Button size="small" danger onClick={clearSavedData}>
210+
清除已保存的数据
211+
</Button>
212+
</div>
213+
</div>
214+
}
153215
type="info"
154216
showIcon
155217
style={styles.alert}

0 commit comments

Comments
 (0)