質問の回答の画面で、質問に1度答えると回答を変更できないので、変更できるように実装したい。
Q&A
Closed
ReactでMaterial-UI を使用して、Web フォームを作成しています。
期待する動作
質問の回答の画面で、質問に1度答えると回答を変更できないので、変更できるように実装したい。
どのように実装したら良いかわからない状況で、詰まっています。 どなたかアドバイスをお願いします。
Questionnaire.js
Questionnaire.js
import React from "react";
import Typography from "@mui/material/Typography";
import Radio from "@mui/material/Radio";
import RadioGroup from "@mui/material/RadioGroup";
import FormControlLabel from "@mui/material/FormControlLabel";
import FormControl from "@mui/material/FormControl";
import FormLabel from "@mui/material/FormLabel";
export const QUESTIONS = [
"現在、生命保険に加入されていますか?",
"現在、入院中ですか。また、3ヶ月以内に医師の診察・検査の結果、入院・手術を勧められたことがありますか?",
"過去、5年以内に病気やケガで手術を受けた事または継続して7日以上の入院をしたことはありますか?",
];
const Questionnaire = ({ answers, setAnswers }) => {
const handleAnswer = (answeredIndex, answer) => {
setAnswers(answers.map((e, i) => (i === answeredIndex ? answer : e)));
};
return (
<div>
<FormControl component="fieldset">
{answers
.filter((_, i) => i === 0 || answers[i - 1])
.map((answer, i) => (
<React.Fragment key={i}>
<FormLabel component="legend">{QUESTIONS[i]}</FormLabel>
{answer ? (
<Typography>{answer === "yes" ? "はい" : "いいえ"}</Typography>
) : (
<RadioGroup
row
aria-label="gender"
name="row-radio-buttons-group"
onChange={(_evt, value) => {
handleAnswer(i, value);
}}
>
<FormControlLabel value="yes" control={<Radio />} label="はい" />
<FormControlLabel value="no" control={<Radio />} label="いいえ" />
</RadioGroup>
)}
</React.Fragment>
))}
</FormControl>
</div>
);
};
export default Questionnaire;
Content.js
Content.js
import React from "react";
import { Grid } from "@mui/material";
import Stepper from "@mui/material/Stepper";
import Step from "@mui/material/Step";
import StepLabel from "@mui/material/StepLabel";
import Button from "@mui/material/Button";
import Typography from "@mui/material/Typography";
import Basic from "./Basic";
import Questionnaire, { QUESTIONS } from "./Questionnaire";
import Optional from "./Optional";
function getSteps() {
return ["お客様の情報を入力して下さい", "以下にお答え下さい", "ご相談下さい", "以下の内容をご確認下さい"];
}
const StepContent = ({ stepIndex, basicProps, questionnaireProps, optionalProps }) => {
switch (stepIndex) {
case 0:
return <Basic {...basicProps} />
case 1:
return <Questionnaire {...questionnaireProps} />;
case 2:
return <Optional {...optionalProps}/>;
case 3:
return (
<div style={{ textAlign: "center" }}>
<Basic {...basicProps} />
<Questionnaire {...questionnaireProps} />
<Optional {...optionalProps} />
</div>
);
default:
return "Unknown stepIndex";
}
};
function Content() {
const [activeStep, setActiveStep] = React.useState(0);
const [basicProfile, setBasicProfile] = React.useState({ gender: null, year: null, month: null, day: null });
const [answers, setAnswers] = React.useState(Array(QUESTIONS.length).fill(null));
const [ optionalRequest, setOptionalRequest] = React.useState({request: null});
const steps = getSteps();
const handleNext = () => {
setActiveStep((prevActiveStep) => prevActiveStep + 1);
};
const handleBack = () => {
setActiveStep((prevActiveStep) => prevActiveStep - 1);
};
const handleReset = () => {
setActiveStep(0);
};
const buttonDisabled = activeStep === 1 && answers.some((a) => !a);
return (
<Grid container>
<Grid sm={2} />
<Grid lg={8} sm={8} spacing={10}>
<Stepper activeStep={activeStep} alternativeLabel>
{steps.map((label) => (
<Step key={label}>
<StepLabel>{label}</StepLabel>
</Step>
))}
</Stepper>
{activeStep === steps.length ? (
<div style={{ textAlign: "center" }}>
<Typography>全ステップの表示を完了</Typography>
<Button onClick={handleReset}>リセット</Button>
</div>
) : (
<div>
<Typography>
<StepContent
stepIndex={activeStep}
questionnaireProps={{ answers, setAnswers }}
basicProps={{ basicProfile, setBasicProfile }}
optionalProps={{ optionalRequest, setOptionalRequest }}
/>
</Typography>
<Button disabled={activeStep === 0} onClick={handleBack}>
戻る
</Button>
<Button variant="contained" color="primary" onClick={handleNext} disabled={buttonDisabled}>
{activeStep === steps.length - 1 ? "送信" : "次へ"}
</Button>
</div>
)}
</Grid>
</Grid>
);
}
export default Content;
0