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

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

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

Next.jsは、Reactを用いたサーバサイドレンダリングなどを行う軽量なフレームワークです。Zeit社が開発しており、nextコマンドでプロジェクトを作成することにより、開発環境整備が整った環境が即時に作成できます。

JavaScript

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

React.js

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

Q&A

解決済

2回答

1534閲覧

ReactのuseStateで配列の指定した要素のみを更新する方法

react.js

総合スコア2

Next.js

Next.jsは、Reactを用いたサーバサイドレンダリングなどを行う軽量なフレームワークです。Zeit社が開発しており、nextコマンドでプロジェクトを作成することにより、開発環境整備が整った環境が即時に作成できます。

JavaScript

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

React.js

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

0グッド

0クリップ

投稿2021/09/30 14:32

編集2021/09/30 23:27

前提・実現したいこと

ReactのuseStateで配列の指定した要素のみを更新する方法が知りたいです。

発生している問題

useStateで配列に要素を新たに追加する方法はわかるが、配列の指定した要素のみを更新する方法がわからない。

該当のソースコード

ソースコードはサンプルです。

以下のようにすれば、animalsの末尾に"rabbit"が追加されるのは理解できています。

js

1const [animals, setAnimals] = useState(["dog", "cat", "pig", "bird"]); 2setAnimals(prevState => [...prevState, "rabbit"])

しかし、例えばanimalsの2つ目の要素である"cat"を"wolf"に更新したい場合、
setAnimals()の記述方法がわかりません。

試したこと

以下のように記述しましたが、Cannot set properties of undefinedが出てうまく更新できなかった。

js

1const [animals, setAnimals] = useState(["dog", "cat", "pig", "bird"]); 2setAnimals(prevState => { 3 const newAnimals = prevState 4 newAnimals[1] = "wolf" 5})

また、ネットでググりましたが、配列の指定した要素を更新するような書き方は見つかりませんでした。
もしかしたらuseStateでは実現できないのでしょうか?

どなたか方法がわかる方がいれば教えていただけると嬉しいです。

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

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

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

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

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

sooogle

2021/09/30 15:24

タグにnuxt.jsとありますが、ReactなのでNext.jsの間違いではないでしょうか?
react.js

2021/09/30 23:27

失礼しました。 ご指摘の通りです。 next.jsに修正致しました。
guest

回答2

0

setAnimalsに渡すのは、prevStateを受け取って更新後のstateを返す関数です。
参考: React公式ドキュメント

現在の実装では戻りがないので、stateがundefinedに更新されてしまっているのだと思います。

javascript

1setAnimals((prevState) => { 2 const newAnimals = [...prevState]; // 再レンダリングさせるため、新しい配列を生成 3 newAnimals[1] = 'wolf'; 4 return newAnimals; 5});

とするといいでしょう。

投稿2021/09/30 15:20

sooogle

総合スコア55

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

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

react.js

2021/09/30 23:29

ありがとうございます。 明示的にreturnが必要なのですね。 後ほど試してみます。
guest

0

ベストアンサー

こんなんも。

javascript

1setAnimals(prevAnimals => prevAnimals.map((animal, i) => i === 1 ? "wolf" : animal))

サンプル

ゆうて関数にする必要ないねんから、

javascript

1setAnimals(animals.map((animal, i) => i === 1 ? "wolf" : animal))

でえかった ➡ サンプル

投稿2021/09/30 23:27

編集2021/09/30 23:31
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

react.js

2021/09/30 23:30

ありがとうございます。 mapを使う方法があったのですね。 後ほど試してみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問