
MemberCheck Component는 탭과 폼을 통해 여러 학생의 데이터를 독립적으로 관리하는 기능을 제공합니다.
const MemberCheck = () => {
const [selectedStudent, setSelectedStudent] = useState(testStudents[0].id);
const [studentData, setStudentData] = useState({});
개발환경에서는 testStudents라는 사전 객체를 생성하여 진행함.
const handleSaveDraft = async (values) => {
try {
const response = await saveDraft({ ...values, status: 0, studentId: selectedStudent });
console.log('임시 저장 성공:', response);
} catch (error) {
console.error('임시 저장 실패:', error);
}
};
const handleSubmit = async (values) => {
try {
const response = await submitCheck({ ...values, status: 1, studentId: selectedStudent });
console.log('제출 성공:', response);
} catch (error) {
console.error('제출 실패:', error);
}
};
두 함수 모두 제작된 API 요청을 통해 데이터를 저장 또는 제출하며, 현재 선택된 학생의 ID를 포함합니다.
본 문서에서는 API에 코드 상세내용은 생략하였습니다.
const handleValuesChange = (changedValues, allValues) => {
setStudentData({
...studentData,
[selectedStudent]: allValues,
});
};
const items = testStudents.map(student => ({
key: student.id,
label: student.name,
children: (
<StudentForm
key={student.id}
studentId={student.id}
initialValues={studentData[student.id] || {}}
handleSaveDraft={handleSaveDraft}
handleSubmit={handleSubmit}
handleValuesChange={handleValuesChange}
/>
),
}));
testStudents 배열을 map 함수로 순회하여 각 학생에 대한 탭 항목을 생성합니다.
각 탭 항목은 key, label, children 속성을 가지며, key는 탭의 고유 ID, label은 탭에 표시될 이름, children은 탭의 내용입니다.
children 속성으로 각 학생에 대한 StudentForm 컴포넌트를 포함합니다.
return (
<div className="member-check-section">
<h2 className="section-title">학생 양육일지</h2>
<Tabs activeKey={selectedStudent} onChange={setSelectedStudent} items={items} />
</div>
);
};
const StudentForm = ({ studentId, initialValues, handleSaveDraft, handleSubmit, handleValuesChange }) => {
const [form] = Form.useForm();
useEffect(() => {
form.setFieldsValue(initialValues);
}, [initialValues, form]);
return (
<Form
form={form}
onFinish={handleSubmit}
layout="vertical"
onValuesChange={handleValuesChange}
initialValues={initialValues}
>
<Form.Item label="주일예배는 얼마나 참석했나요?" name="worship_attendance">
<Radio.Group>
<Radio value="1부 예배">1부 예배</Radio>
<Radio value="2부 예배">2부 예배</Radio>
<Radio value="3부 예배">3부 예배</Radio>
<Radio value="불참">불참</Radio>
</Radio.Group>
</Form.Item>
<Form.Item label="GQS 참석 여부" name="gqs" valuePropName="checked">
<Checkbox>GQS 참석 여부</Checkbox>
</Form.Item>
<Form.Item label="양육 내용" name="training_content">
<Input.TextArea className="form-item-input" />
</Form.Item>
<Form.Item label="기도 내용" name="pray_member">
<Input.TextArea className="form-item-input" />
</Form.Item>
<Form.Item label="기타 내용" name="additional_issues">
<Input.TextArea className="form-item-input" />
</Form.Item>
<Form.Item className="button-group">
<Button onClick={() => handleSaveDraft(form.getFieldsValue())}>임시 저장</Button>
<Button type="primary" htmlType="submit">제출</Button>
</Form.Item>
</Form>
);
};