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

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

新規登録して質問してみよう
ただいま回答率
85.35%
TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

React.js

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

Q&A

0回答

330閲覧

React 親と子のコンポーネントの呼ばれ方

ktaaa

総合スコア59

TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

React.js

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

0グッド

1クリップ

投稿2020/02/21 01:09

編集2020/02/21 02:20

単体の削除ボタンと一括の削除ボタンがあります。
どちらのボタンも押した後はモーダル(DeleteDialogコンポーネント)が表示されます。
一括削除は親コンポーネント(index.tsx)からDialogDeleteにhandleDeleteNamesを渡しています。
単体削除は子コンポーネントのListItemコンポーネントからDialogコンポーネントにhandleDeleteを渡しています。
どちらの削除でもmodalStateを使いOpenの時にモーダルを表示しCloseの時は閉じるようにしたいのですがなぜか最初からmodalが表示されてしまいます。
表示されるのは子コンポーネントのモーダルです。初期値はcloseにしているのですがなぜなのでしょうか?

index.tsx enum ModalState {Open, Close } const {Open, Close } = ModalState; interface CheckItem { isCheck: boolean; } type nameCheckBoxItem = INames & CheckItem; interface IState { name: string; names: nameCheckBoxItem[]; modalState: ModalState; } const Index:FC<Props> = () => { const [state, setState] = useState<State>({ name: '', names: [], modalState: Close, ~省略~ const handleDelete = (deleteItem: INames) => {   // 単体の削除ボタンの処理 }; const handleDeleteNames = (checkedNames: nameCheckBoxItem[]) => {   //  一括削除ボタンの処理 }; const modalOpen = () => { setState({ ...state, modalState: Open }); }; const handleClose = () => { setState({ ...state, modalState: Open }); }; return ( <React.Fragment> <ListItemIcon> <Checkbox onChange={(_, checked) => onChangeAll(checked)} disabled={false} color="primary" /> </ListItemIcon> <Text> グループ </Text> <Button color="secondary" onClick={modalOpen} > 削除 </Button> { currentNames.map((names: nameCheckBoxItem, index: number) => ( <ListItem isCheck={names.isCheck} name={name} onDelete={handleDelete} /> )) } <DeleteDialog open={ModalState.Open=== state.modalState} handleDelete={() => handleDeleteNames(nameCheckBoxItem)} handleClose={handleClose} /> </React.Fragment> ); };
enum ModalState {Open, Close } const {Open, Close } = ModalState; interface Props { names:names; isCheck: boolean; onDelete: (name: name) => void; } const ListItem: React.FC<Props> = ({ names, isCheck, onChange, onDelete, }) => { const [modalStateB, setModalStateB] = useState<ModalState>(Close); const modalOpen = () => { setModalStateB(Open); }; const handleClose = () => { setModalStateB(Close); }; return( <Fragment>     〜 省略   〜 <IconButton disabled={false} onClick={modalOpen} > </IconButton> </ListItem> </List> <DeleteDialog open={modalStateB === ModalStates.Open} handleClose={handleClose} handleDelete={() => onDelete(names)} /> </Fragment> ); } export default ListItem;

//追記

interface Props { handleClose: () => void; handleDelete: () => void; open: boolean; } const DeleteDialog: React.FC<Props> = ({ handleDelete, handleClose, open, }) => ( <Dialog open={open} onClose={handleClose} > <DialogActions> <Button onClick={handleClose} color="primary" > キャンセル </Button> <Button onClick={handleDelete} color="secondary" autoFocus > 削除 </Button> </DialogActions> </Dialog> ); export default DeleteDialog;

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

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

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

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

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

maisumakun

2020/02/21 01:16

<DeleteDialog>の定義はどのようなものでしょうか。
m.ts10806

2020/02/21 01:41

React関係でよく回答依頼をいただきますが、タグのスコア見られたら分りますように回答不可な範囲です。 タグ別ランキングで上位にきている方に振られたほうが良いかと思います。
hoshi-takanori

2020/02/21 01:41

DeleteDialog の中で open をチェックして、true の場合のみ表示する必要があります。 ところで、ModalStates が2箇所で定義されたり、値は Open, Close なのに Show と比較してるのはなぜでしょうか? また、Index の state ですが、Hooks を使うなら name, names, modalState を個別に useState() するのが一般的だと思います。
ktaaa

2020/02/21 02:21

追記しました。
ktaaa

2020/02/21 02:22

親のmodalStateだけにするとどちらの削除ボタンを押した時も親の削除処理が呼ばれてしまうので二つ用意しました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問