Reactアプリケーションはelement(要素)という構成ブロックにより構成されています。
コンポーネントは要素によって構成されたものです。
コンポーネントを使うことにより、UIを部品に分割し分離させることができます。
コンポーネントはpropsと呼ばれる任意の値を受け取り、画面上に表示すべきものを返すReaxt要素を返します。
function Welcome(props) {
return <h1>Hello, {props.name}</h1>;
}
これはpropsで受け取ったnameを表示させる関数コンポーネントです。
class Welcome extends React.Component {
render() {
return <h1>Hello, {this.props.name}</h1>;
}
}
これは等価なコードです、classコンポーネントを使う際はextends React.Componentを記載して下さい。
またファイル冒頭にimport React, { Component } from 'react';を書くことも必要です。
function Welcome(props) {
return <h1>Hello, {props.name}</h1>;
}
const element = <Welcome name="Sara" />;
ReactDOM.render(
element,
document.getElementById('root')
);
このコードではelementと定義された要素を引数としてReactDOM.renderが呼び出されます。
そのあとelementに代入されたwelcomeコンポーネントを呼び出し、その時propsとしてname=’Sara’が渡されます。
その後ReactDOMが
Hello, Sara
になるようDOMを更新します。Reactでは
<welcome />はDOMタグ
<Welcome />はコンポーネント
と認識されることを覚えておきましょう。
class App extends React.Component {
render() {
return (
<div>
<h1>Hello World</h1>
</div>
);
}
}
これはclassコンポーネントですが、特徴として内部にプライベート状態(state)をもたせたり、
生成状況によって呼び出されるライフサイクルメソッドを持っています。
主に親コンポーネントとして使用し関数コンポーネントで作った子コンポーネントに、保持している値を伝える親玉のような存在と言えるでしょう。
const App = (props) => {
return (
<div>
<h1>Hello World</h1>
</div>
<h2>Hello React</h2>
);
};
これは同レベルのReact Elementがあるためエラーになります。
const App = (props) => {
return (
<div>
<h1>Hello World</h1>
<h2>Hello React</h2>
</div>
);
};
とdivタグで囲ってあげましょう。
// 親コンポーネント
class Parent extends React.Component {
//superは必須です
constructor(props) {
super(props);
this.state = {
value1: 'foo',
value2: [ 'bar', 'baz' ],
};
}
render() {
return (
<div>
<Child1 data={this.state.value1} />
<Child2 data={this.state.value2} />
</div>
);
}
}
// Functionalコンポーネントで受け取る場合
const Child1 = (props) => (
<div>
{props.data}
</div>
);
// Classコンポーネントで受け取る場合
class Child2 extends React.Component {
render() {
return (
<div>
{this.props.data}
</div>
);
}
}
親で独自の名前を付けて子に流していく流れですね。
クラスコンポーネント間でも受け取ることができます。
viewで発生したイベントハンドラはクラスコンポーネントのメソッドで設定して下さい。
その際はキャメルケースで書く必要があります。
またコールバック関数として実行する際にthisが機能するようconstructor()内でthisをbindしておく必要があります。
これはjavascriptにまつわる話題です。
ReactDom.render(
<App />,
document.querySelector('.content')
);
これは冒頭紹介したコードです、深掘りしていきましょう。
親コンポーネント(App.js)のrender()メソッドで返されたレンダリングの実態は仮想DOMと呼ばれるものです。仮想DOMではブラウザで表示できないので生のDOMに変換する必要があるのですが、そこでこのコードが活躍します。
第一引数に親コンポーネント、第二引数にhtmlで表示・挿入する部分を渡しています。