86
51

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

useStateで配列要素を追加・削除・変更する方法

Posted at

##はじめに
今回はuseStateで配列を更新する方法について紹介していきます。(個人開発の備忘録も兼ねているので、何か気づいたことがあれば教えていただけると嬉しいです。)

useStateで配列要素の更新を行う場合、pushなどを使用すると再描画が走りません。理由についてはこちらに詳しく解説がありました。

Reactではstateの値が変化した時にコンポーネントが再描画されます。

stateの値の変化を、Object.is() で判定しているとのことです。なので、pushやspliceでは前回と同じ値と判定されるそうです。

そのため、pushなどは使用せずに、新たに配列を作成して保存する必要があります。

##追加
配列に要素を追加する場合はスプレット構文を使用します。

const [fruits, setFruits] = useState(['りんご', 'バナナ', 'いちご'])

const addFruits = () => {
    setFruits([...fruits, 'ドリアン'])
}

##削除
配列の特定の要素を削除したい場合は、filter()を使用して、新たに配列を作成します。
下記の例では、'バナナ'の要素を除いた配列を新たに作成して、stateの値を更新しています。

const [fruits, setFruits] = useState(['りんご', 'バナナ', 'いちご'])

const deleteFruits = () => {
    setFruits(
        fruits.filter((fruit, index) => (fruit !== 'バナナ'))
    )
}

##変更
配列の特定の要素を変更したい場合は、map()を使用して、新たに配列を作成します。
下記の例では、indexが2の要素を'ドリアン'に変更した配列を新たに作成して、stateの値を更新しています。

const [fruits, setFruits] = useState(['りんご', 'バナナ', 'いちご'])

const updateFruits = () => {
    setFruits(
        fruits.map((fruit, index) => (index === 2 ? 'ドリアン' : fruit))
    )
}

##備考

※どちらも新たに配列を生成していることが重要

86
51
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
86
51

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?