🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Material-UI

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

React.js

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

Q&A

解決済

1回答

1857閲覧

Reactで子テーブルのデータ削除後、反映された子テーブルを描画したい。

j.f15

総合スコア23

Material-UI

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

React.js

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

0グッド

0クリップ

投稿2021/03/29 05:05

前提・実現したいこと

親コンポーネントで子テーブルの指定行のデータを削除した後に
削除が反映された子テーブルを描画したい。

発生している問題・エラーメッセージ

現状はエラーメッセージ等は無く、テーブル削除の処理を行っても子テーブルに反映されていない状態です。

該当のソースコード

※所々のソースコードは省かせてもらっています。(見たいコード等ありましたら教えてください。)

・親コンポーネント

javascript

1export default function SpecimenMerge(props) { 2 3const [mergedJson, setMergedJson] = useState(''); 4 5//Deleteボタン押下時に処理 6 const onSelect = (idx) => { 7 const result = window.confirm('Are you sure you want to delete it?'); 8 if (!result) return; 9 // console.log("filter処理テスト"); 10 let deleteAfterData; 11 deleteAfterData = mergedJson.filter((r, index) => index != idx + 1); 12 13 console.log(Object.is(deleteAfterData, mergedJson)); 14 setMergedJson(deleteAfterData); 15 }; 16 17 18 return( 19 <Box p={1}> 20 21 {(() => { 22 if (mergedJson != null) { 23 { 24 return mergedJson ? <div><SpecimenMergeResultTable datas={mergedJson} onSelect={onSelect} /></div> : 25 <TextField id="remarks" size="small" label="Data Loding..." disabled="true" fullWidth variant="outlined" /> 26 } 27 } else { 28 return <TextField id="table" size="small" label="No merge result" disabled="true" fullWidth variant="outlined" /> 29 } 30 })()} 31 </Box> 32 ); 33}

・子コンポーネント

javascript

1export default function SpecimenMergeResultTable(props) { 2 const onSelect = props.onSelect; 3 const [datas, setDatas] = useState(props.datas); 4 console.log("************"); 5 console.log(props); 6 console.log("************"); 7 8 9 return( 10 <TableBody> 11 {stableSort(rows, getSorting(order, orderBy)) 12 .slice(page * rowsPerPage, page * rowsPerPage + rowsPerPage) 13 .map((row, i) => { 14 return ( 15 <TableRow 16 hover 17 tabIndex={-1} 18 key={i} 19 classes={{ root: classes.tableRow, }} 20 > 21 <TableCell key='firstIndex'>{page * rowsPerPage + i + 1}</TableCell> 22 {header.slice(0, header.length - 1).map((h, hi) => 23 <TableCell key={hi}>{row[h.id]}</TableCell>)} 24 <TableCell key='lastIndex'> 25 <Button size="small" variant="outlined" onClick={() => onSelect(i)}> 26 Delete 27 </Button> 28 </TableCell> 29 </TableRow> 30 ); 31 })} 32 {emptyRows > 0 && ( 33 <TableRow key='emptyIndex' style={{ height: (dense ? 33 : 53) * emptyRows }}> 34 <TableCell colSpan={6} /> 35 </TableRow> 36 )} 37 </TableBody> 38 ); 39}

試したこと

まず、親コンポーネント側でObject.is関数で同じ値ではないか確認しました。(同じ場合再レンダリングされないため)
結果はfalseとなっていました。また値を変更した時に再レンダリングされていない等の場合も考えて
ボタン押下処理内で setMergedJson(null); のような処理を試してみました。
その結果はnullの場合のNo merge resultのような描画がされ、再レンダリングされている事が確認できました。

次に子コンポーネントで変更された値がpropsに渡ってきているかを確認しましたが
結果は削除処理後の正常な値が送られてきていました。

以上のことを試してみましたが自己解決が難しかったため
お手数をおかけしますがご教示をお願いしたいです。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答1

0

自己解決

自己解決出来ました。
子コンポーネントの以下の箇所で値を取得してきているのですが

const [datas, setDatas] = useState(props.datas); console.log("************"); console.log(props); console.log("************");

ログで出しているpropsの値は変更後も呼び出されますが、
datas変数はuseStateで最初に代入しているだけなので
datasの値は削除前の値をずっと保持してしまっているという事が原因でした。

投稿2021/03/29 06:24

j.f15

総合スコア23

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問