どうも、ぽっぽです。
最終的な目標はTypeScriptを使ってフロントエンドのフレームワークを試してみたくて、TypeScriptを使って書けるReactを使ってみます。
本家の公式ドキュメントのチュートリアルにReact & Webpack · TypeScriptとして掲載されています。
GitHub – microsoft\frontend-bootcamp: Frontend Workshop from HTML\CSS\JS to TypeScript\React\Reduxに良いサンプルコードがありました。また、説明もわかりやすかったので理解したことを紹介します。
まずは、TypeScriptから少し離れてReactについて説明します。
React Hello World
ReactDOM.render(<p>Hello World</p>, document.getElementById('app'));
ReactDOM.render()
を呼ぶことから始まります。パラメータは2つあって、コンポーネントとそれを配置する要素です。
- コンポーネントはHTMLの属性と少し異なるところがあって、
class
属性はclassName
になったりします。:<div className="foo">
- 自分で作成したコンポーネントも呼び出すことが出来ます。:
<div><MyComponent /></div>
- JSXと呼ばれるファイルに記載します。
React Component
ReactはComponentの集合体のように扱うようです。Componentにすることで再利用とか、分業とかやりやすくしている理解です。
Componentを作成する方法は2種類あって、ClassかFunctionです。
class App extends React.Component {
render() {
return <p>Hello World</p>;
}
}
const App = props => {
return <p>Hello World</p>;
};
上記はどちらも同じComponentを作成します。表示する場合は、Componentを作って、Domに描画するのが大まかな流れです。
ReactDOM.render(<App />, document.getElementById('app'));
Props
Props
はComponentにわたす引数のようなものだと思います。
<App text="Hello World" />
const App = props => {
return <p>{props.text}</p>;
};
text
で指定した値をComponentで利用出来ます。text
の文字列は任意に決めて良いです。txt
でもatai
でも大丈夫です。
Destructuring
Props
はComponentで1つだけでなく複数指定することが出来ます。文字列、数値、オブジェクトなどが定義出来ます。
<MyComponent
open={false}
count={5}
text="Hi there"
items={['cat', 'dog', 'bird']}
config={{
start: 1,
end: 10,
autoStart: true
}}
/>
呼び出すときは
const open = props.open;
const text = props.text;
などと呼び出しますが、Destructuring assignment – JavaScript | MDNと呼ばれすシンタックスを使って
const {
open,
text,
count,
items,
config: { start, end }
} = props;
のように変数を取得することが出来ます。便利ですね。
State
class
ベースのComponentはState
と呼ばれる状態を保持することが出来ます。Props
は画面描画時だけ使われるとおしまいですが、State
は画面描画後もユーザ操作により変化させたり状態を管理することが出来ます。
class Counter extends React.Component {
constructor(props) {
super(props);
this.state = {
clicks: 0
};
}
}
constructorでインスタンス時に状態を保持します。上記はクリック数をState
として定義した例です。
- constructorは引数にpropsを受け取ります。
super()
関数は親クラスのconstructorを呼び出します。クラスの継承ではお約束事のようです。State
はsetState
メソッドで値を更新します。
export const Button = props => {
return (
<button className="Button" onClick={props.onClick}>
{props.children}
</button>
);
};
export class Counter extends React.Component<any, any> {
constructor(props) {
super(props);
this.state = {
clicks: 0
};
}
render() {
const { text } = this.props;
const { clicks } = this.state;
return (
<div>
{text}: {clicks}
<Button onClick={this._onButtonClick}>Click</Button>
</div>
);
}
_onButtonClick = () => {
this.setState({
clicks: this.state.clicks + 1
});
};
}
_onButtonClick ()
メソッドを定義し、State
を更新しています。2つのComponentを定義しています。Counter
ComponentではButton
Componentを呼び出していて、Props
でonClick
を指定しています。Button
をクリックすると呼び出し元であるCounter
の_onButtonClick ()
メソッドが実行されて状態が更新されます。
これがReactの基本的な仕組みです。