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

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

新規登録して質問してみよう
ただいま回答率
85.35%
JavaScript

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

React.js

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

Q&A

解決済

1回答

5887閲覧

useStateの初期値を空配列にした後スプレッド構文を使うとエラーが出る

butsuli_shine

総合スコア29

JavaScript

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

React.js

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

0グッド

0クリップ

投稿2021/04/15 06:30

実現したいこと

useState()で配列を状態管理したい

[ { foo: "foo", hoge: "hoge" } ]

のようなオブジェクトの配列の末尾にsetStateで追加していきたい

起こっていること

const [data, setData] = useState([]); setData(...data, {何かしらのデータ});

のようにイベントリスナーにsetData()を記述したいのですが
setData()のところで
data is not iterable というエラーがでます

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

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

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

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

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

guest

回答1

0

ベストアンサー

setDataには配列を渡す必要があるので

js

1setData([...data, {何かしらのデータ}]);

これが正しいと思います。

追記

useState([])で受け取ったdataという変数の型がObject型になってる

コメントで上記の指摘をいただいたのですが、
同じような処理をするコードを書いたところuseStateで受け取るdataは配列のようでした(setData([...data, ...sample])が正常動作しているため)。

js

1import { useState } from 'react'; 2 3// 追加されるであろう想定のデータ 4const sample = [ 5 { 6 foo: "foo", 7 hoge: "hoge" 8 } 9] 10 11const Sample = () => { 12 const [data, setData] = useState([]); 13 return ( 14 <div className="App"> 15 <p>{data.length}</p> 16 <button onClick={() => { 17 setData([...data, ...sample]) 18 }}> 19 data追加 20 </button> 21 </div> 22 ); 23} 24 25export default Sample;

その上でなのですが、setData以外でdataが破損してしまうような処理を挟んでないでしょうか?

投稿2021/04/15 06:40

編集2021/04/15 08:01
nekoniki

総合スコア2411

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

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

butsuli_shine

2021/04/15 06:57 編集

すみません、こちらのコードを[]を忘れていました。 ``` setData([...data, {データ}]); ``` でやってみたのですがダメでした
nekoniki

2021/04/15 07:06

上記の場合でも同じエラーが出ますか? その場合`{データ}`としている箇所の具体的な中身が知りたいです。
butsuli_shine

2021/04/15 07:20

同じエラーですね is not iterableなので typeof()で見てみたところusestateで初期値を[]にしてもObject型になっていました. データの中身は RESAS API の 人口構成の情報で https://opendata.resas-portal.go.jp/docs/api/v1/population/composition/perYear.html のsampleのところの [{ "year": 1980, "value": 12817 }, { "year": 1985, "value": 12707 }, { "year": 1990, "value": 12571 }, { "year": 1995, "value": 12602 }, { "year": 2000, "value": 12199 }, { "year": 2005, "value": 11518 }, { "year": 2010, "value": 10888 }, { "year": 2015, "value": 10133 }, { "year": 2020, "value": 9275 }, { "year": 2025, "value": 8431 }, { "year": 2030, "value": 7610 }, { "year": 2035, "value": 6816 }, { "year": 2040, "value": 6048 }, { "year": 2045, "value": 5324 }] これですね
nekoniki

2021/04/15 07:41

ということは setData([...data, {データ}]); にある`{データ}`はオブジェクトではなくオブジェクトの配列ということですよね。 であれば、 setData([...data, ...データ]); でどうでしょうか?
butsuli_shine

2021/04/15 07:55 編集

それでやってみたのですが同じエラーです... 私の予想なのですが useState([])で受け取ったdataという変数の型がObject型になってるんですよね 本来Array型になるはずなんですけど Object型にはスプレッド構文が使えないのでそれが原因ではないですかね
nekoniki

2021/04/15 08:02

上記コメントを受けて回答に追記しました。 途中でdataがオブジェクトに変わっていない限り、useStateで受け取ったdataは配列として扱えていると思いますが、そもそも追記のコードのような処理を行っているという認識で合ってますでしょうか?
butsuli_shine

2021/04/15 08:16

上記のような処理を書いていました。 APIから受け取ったデータをtypeof()で見てみたのですが 配列にもかかわらずobjectと表示されました。 破損する処理はやってないと思いますがApp.jsで状態管理をしてそれを子コンポーネントにpropsで渡してるくらいですかね
nekoniki

2021/04/15 08:44 編集

APIキーを取得して、2点修正したところエラーがなくなりました。 どちらもApp.jsでRadioButtonsを呼び出すところで ①setPopulationDataのタイポ(setPupulationDataとなっていました)を修正 ②populationDataの渡し方を修正 →populationData={{populationData}}ではなくpopulationData={populationData} これで意図した挙動になっているか不明なのでご確認ください。
butsuli_shine

2021/04/15 09:16

本当にありがとうございます。 感謝してもしきれません。 確認してみます。
butsuli_shine

2021/04/15 13:20

試してみたところ、うまくいきました... タイポのミスくらい自分で気づけよって感じですよね。 本当にご迷惑をおかけしました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問