質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
87.20%
React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

解決済

『TypeError: Cannot read properties of undefined (reading 'filter')』 エラーを改善したい

edu
edu

総合スコア30

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

1回答

0評価

0クリップ

2271閲覧

投稿2021/11/03 02:35

編集2021/11/04 02:41

ReactでMaterial-UI を使用して、Web フォームを作成しています。

『TypeError: Cannot read properties of undefined (reading 'filter')』  src/components/Questionnaire.js:24
21 | <div>
22 | <p>Questionnaire</p>
23 | <Optional />
24 | ◉ <FormControl component="fieldset">
25 |        {answers
26 | .filter((_, i) => i === 0 || answers[i - 1])
27 | .map((answer, i) => (

というエラーの表示が出て、どのように実装したら良いかわからない状況で、詰まっています。 何方かアドバイスをお願いします。
期待する動作
『TypeError: Cannot read properties of undefined (reading 'filter')』  src/components/Questionnaire.js:24を改善したい
問題解決のため行ったこと
useContextを使用して、Confirm.js に基本情報入力及び質問の回答を確認画面に表示するように実装したら、エラーが出た。

App.js

import "./App.css"; import { Grid } from "@mui/material"; import Header from "./components/Header"; import Content from "./components/Content"; function App() { return ( <Grid container direction="column"> <Header /> <div style={{ padding: 30 }}> <Content /> </div> </Grid> ); } export default App;

src / components / contents.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"; import Confirm from "./Confirm"; unction getSteps() { return ["お客様の情報を入力して下さい", "以下にお答え下さい", "ご相談下さい", "以下の内容をご確認下さい"]; } const StepContent = ({ stepIndex, questionnaireProps }) => { switch (stepIndex) { case 0: return <Basic />; case 1: return <Questionnaire {...questionnaireProps} />; case 2: return <Optional />; case 3: return <Confirm />; default: return "Unknown stepIndex"; } }; function Content() { const [activeStep, setActiveStep] = React.useState(0); const [answers, setAnswers] = React.useState(Array(QUESTIONS.length).fill(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> <Typography>全ステップの表示を完了</Typography> <Button onClick={handleReset}>リセット</Button> </div> ) : ( <div> <Typography> <StepContent stepIndex={activeStep} questionnaireProps={{ answers, setAnswers }} /> </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;

src / components / Basics.js

import React from "react"; 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"; import InputLabel from "@mui/material/InputLabel"; import Select from "@mui/material/Select"; import Questionnaire from "./Questionnaire"; const Basic = () => { return ( <> <div style={{ textAlign: "center" }}> <p>Basic</p> <Questionnaire /> <FormControl component="fieldset"> <FormLabel component="legend">- 性別 -</FormLabel> <RadioGroup row aria-label="gender" name="row-radio-buttons-group"> <FormControlLabel value="male" control={<Radio />} label="男性" /> <FormControlLabel value="female" control={<Radio />} label="女性" /> </RadioGroup> </FormControl> </div> <div style={{ textAlign: "center" }}> <p>Basic</p> <Questionnaire /> <FormLabel component="legend">- 生年月日 -</FormLabel> <FormControl sx={{ m: 1, minWidth: 120 }}> <InputLabel htmlFor="grouped-native-select">year</InputLabel> <Select native defaultValue="" id="grouped-native-select" label="Grouping"> <option aria-label="None" value="" /> <optgroup label="year"> {Array.from(Array(2020), (_, num) => ( <option key={num} value={num + 1}> {num + 1990} </option> ))} </optgroup> </Select> </FormControl> <FormControl sx={{ m: 1, minWidth: 120 }}> <InputLabel htmlFor="grouped-native-select">month</InputLabel> <Select native defaultValue="" id="grouped-native-select" label="Grouping"> <option aria-label="None" value="" /> <optgroup label="month"> {Array.from(Array(12), (_, num) => ( <option key={num} value={num + 1}> {num + 1} </option> ))} </optgroup> </Select> </FormControl> <FormControl sx={{ m: 1, minWidth: 120 }}> <InputLabel htmlFor="grouped-native-select">day</InputLabel> <Select native defaultValue="" id="grouped-native-select" label="Grouping"> <option aria-label="None" value="" /> <optgroup label="day"> {Array.from(Array(12), (_, num) => ( <option key={num} value={num + 1}> {num + 1} </option> ))} </optgroup> </Select> </FormControl> </div> </> ); }; export default Basic;

src / components / 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"; import Optional from "./Optional"; 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> <p>Questionnaire</p> <Optional /> <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;

src / components / Optional.js

import React from "react"; import { Grid } from "@mui/material"; import Tooltip from "@mui/material/Tooltip"; import TextField from "@mui/material/TextField"; const Optional = () => { return ( <div> <p>Optional</p> <Grid container> <Grid sm={2} /> <Grid lg={8} sm={8} spacing={10}> <Tooltip title="ご相談内容を記入することができます" placement="top-start" arrow> <TextField label="ご相談内容" fullWidth margin="normal" rows={4} multiline variant="outlined" placeholder="その他ご要望等あれば、ご記入ください" /> </Tooltip> </Grid> </Grid> </div> ); }; export default Optional;

src / components / Confirm.js

import React from "react"; import Basic from "./Basic"; const Confirm = () => { return ( <div style={{ textAlign: "center" }}> <Basic /> </div> ); }; export default Confirm;

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

まだ回答がついていません

会員登録して回答してみよう

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。