Railsエンジニアが #React のチュートリアルの #Codepen で文句を言いながらやってみる

# Tutorial

[チュートリアル：React の導入 – React](https://ja.reactjs.org/tutorial/tutorial.html#setup-for-the-tutorial)


# Codepen が用意されている

他のことは良いからとりあえず開く！

![image](https://user-images.githubusercontent.com/13635059/56489823-faeffe80-651d-11e9-891c-afb07f1d3edf.png)

[Tic Tac Toe](https://codepen.io/gaearon/pen/oWWQNa?editors=0010)

# どん！

そうそうまずは動かせるものがなくっちゃね。

![image](https://user-images.githubusercontent.com/13635059/56489862-2b379d00-651e-11e9-9dfd-df5c8c0ef273.png)

# こんぽーねんとのくらすのかたのかいそうこうぞうの

ね、こういうお題目って、本当意味わからないよね。

>ここで ShoppingList は React コンポーネントのクラス、もしくは React コンポーネントの型です。コンポーネントは props（“properties” の略）と呼ばれるパラメータを受け取り、render メソッドを通じて、表示するビューの階層構造を返します。

# render

ますます訳がわからなくなるよね。たぶん手を動かしたあとに戻ってきた方が良いよね。

>render メソッドが返すのははあなたが画面上に表示したいものの説明書きです。React はその説明書きを受け取って画面に描画します。具体的には、render は、描画すべきものの軽量な記述形式である React 要素というものを返します。

# `<div>`

このスペースとスラッシュの HTML要素「っぽいやつ」がどうやら react 独自記法っぽい。

><div /> という構文は、ビルド時に React.createElement('div') に変換されます。

Reactってそもそもビルドっていうプロセスがあるのかあ！ 

React記法はReact記法であって、あとはjsに置換してくれる感じかな。ok。

# じゃあ HTML でも見てみるかあ

なにこれ汚っ

なに？チュートリアルのためにわざとこうしてるとか？

![image](https://user-images.githubusercontent.com/13635059/56490298-abaacd80-651f-11e9-8dde-4e9c9521cfba.png)


とりあえずそっ閉じしとこう

# で何するんだっけ？

# チューとルアルに戻るよ

あの、チュートリアルなのにこういうのね。やめてほしいんですよ。

Props経由で渡すとか。まだPropsがなにかも分かってないっていうのにね。

え、説明したって？聞いてない。聞いてない。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89618/cd61f1a8-8e3c-d020-c209-af1698729b6a.png)

# とりあえずこの二箇所を書き換えれば良いらしいな！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89618/7759f065-ad20-6d9f-1b3a-af6002e734c6.png)

# お、なんか動いた！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89618/594e2e23-e482-00f1-e6bd-5045623abbcf.png)

# この時点でコード全体を見る

指示がこまかい、うんきっとこのチュートリアルを作った人は、物事を段階的に組み立てる、すごくちゃんとした人だ。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89618/e1210089-5e1d-1e68-b824-3eaaa540f7a0.png)


# 見てやろうじゃないか！

チュートアリアルにしてはコード長くない？

お、まだ TODO が残っているな？なにかさせるつもりらしいぞ。


```js
class Square extends React.Component {
  render() {
    return (
      <button className="square">
        {this.props.value}
      </button>
    );
  }
}

class Board extends React.Component {
  renderSquare(i) {
    return <Square value={i} />;
  }

  render() {
    const status = 'Next player: X';

    return (
      <div>
        <div className="status">{status}</div>
        <div className="board-row">
          {this.renderSquare(0)}
          {this.renderSquare(1)}
          {this.renderSquare(2)}
        </div>
        <div className="board-row">
          {this.renderSquare(3)}
          {this.renderSquare(4)}
          {this.renderSquare(5)}
        </div>
        <div className="board-row">
          {this.renderSquare(6)}
          {this.renderSquare(7)}
          {this.renderSquare(8)}
        </div>
      </div>
    );
  }
}

class Game extends React.Component {
  render() {
    return (
      <div className="game">
        <div className="game-board">
          <Board />
        </div>
        <div className="game-info">
          <div>{/* status */}</div>
          <ol>{/* TODO */}</ol>
        </div>
      </div>
    );
  }
}

// ========================================

ReactDOM.render(
  <Game />,
  document.getElementById('root')
);

```

# hey


>おめでとうございます！ これで親である Board コンポーネントから子である Square コンポーネントに「props を渡す」ことができました。React では、親から子へと props を渡すことで、アプリ内を情報が流れていきます。

こういう流れを見てみればよいのか。

# で Board がいて

1から9まで数字を持っていて

Square を render してるよね

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89618/23ef202b-9550-50df-2aac-b55d610fe6be.png)


# で Square が `props.value` を描画していて

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89618/7eb5d242-d238-2079-c48d-bf5ece464717.png)

# じゃこれ 2倍したら 2倍になるの？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89618/38d9e751-32ff-fa63-01a0-dbf221d534ec.png)

# なったなった！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89618/97b7363f-4a85-1c54-ffdc-15bc8aace2ed.png)

# これがコンポーネント指向ってやつかな！

たぶん。

# 以上

また明日。








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->