React初心者
Reactで子コンポーネントから、親コンポーネントに値を受け渡すには、どうやってやるの?
こういった声に答えていきます。
親コンポーネントから子コンポーネントへ値を渡すのはpropsを使います。これについては色々なところで説明されています。私も記事を書いています。
関連記事:【React.js】親から子コンポーネントへpropsで値を渡す
しかし、子から親コンポーネントへ値を渡す方法については、あまり情報がない気がします。私も情報がなくて困りました。あっても難しくて困りました。
そこで、今回は、子から親コンポーネントへ値を渡す方法について紹介します。もちろん、私と同じ初心者向けの内容となっております。よろしく!
子から親コンポーネントへ値を渡す
今回は、関数コンポーネント間を対象とします。そして、フック(hook)を使います。最近は、あまりクラスを使わずに、関数コンポーネントを使ってコードを書くことが多いらしいので。
子から親コンポーネントへ値を渡すのは、子から親のstateを変更することで達成します。このあたりは後で説明します。
準備
まず、以下を定義します。
- 親の関数コンポーネント(
Parent
) - 子の関数コンポーネント(
Child
)
そして、Childコンポーネント内で変数child
を定義します。Parentコンポーネント内に<Child />
と書いて、子コンポーネントの内容を親コンポーネントに反映させます。
import React from 'react'; import './App.css'; function Child() { const child = "子" return ( <div> <p>{child}</p> </div> ) } function Parent() { return ( <div> <Child /> </div> ); } export default Parent;
この時点では、以下のように表示されます。
子
と〜げ
ちなみに、”子” を中央に表示させるには、App.cssに以下を書くと良いでしょう。
* { text-align: center; }
と、ここまで準備です。ここから本番です。
フック(hook)を使って
フックは、関数コンポーネント内で、stateのようなReactの機能を使うためのものです。なので、フックは React をクラスなしで使うための機能ですので、クラス内では機能しません。
以下のuseState
がフックであり、現在の state の値と、それを更新するための関数とをペアにして返します。以下のように書きます。value
がstateの値で、それを更新する関数がsetValue
です。useState("")
は、引数に初期値を設定します。この場合は空欄です。
const [value, setValue] = useState("");
フックの説明はこんなところで、詳しくはReactの公式チュートリアルのフック早わかりを参照されたい。
ではそろそろ本題に。
子から親コンポーネントへ値を渡すのは、親のParentコンポーネントで定義したフックの更新関数setValue
をpropsを使って、子のChildコンポーネントに渡し、Childコンポーネント内でsetValue
を使って、親コンポーネントのvalue
のstateを変更します。
親のParentコンポーネント内で、const [value, setValue] = useState("")
と定義します。そして、propsを使ってsetValue
を渡します。親から子コンポーネントのpropsでの渡し方はこちら(関連記事:【React.js】親から子コンポーネントへpropsで値を渡す)を見てください。
function Parent() { const [value, setValue] = useState("") return ( <div> <Children setValue = {setValue} /> </div> ); }
次に、子のChildコンポーネントは以下のようになります。
変数commentを定義します。const comment = 'やっほ〜'
props.setValue
を使って親のParentコンポーネントのvalue
のstateを変更します。ここでは、value
の初期値の空欄から、comment
に変更しています。
{props.setValue(comment)}
※ 変数child
については削除しています。
function Child(props) { const comment = 'やっほ〜' return ( <div> <p>{props.setValue(comment)}</p> </div> ) }
そして、親のParentコンポーネントのreturn内に、<p>{value}</p>
を追加します。
function Parent() { const [value, setValue] = useState("") return ( <div> <Child setValue = {setValue} /> <p>{value}</p> </div> ); }
そうすると、以下のように表示されます。
やっほ〜
親のParentコンポーネントのフックの更新関数setValue
をpropsを使って、子のChildコンポーネントに渡し、Childコンポーネント内で、props.setValue
を使って、Parentコンポーネント内のvalue
を、Childコンポーネントで定義したcomment
に変更することが出来ました。
つまり、結果として、子のChildコンポーネントのcomment
の値を親のParentコンポーネントに渡すことができました。
React Hookについては、Udemyでたくさんの講座を安価で学ぶことができます。私もUdemyをたまに利用します。
最短・最速で学ぶ React Hooks 完全ガイド!基礎〜応用編 最新のReact開発+ステート管理をマスターしよう!