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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Material-UI

Material-UIは、Material Designを利用可能なオープンソースのReact向けUIコンポーネントキットです。

React.js

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

Q&A

解決済

2回答

1063閲覧

[React]親コンポーネントで再描画が実施されない

aiai8976

総合スコア112

Material-UI

Material-UIは、Material Designを利用可能なオープンソースのReact向けUIコンポーネントキットです。

React.js

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

0グッド

0クリップ

投稿2020/03/15 15:29

編集2020/03/16 05:33

前提・実現したいこと

子コンポーネントのテキストフィールドに入力した文字を親コンポーネントのstateで配列として管理して、各文字が表示されたchipコンポーネントを表示しようとしています。
しかし、stateは更新されるのですが、okクリック時に再描画されません。
その後、chipの削除ボタンをクリックすると削除と同時に再描画され、子コンポーネントで行なった追加ができていることが確認できます。
OKボタンをクリックした時点で再描画したいのですが、原因がわかりません。
わかる方がいましたらコメントお願いします。

該当のソースコード

const useStyles = makeStyles(theme => ({ //略 })); export default function Register_Person() { const classes = useStyles(); const [personNames, setPersonNames] = useState(['サンプル']); return ( <div className={classes.parent}> <Grid container className={classes.root_} spacing={2}> <Grid item xs={12}> <Grid container justify="center" spacing={2}> <Grid key={0} item> <FormDialog props={personNames} onSubmit={setPersonNames} /> //該当箇所 <Paper className={classes.paper_}> <div className={classes.chipGroup}> {personNames.map((name, index) => //該当箇所 <Chip  icon={<PersonIcon />} key={index} label={name} onClick={handleClick(name)} onDelete={handleDelete(index)} className={classes.chip} />)} </div> </Paper> </Grid> </Grid> </Grid> </Grid> </div> ); }
import React from 'react'; import Button from '@material-ui/core/Button'; import TextField from '@material-ui/core/TextField'; import Dialog from '@material-ui/core/Dialog'; import DialogActions from '@material-ui/core/DialogActions'; import DialogContent from '@material-ui/core/DialogContent'; import DialogContentText from '@material-ui/core/DialogContentText'; import DialogTitle from '@material-ui/core/DialogTitle'; export default function FormDialog({ props, onSubmit }) { //省略 const temp = props; const handleSubmit = () => { temp.push(inputRef.current.value); onSubmit(temp); setOpen(false); }; return ( <div> <Button variant="outlined" color="primary" onClick={handleClickOpen}> add new member </Button> <Dialog open={open} onClose={handleClose} aria-labelledby="form-dialog-title"> <DialogTitle id="form-dialog-title">名前登録</DialogTitle> <DialogContent> <DialogContentText> 名前を記入してください </DialogContentText> <TextField autoFocus margin="dense" id="name" label="Name" type="email" fullWidth inputRef={inputRef} /> </DialogContent> <DialogActions> <Button onClick={handleClose} color="primary"> Cancel </Button> <Button onClick={handleSubmit} color="primary"> OK </Button> </DialogActions> </Dialog> </div> ); }

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

自己解決

temp=[...props]

スプレッド構文を使ってこのように代入すれば解決しました。

投稿2020/03/16 07:23

aiai8976

総合スコア112

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

tempの定義が存在しないためにエラーとなっている、ということはありませんか?

投稿2020/03/15 22:48

maisumakun

総合スコア145184

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

aiai8976

2020/03/16 04:22

すみません。 他と一緒に省略していました。 追記していますので、確認お願い致します。
maisumakun

2020/03/16 05:36

配列にpushして破壊的な変更になっている(配列のインスタンスが変わらない)ので正しく動かない、という可能性が考えられます。
aiai8976

2020/03/16 07:22

スプレッド構文を用いてtempに代入する必要がありました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問