みかづきブログ・カスタム

基本的にはちょちょいのほいです。

ReactのuseStateで管理されている配列内のオブジェクトを更新する 🍛

https://cdn-ak.f.st-hatena.com/images/fotolife/k/kimizuka/20210416/20210416093201.png

文章での表現がすごく難しいのですが、

const [list, setList] = useState([{
  color: 'red',
  text: 'Ya-Ha-!'
},{
  color: 'blue',
  text: 'Yo-Ho-!'
},{
  color: 'yellow',
  text: 'Ya-Ha-!'
},{
  color: 'green',
  text: 'Yo-Ho-!'
}]);

と、いう感じでuseStateで管理されている配列にオブジェクトを収納し、

list[0].text = 'Yo-Ho-!';

と、オブジェクトのプロパティを更新しても、

<ul>
  { list.map((item, i) => <li key={ i }>{ item.text }</li> }
</ul>

とかで作られたDOMのテキストは更新されません。stateの値の変化が検知できないからです。
先頭のオブジェクトのtextプロパティを 'Yo-Ho-!' に変更したいのであれば、

const tmp = [];

list.forEach((item, i) => {
  if (i === 0) {
    tmp.push({ ...item, text: 'Yo-Ho-!' });
  } else {
    tmp.push(item);
  }
});

setList(tmp);

という感じで、setListに新しい配列を渡してあげることで期待する動作になります。


DEMO

addボタンをクリックするとでリストが追加され、リストをクリックするとテキストと文字色が変更されます。