JavaScriptとReactでオブジェクトを扱う:詳細解説とサンプルコード
Reactコンポーネントの状態にオブジェクトを格納する方法
状態にオブジェクトを格納する例
import React, { useState } from 'react';
function MyComponent() {
const [state, setState] = useState({
name: 'Taro',
age: 30,
occupation: 'Software Engineer'
});
return (
<div>
<p>名前:{state.name}</p>
<p>年齢:{state.age}</p>
<p>職業:{state.occupation}</p>
</div>
);
}
この例では、useState
フックを使用してコンポーネントの状態を初期化しています。状態は { name: 'Taro', age: 30, occupation: 'Software Engineer' }
というオブジェクトです。
コンポーネントは、state.name
、state.age
、state.occupation
プロパティを使用してオブジェクト内の値にアクセスできます。
状態を更新する方法
コンポーネントの状態を更新するには、setState
関数を使用します。setState
関数には、新しい状態オブジェクトを渡します。
setState({
name: 'Hanako',
age: 31,
occupation: 'Designer'
});
このコードを実行すると、コンポーネントの状態が更新され、レンダリングが再実行されます。レンダリングが再実行されると、コンポーネントは新しい状態を反映した新しい DOM を生成します。
オブジェクトの状態を更新する場合、オブジェクト全体を置き換えるのではなく、個々のプロパティのみを更新するようにしてください。オブジェクト全体を置き換えると、パフォーマンスの問題が発生する可能性があります。
setState((prevState) => ({
...prevState,
age: prevState.age + 1
}));
このコードは、age
プロパティのみを更新し、他のプロパティはそのまま保持します。
サンプルコード:ユーザー情報とカウントアップ機能を持つReactコンポーネント
- ユーザーの名前、年齢、職業を表示する
- ボタンをクリックするたびに年齢を1カウントアップする
コンポーネントの状態には、ユーザー情報とカウントを格納するオブジェクトを使用します。
import React, { useState } from 'react';
function User({ name, age, occupation, onAgeUp }) {
return (
<div>
<p>名前:{name}</p>
<p>年齢:{age}</p>
<p>職業:{occupation}</p>
<button onClick={onAgeUp}>年齢を上げる</button>
</div>
);
}
function App() {
const [user, setUser] = useState({
name: 'Taro',
age: 30,
occupation: 'Software Engineer'
});
const handleAgeUp = () => {
setUser((prevState) => ({
...prevState,
age: prevState.age + 1
}));
};
return (
<div>
<User
name={user.name}
age={user.age}
occupation={user.occupation}
onAgeUp={handleAgeUp}
/>
</div>
);
}
このコードでは、以下の点に注目してください。
User
コンポーネントは、name
、age
、occupation
、onAgeUp
という4つのプロパティを受け取ります。name
:ユーザーの名前occupation
:ユーザーの職業onAgeUp
:年齢をカウントアップする関数を呼び出すための関数
App
コンポーネントは、user
という状態変数を使用してユーザー情報を保持します。handleAgeUp
関数は、user
の状態を更新して年齢を1カウントアップします。User
コンポーネントは、onClick
イベントハンドラーを使用してhandleAgeUp
関数を呼び出します。
このサンプルコードを拡張して、より複雑なアプリケーションを作成することができます。
Reactコンポーネントの状態にオブジェクトを格納するその他の方法
Context APIは、コンポーネント階層全体でデータを共有するための方法です。コンポーネントの状態をグローバルな状態として管理したい場合に役立ちます。
import React, { useContext, useState } from 'react';
const UserContext = React.createContext();
function User({ name, age, occupation }) {
return (
<div>
<p>名前:{name}</p>
<p>年齢:{age}</p>
<p>職業:{occupation}</p>
</div>
);
}
function App() {
const [user, setUser] = useState({
name: 'Taro',
age: 30,
occupation: 'Software Engineer'
});
return (
<UserContext.Provider value={user}>
<div>
<User />
</div>
</UserContext.Provider>
);
}
このコードでは、UserContext
というコンテキストを作成しています。User
コンポーネントは、useContext
フックを使用してコンテキストからユーザー情報にアクセスできます。
Reduxを使用する
Reduxは、単一ストアでアプリケーションの状態を管理するためのライブラリです。複雑なアプリケーションで状態を管理する場合に役立ちます。
import React from 'react';
import { Provider } from 'react-redux';
import { createStore } from 'redux';
const initialState = {
user: {
name: 'Taro',
age: 30,
occupation: 'Software Engineer'
},
count: 0
};
const reducer = (state = initialState, action) => {
switch (action.type) {
case 'AGE_UP':
return {
...state,
user: {
...state.user,
age: state.user.age + 1
}
};
default:
return state;
}
};
const store = createStore(reducer);
function User() {
const dispatch = useDispatch();
const user = useSelector((state) => state.user);
return (
<div>
<p>名前:{user.name}</p>
<p>年齢:{user.age}</p>
<p>職業:{user.occupation}</p>
<button onClick={() => dispatch({ type: 'AGE_UP' })}>年齢を上げる</button>
</div>
);
}
function App() {
return (
<Provider store={store}>
<div>
<User />
</div>
</Provider>
);
}
このコードは、Reduxを使用してアプリケーションの状態を管理しています。User
コンポーネントは、useDispatch
フックを使用してストアにアクションをディスパッチし、useSelector
フックを使用してストアから状態を取得できます。
MobXを使用する
MobXは、状態を自動的に管理するライブラリです。Reduxよりもシンプルで使いやすいのが特徴です。
import React from 'react';
import { observer } from 'mobx';
import { observable, computed, action } from 'mobx';
class UserStore {
@observable user = {
name: 'Taro',
age: 30,
occupation: 'Software Engineer'
};
@computed
get ageText() {
return `年齢:${this.user.age}`;
}
@action
ageUp() {
this.user.age += 1;
}
}
const userStore = new UserStore();
const User = observer(() => {
const user = userStore.user;
return (
<div>
<p>名前:{user.name}</p>
<p>{userStore.ageText}</p>
<p>職業:{user.occupation}</p>
<button onClick={userStore.ageUp}>年齢を上げる</button>
</div>
);
});
function App() {
return (
<div>
<User />
</div>
);
}
このコードは、MobXを使用してアプリケーションの状態
javascript reactjs