【Reactチュートリアル】親コンポーネントから子コンポーネントの状態を変更
React.js で親コンポーネントから子コンポーネントの状態を変更する方法
Props を介して状態を更新する
最も一般的な方法は、親コンポーネントから子コンポーネントに props
を渡して、子コンポーネント内で状態更新用の関数を実行できるようにすることです。
親コンポーネント
import React, { useState } from 'react';
function ParentComponent() {
const [count, setCount] = useState(0);
const incrementCount = () => {
setCount(count + 1);
};
return (
<div>
<ChildComponent count={count} incrementCount={incrementCount} />
</div>
);
}
import React from 'react';
function ChildComponent({ count, incrementCount }) {
return (
<div>
<p>カウント: {count}</p>
<button onClick={incrementCount}>カウントアップ</button>
</div>
);
}
この例では、親コンポーネントは count
という状態と、incrementCount
という関数を持つ ChildComponent
に props
として渡されます。ChildComponent
は count
を表示し、incrementCount
をクリックすると親コンポーネントの count
状態を更新するボタンを持っています。
Context を介して状態を共有する
Context
API を使用すると、親コンポーネントから子コンポーネントに状態を共有することができます。これは、複数のコンポーネント階層にわたって状態を共有する必要がある場合に役立ちます。
import React, { useState, createContext } from 'react';
const CountContext = createContext();
function ParentComponent() {
const [count, setCount] = useState(0);
return (
<CountContext.Provider value={{ count, setCount }}>
<ChildComponent />
</CountContext.Provider>
);
}
import React, { useContext } from 'react';
const CountContext = createContext();
function ChildComponent() {
const { count, setCount } = useContext(CountContext);
return (
<div>
<p>カウント: {count}</p>
<button onClick={() => setCount(count + 1)}>カウントアップ</button>
</div>
);
}
この例では、CountContext
という名前の Context
が作成されます。親コンポーネントは CountContext.Provider
を使用して count
と setCount
を Context
に提供します。ChildComponent
は useContext
フックを使用して Context
から値を取得し、状態を更新するために使用します。
状態管理ライブラリを使用する
Redux や MobX などの状態管理ライブラリを使用すると、より複雑なアプリケーションにおける状態管理を容易にすることができます。これらのライブラリは、単一のストアに集中管理された状態を提供し、親コンポーネントと子コンポーネント間で状態を共有するための仕組みを提供します。
状態管理ライブラリの使用方法はライブラリによって異なりますが、一般的には以下の手順で行います。
- ストアを作成する
- アクションを作成する
- リデューサーを作成する
- コンポーネントをストアに接続する
これらの方法の詳細については、それぞれのライブラリのドキュメントを参照してください。
React.js で親コンポーネントから子コンポーネントの状態を変更するには、いくつかの方法があります。それぞれの方法には長所と短所があるため、アプリケーションの要件に応じて適切な方法を選択する必要があります。
React.js で親コンポーネントから子コンポーネントの状態を変更する サンプルコード
Props を介して状態を更新する
// 親コンポーネント
import React, { useState } from 'react';
function ParentComponent() {
const [count, setCount] = useState(0);
const incrementCount = () => {
setCount(count + 1);
};
return (
<div>
<ChildComponent count={count} incrementCount={incrementCount} />
</div>
);
}
// 子コンポーネント
import React from 'react';
function ChildComponent({ count, incrementCount }) {
return (
<div>
<p>カウント: {count}</p>
<button onClick={incrementCount}>カウントアップ</button>
</div>
);
}
Context を介して状態を共有する
// 親コンポーネント
import React, { useState, createContext } from 'react';
const CountContext = createContext();
function ParentComponent() {
const [count, setCount] = useState(0);
return (
<CountContext.Provider value={{ count, setCount }}>
<ChildComponent />
</CountContext.Provider>
);
}
// 子コンポーネント
import React, { useContext } from 'react';
const CountContext = createContext();
function ChildComponent() {
const { count, setCount } = useContext(CountContext);
return (
<div>
<p>カウント: {count}</p>
<button onClick={() => setCount(count + 1)}>カウントアップ</button>
</div>
);
}
Redux を使用する
// 親コンポーネント
import React from 'react';
import { connect } from 'react-redux';
function ParentComponent(props) {
const incrementCount = () => {
props.dispatch({ type: 'INCREMENT_COUNT' });
};
return (
<div>
<ChildComponent count={props.count} incrementCount={incrementCount} />
</div>
);
}
function mapStateToProps(state) {
return {
count: state.count,
};
}
function mapDispatchToProps(dispatch) {
return {
dispatch,
};
}
export default connect(mapStateToProps, mapDispatchToProps)(ParentComponent);
// 子コンポーネント
import React from 'react';
import { connect } from 'react-redux';
function ChildComponent(props) {
return (
<div>
<p>カウント: {props.count}</p>
<button onClick={props.incrementCount}>カウントアップ</button>
</div>
);
}
function mapStateToProps(state) {
return {
count: state.count,
};
}
export default connect(mapStateToProps)(ChildComponent);
// reducer
function counterReducer(state = { count: 0 }, action) {
switch (action.type) {
case 'INCREMENT_COUNT':
return { count: state.count + 1 };
default:
return state;
}
}
// store
const store = createStore(counterReducer);
// アプリケーションのルート
import React from 'react';
import { Provider } from 'react-redux';
import ParentComponent from './ParentComponent';
function App() {
return (
<Provider store={store}>
<ParentComponent />
</Provider>
);
}
export default App;
これらのサンプルコードはあくまでも基本的な例であり、実際のアプリケーションでは状況に合わせて拡張する必要があります。
React.js で親コンポーネントから子コンポーネントの状態を変更する その他の方法
refs
を使用すると、親コンポーネントから子コンポーネントのインスタンスに直接アクセスできます。その後、子コンポーネントのメソッドを呼び出して状態を更新することができます。
この方法はあまり一般的ではありませんが、シンプルなユースケースで使用できます。
// 親コンポーネント
import React, { useRef } from 'react';
function ParentComponent() {
const childRef = useRef(null);
const incrementCount = () => {
if (childRef.current) {
childRef.current.incrementCount();
}
};
return (
<div>
<ChildComponent ref={childRef} />
<button onClick={incrementCount}>カウントアップ</button>
</div>
);
}
// 子コンポーネント
import React from 'react';
function ChildComponent(props) {
const [count, setCount] = useState(0);
const incrementCount = () => {
setCount(count + 1);
};
return (
<div>
<p>カウント: {count}</p>
<button onClick={incrementCount}>カウントアップ</button>
</div>
);
}
カスタムフックを使用して、親コンポーネントと子コンポーネント間で状態を共有することができます。カスタムフックは、再利用可能なロジックをカプセル化するための優れた方法です。
// 親コンポーネント
import React, { useState, useEffect } from 'react';
import useCount from './useCount';
function ParentComponent() {
const { count, incrementCount } = useCount();
return (
<div>
<ChildComponent count={count} incrementCount={incrementCount} />
</div>
);
}
// カスタムフック
import React, { useState, useEffect } from 'react';
function useCount() {
const [count, setCount] = useState(0);
useEffect(() => {
// データのフェッチなどを行う
}, []);
const incrementCount = () => {
setCount(count + 1);
};
return { count, incrementCount };
}
// 子コンポーネント
import React from 'react';
function ChildComponent({ count, incrementCount }) {
return (
<div>
<p>カウント: {count}</p>
<button onClick={incrementCount}>カウントアップ</button>
</div>
);
}
フォームを使用して、子コンポーネントから親コンポーネントにデータを送信し、そのデータを使用して子コンポーネントの状態を更新することができます。
この方法は、ユーザー入力に基づいて子コンポーネントの状態を更新する必要がある場合に役立ちます。
// 親コンポーネント
import React, { useState } from 'react';
function ParentComponent() {
const [count, setCount] = useState(0);
const handleSubmit = (event) => {
event.preventDefault();
const newCount = parseInt(event.target.count.value);
setCount(newCount);
};
return (
<div>
<ChildComponent count={count} handleSubmit={handleSubmit} />
</div>
);
}
// 子コンポーネント
import React from 'react';
function ChildComponent({ count, handleSubmit }) {
return (
<form onSubmit={handleSubmit}>
<label>
カウント:
<input type="number" name="count" defaultValue={count} />
</label>
<button type="submit">送信</button>
</form>
);
}
これらの方法はそれぞれ長所と短所があるため、アプリケーションの要件に応じて適切な方法を選択する必要があります。
- [【React】子コンポーネントでの状態変更を親コンポーネント
javascript reactjs