やりたいこと
atomic designなどでコンポーネントを設計をしているとmolecules(子)が保持しているstateをorganisms(親)から参照したい場合などがあるはずです。
そんな時にどのように子コンポーネントのstateを親コンポーネントから参照するかを今回は説明します。
親から子のstateを取得する流れ
- 親コンポーネントで子の
state
を保持、更新するためのuseState
を定義する。 - 1で定義した
set○○
を使ってstate
を更新する関数を作成する。 - 2で作成した関数を子に
props
として渡す。 - 子コンポーネントで親から受け取った関数を
button
タグなどで実行する。
コード
親コンポーネント
ParentComponent.jsx
import { useState } from 'react'
import ChildComponent from '../atoms/ChildComponent'
const ParentComponent: React.FC = () => {
// 1.親コンポーネントで子のstateを保持、更新するためのuseStateを定義する。
const [parentState, setParentState] = useState('initial parent state')
// 2.1で定義したsetParentStateを使ってparentStateを更新する関数を作成する。
const setState = (childState) => {
setParentState(childState)
}
return (
// 3.2で作成した関数を子にpropsとして渡す
<>
<ChildComponent parentFunction={setState} />
<button onClick={() => console.log(parentState)}>Show Parent State</button>
</>
)
}
export default ParentComponent
子コンポーネント
ChildComponent.jsx
import { useState } from 'react'
const ChildComponent: React.FC = ({ parentFunction }) => {
const [childState, setChildState] = useState('initial child State')
// 4.子コンポーネントで親から受け取った関数をbuttonタグなどで実行する。
return <button onClick={() => parentFunction(childState)}>Set Parent State</button>
}
export default ChildComponent
補足
上記のコードの挙動を確認すると初回レンダリングされた状態でShow Parent State
ボタンをクリックするとコンソールにinitial parent state
と表示されますが、Set Parent State
ボタンをクリック後、再度Show Parent State
ボタンをクリックするとコンソールに子から渡されたinitial child State
が表示されるはずです。
今回は子の値を親から参照することを目的とした記事のため、子のsetChildState
関数は使わずに初期値のinitial child State
を親に渡すだけでしたが、もちろん動的に子のstate
は変わると思うので開発中のプロジェクトでは子のset○○
を使用して動的に値を変更してみてください。