0
0

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.

【React】オブジェクトの一部プロパティ変更

Posted at

問題

アプリ内でオブジェクトに所属している一部のプロパティを変更したが、
レンダリングされなかった。

以下はボタンをクリックすれば表示されるユーザー名が"alchoding"から
"drinker"に変更するコードになるが、実際画面に表示される名前は変わらない。

import { useState } from "react";

function App() {
  const [user, setUser] = useState({
    userName: "alchoding",
    friend: null,
  });

  const changeUserName = () => {
    user.userName = "drinker";
  }
  return(
    <>
      <p>ユーザー名 : {user.userName}</p>
      <button onClick={changeUserName}></button>
    </>
  )
}

解決法

userNameプロパティを更新し、spreadを使って新しい参照を持つオブジェクトを作成する。

const changeUserName = () => {
    setUser({
      ...user,
      userName: "drinker"
    });
  };

原因

Reactはstateが変更されたらshallow compareを利用して値の変更をキャッチする。上記でuserが持つuserNameのプロパティのみが変更された場合、userオブジェクトの参照がアップデートされたわけではないためプロパティの一部が変更されても同じオブジェクトだと認識する。

使用例

アプリのプロファイルオブジェクトから名前のみを変更するなど

0
0
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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?