はじめに
最近仕事でReactを使い始めました。
Reactの基本的な構文で、よくある処理だけれどもつまづきポイントがあるものにいくつか遭遇しました。
この記事では、Reactの初心者の方に向けて
最初に理解しておいた方がいい基本的な構文について複数回に分けて紹介します。
読んだもの
- React documentation | Adding local state to a class
- react-guide | props vs state
- 覚えておきたいReactの実装でよく使う基本的な構文(書き方)
- React.jsでPropやStateを使ってComponent間のやりとりをする
Reactでは、親Componentが持つStateの値を、子Component側でpropsを通して受け取るという設計をよく使います。
今回はその構文を説明します。
親Componentの書き方
まず、親Component内で子Componentを呼び出すには、子Componentの名前をタグ名にします。(※1)
次に、子Componentに親ComponentのStateの値を渡すには、タグの属性を使います。(※2)
class Parent extends React.Component {
constructor(props) {
super(props);
this.state = {
value1: 'hoge',
value2: 'fuga'
};
}
render() {
return (
<div>
// 親Componentで子Componentを呼び出す
// タグ名は子Componentの名前を使う(※1)
<FunctionalChild value={this.state.value1} />
// 任意の名前の属性(ここではvalue)をつくり、Stateの値を渡す(※2)
<ClassChild value={this.state.value2} />
</div>
);
}
}
子Componentの書き方
ReactのComponentにはfunctional ComponentとClass Componentがあります。
親Componentは性質上必ずClass Componentになりますが、子Componentはどちらの形もとることができます。
①functional Componentの場合
子Component内で親Componentの値を読み取るときに、propsを使います。
const FunctionalChild= (props) => (
<div>
{props.value}
</div>
);
②Class Componentの場合
Class Componentの場合は this
をつけます。
class ClassChild extends React.Component {
render() {
return (
<div>
{this.props.value}
</div>
);
}
}
なぜClass Componentではthisを使うのかについては、こちらの記事(JavaScriptのthisをわかりやすく整理する(関数とメソッド編))もご参照ください。
コードの全体像
下記はコードの全体像です。
// 親Component
class Parent extends React.Component {
constructor(props) {
super(props);
this.state = {
value1: 'hoge',
value2: 'fuga'
};
}
render() {
return (
<div>
// 親Componentで子Componentを呼び出す
<FunctionalChild value={this.state.value1} />
<ClassChild value={this.state.value2} />
</div>
);
}
}
// 子Component
// ①functional Componentの場合
const FunctionalChild= (props) => (
<div>
// 子Component内で親Componentの値を読み取る
{props.value}
</div>
);
// ②Class Componentの場合
class ClassChild extends React.Component {
render() {
return (
<div>
// 子Component内で親Componentの値を読み取る(※2)
{this.props.value}
</div>
);
}
}
// =>
// hoge
// fuga
// とブラウザに表示される
【重要】Component間のやり取りと親子関係
ここでひとつ注意点があります。
子Componentで受け取ったpropsの値は読み取り専用となるため、子Component側で変更することはできません。
これはReactのComponentと親子関係の基本的な考え方に基づいています。
Reactでは、Componentが持つ値をまずはPropsとして考えます。
その上で、変更されうる値があればそれをStateとして定義します。
子Componentは値を使うだけ(Props)で、親Componentが値を管理する(State)という関係がReactの基本になります。
react-guide | props vs stateのStateとPropsのできること/できないことについての表がわかりやすかったので、翻訳しました。
Props | State | |
---|---|---|
親Componentの初期値を渡せるか? | Yes | Yes |
親Componentによって値が変えられるか? | Yes | No |
Component内でデフォルト値を定義できるか? * | Yes | Yes |
Component内で値が変えられるか? | No | Yes |
子Component内で初期値を定義できるか? | Yes | Yes |
子Component内で値が変えられるか? | Yes | No |
* PropsもStateも、Component内で定義したデフォルト値は親Componentの初期値によって上書きされるという点は同じ。
おわりに
Propsを通してStateの値を受け取る構文のサンプルを紹介しました。
次回は②イベントハンドラを設定するときの構文を紹介します。