前提・実現したいこと
デモを用意しました。
CodeSandBox
2つのプロパティを持ったオブジェクトを格納した配列に、forEach
で各オブジェクトに処理を施し、処理を施したオブジェクトを配列のstate
に格納したいです。
デモで言うと、下記のような表示を目指しています。
HOGE
hogehoge
FUGA
fugafuga
新しい配列を生成する場合はmap
を使う方が相応しいと思いますが、実際のデータの取得元がFirestore
からであり、Firestore
から取得したデータはmap
メソッドが使えないようなので、forEach
で実装したいです。
発生している問題・試したこと
処理を施したオブジェクトは配列に追加されず上書きをします。
【React】 useStateで配列を保存するときの注意点 - Qiita
上記ページを参考にして、setState([...配列のstate, 処理を施したオブジェクト])
と書いてみましたが、配列のstate
の中身は最後に処理を施したオブジェクト1つのみでした。
現状のデモはhoge
オブジェクトがfuga
オブジェクトに上書きされ、下記のようにfuga
オブジェクトのみが表示されています。
FUGA
fugafuga
該当のソースコード
javascript
1const data1 = { 2 title: "hoge", 3 text: "hogehoge" 4}; 5const data2 = { 6 title: "fuga", 7 text: "fugafuga" 8}; 9const listData = [data1, data2]; 10 11export default function App() { 12 const [array, setArray] = useState([]); 13 useEffect(() => { 14 listData.forEach((data) => { 15 const upperTitle = data.title.toUpperCase(); 16 const newData = { title: upperTitle, text: data.text }; 17 setArray([...array, newData]); 18 }); 19 }, []); 20 21 const list = array.map((item, index) => ( 22 <div key={index}> 23 <p>{item.title}</p> 24 <p>{item.text}</p> 25 </div> 26 )); 27 28 return <>{list}</>; 29}
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。