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

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

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

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

Q&A

0回答

1034閲覧

react のレンダリング(深い階層のもつオブジェクト)

eng___

総合スコア5

React.js

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

0グッド

1クリップ

投稿2021/05/29 09:35

下記のような Chapter を react の setState で状態管理しています。

typescript

1type Question = { 2 title: string; 3 body: string; 4 answers: string[]; 5} 6 7 8type Chapter = { 9 title: string; 10 questions: Question[]; 11}

下記のように、chapters の中の questions に対して、map で TestQuestionというコンポーネントを展開して表示しています(タイトルを示すぐらいのもの)。

react

1const Test = () => { 2 const [chapters, setChapters] = useState<Chapter[] | undefined>() 3 4 return ( 5 <div> 6 {chapters && chapters?.questions && chapters.questions.map(question => ( 7 <TestQuestion question={question} /> 8 ) 9 </div> 10 ) 11}

chapters(配列)の中の questions を下記のようなメソッドで変更したところ、chapters は変わっているのですが(コンソールで確認済み)、<TestQustion />はレンダリングされず、困っております。

typescript

1// 更新処理 2const changeChapters = (index:number, newTitle:string) => { 3 let arr = [...chapters] 4 arr[index]["questions"]["title"] = newTitle 5 setChapters(arr) 6}

[...chapters] を使い、配列を再生成?しているため、レンダリングされると思ったのですが、うまくいかず。。おそらく、階層が深い questions を更新しているため、レンダリングの判定で 前回のオブジェクトと同じだと認識されているのではないかと思います。

このような、オブジェクトの中に配列を持ち、その中のオブジェクトを更新するケースに置いて、値を更新後にレンダリングさせるにはどうすれば良いでしょうか。

何卒よろしくお願いします。

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

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

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

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

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

hoshi-takanori

2021/05/29 16:54

chapters だけでなく、Chapter や Question も作り直す必要があります。 あと、arr[index]["questions"] は配列なので、もう一つ index が必要では。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問