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

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

詳細はこちら
コールバック

コールバックは他のコードに引数として渡されるコードのことを指します。

React.js

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

Q&A

解決済

1回答

6234閲覧

useStateの値が初期値に戻ってしまっている。

j.f15

総合スコア23

コールバック

コールバックは他のコードに引数として渡されるコードのことを指します。

React.js

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

0グッド

0クリップ

投稿2021/03/20 10:23

前提・実現したいこと

useStateで変更した値が初期値に戻ってしまうのを防ぎたいです。

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

バックエンド処理のレスポンスで取得出来ていた値が
どこかのタイミングで恐らく初期化されてしまっている。

該当のソースコード

javascript

1 //子のテーブルで表示する値 2 const [cellcsvs, setCellcsvs] = useState([]); 3 4 useEffect(() => { 5 setCells(cellcsvs); 6 //ここではcellcsvsに値が入っている。 7 console.log(cellcsvs); 8 }, [cellcsvs]); 9 10 //子に設定したテーブルのボタンクリック時に走る 11 const radioBtnCallback = useCallback((idx, e) => { 12 console.log("Show Photo: " + idx) 13 14 //ここのcellcsvsの値がから配列になってしまっている。 15 console.log(cellcsvs); 16 console.log(1010101010101); 17 idx = Number(idx); 18 setOpen(true); 19 }, []) 20 21 //バックエンド処理 22 //検索ボタン押下時 23 const handleSubmit = (e) => { 24 e.preventDefault(); 25 const dfrom = datefrom ? new Date(datefrom._d) : ''; 26 const updatefrom = datefrom ? `${dfrom.getFullYear().toString().padStart(4, '0')}/${(dfrom.getMonth() + 1).toString().padStart(2, '0')}/${dfrom.getDate().toString().padStart(2, '0')}` : ''; 27 const dto = dateto ? new Date(dateto._d) : ''; 28 const updateto = dateto ? `${dto.getFullYear().toString().padStart(4, '0')}/${(dto.getMonth() + 1).toString().padStart(2, '0')}/${dto.getDate().toString().padStart(2, '0')}` : ''; 29 // console.log(company_cd, project_cd, user_id, filename, updatefrom, updateto, examno); 30 31 SpecimenService.getMediCsv(company_cd, project_cd, user_id, filename, updatefrom, updateto, examno).then((resp) => { 32 33 //レスポンスの値セット 34 setCellcsvs(resp.data); 35 }); 36 }; 37 38 39return ( 40 <Box p={1}> 41 {(() => { 42 if (cellcsvs.length) { 43 //検索結果を一覧表示するテーブル 44 return <SpecimenMedicalResultTable data={cellcsvs} callback={radioBtnCallback} /> 45 } 46 })()} 47 48 </Box> 49 );

※コード量が多いため重要そうな箇所のソースコードだけ載せています。

試したこと

同じような問題が発生している方がいないか調べて見たのですが見つけることができず、
ダメもとで(新たにtest変数を追加)

javascript

1 const [cellcsvs, setCellcsvs] = useState([]); 2 var test = []; 3 4 useEffect(() => { 5 setCells(cellcsvs); 6 console.log(cellcsvs); 7 //ここでもtestには値が入っている。 8 test = cellcsvs; 9 }, [cellcsvs]); 10 11const radioBtnCallback = useCallback((idx, e) => { 12 console.log("Show Photo: " + idx) 13 console.log(test); 14 console.log(cellcsvs); 15 console.log(1010101010101); 16 idx = Number(idx); 17 setOpen(true); 18 19 // while (cells[i].) { 20 21 // } 22 }, [])

のような実装方法も試してみましたがこれもコールバック内では値が空配列になってしまっていました。
useEffectなどで問題が発生してしまっているかなど考えていますが、理解が浅く
自己解決することが難しかったためどなたかご教授をお願いします。

他に確認したいファイル等ありましたら教えてください。

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

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

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

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

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

guest

回答1

0

ベストアンサー

useCallbackは第二引数の配列の値が変わらない限り関数内で使用されている変数など更新されません
よってuseCallbackを使う場合は基本的に第二引数に関数内で使われている関数外で定義された変数を記述する必要があります
今回は次のようにすれば良いはずです

jsx

1 const radioBtnCallback = useCallback((idx, e) => { 2 console.log("Show Photo: " + idx) 3 4 //ここのcellcsvsの値がから配列になってしまっている。 5 console.log(cellcsvs); 6 console.log(1010101010101); 7 idx = Number(idx); 8 }, [cellcsvs])

投稿2021/03/20 12:56

編集2021/03/20 12:58
mikan3rd

総合スコア220

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

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

j.f15

2021/03/20 13:02 編集

回答ありがとうございます。 無事に値を取得することが出来ました。 reactの理解が浅かったので解説本当に助かります。 ご丁寧にソースコードも書いてくださって理解しやすかったです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問