【React入門】Reactとは

# 初めに
フロントエンド開発初心者がReactの案件に参画することになったため、チュートリアル等で勉強し得た知識をまとめてみました。

# Reactとは

Reactはユーザーインターフェース(UI)を構築するためのJavaScriptライブラリです。
UIを「コンポーネント」という小さく独立した部品を組み合わせて構築することができます。

## Reactの使用例

実際にReactを使ったサンプルアプリを見てみましょう。
以下は押されたボタンによって値を増減させる簡単なカウンターアプリです。

<p class="codepen" data-height="265" data-theme-id="light" data-default-tab="css,result" data-user="amsel1676" data-slug-hash="JjYNWGE" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="Counter">
  <span>See the Pen <a href="https://codepen.io/amsel1676/pen/JjYNWGE">
  Counter</a> by Amsel (<a href="https://codepen.io/amsel1676">@amsel1676</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>



```React:サンプルアプリ
class Counter extends React.Component{
  constructor(props){
    super(props);
    this.state = {
      count: 0,
    };
  }
  
  render(){
    return (
     <div>
       <div className="title">Counter</div>
       <button 
         className="minusButton"
         onClick={() => this.setState({count: this.state.count-1})}
       >
         -
       </button>
       <div className="counter">{this.state.count}</div>
       <button 
         className="plusButton"
         onClick={() => this.setState({count: this.state.count+1})}
        >
         +
        </button>
      </div>
    );
  }
}

ReactDOM.render(
  <Counter />,
  document.getElementById('app')
);
```
### Counterコンポーネント

```React:Counterコンポーネント
class Counter extends React.Component{
  constructor(props){
    super(props);
    this.state = {
      count: 0,
    };
  }

  render(){
    return (
     <div>
       <div className="title">Counter</div>
       <button 
         className="minusButton"
         onClick={() => this.setState({count: this.state.count-1})}
       >
         -
       </button>
       <div className="counter">{this.state.count}</div>
       <button 
         className="plusButton"
         onClick={() => this.setState({count: this.state.count+1})}
        >
         +
        </button>
      </div>
    );
  }
}
```

上のコードの`Counter`がReactコンポーネントです。
`Counter`コンポーネントは`props`というパラメータを受け取り、`constructor`メソッドで値を初期化させ、`render`メソッドで表示するビューの説明書である**仮想DOM**を返却します。


`Counter`コンポーネントは`state`というオブジェクトでアプリケーションの状態を保持して、状態が変わるごとにその差分を再レンダリングする仕組みになっています。

この状態管理の仕組みにより、上のサンプルアプリではボタンを押した結果がすぐに画面に描画されるようになっています。

### コンポーネント呼び出し

```React:コンポーネント呼び出し
ReactDOM.render(
  <Counter />,
  document.getElementById('app')
);
```

上記がコンポーネントの呼び出し部分となります。
`ReactDOM.render`メソッドは`Counter`コンポーネントが返却した仮想DOMを指定したDOMにレンダリングします。


## JSX

上のコードはJavaScriptとHTMLタグが入り混じったような特徴的な見た目をしていますが、これはJSXを用いて書かれているためです。

JSXとは「JavaScript XML」の略で、XML風に作られたJavaScriptの拡張シンタックスです。  

## JSXのメリット

JSXはあくまで拡張シンタックスであり、JSXで書かれたコードはBabelを通じてJavaScriptの関数呼び出しへと置き換えられます。

つまりReactはJSXを使用せずに書くことが可能です。
JSXを使用せずに書くと以下のようになります。

```React:JSXなし
function Welcome(props){
  return React.createElement(
    'h1',
    null,
    `Welcome ${props.name}`,
  );
}

ReactDOM.render(
  <Welcome name="Tom" />,
  document.getElementById('app')
);
```

同様のコードをJSXを使用して書くと以下のようになります。

```React:JSXあり
function Welcome(props) {
  return <h1>Welcome, {props.name}</h1>;
}

ReactDOM.render(
  <Welcome name="Tom" />,
  document.getElementById('app')
);
```

このようにJSXを使用することでHTML風に構造が可視化され、可読性が向上します。


# 参考
[Reactチュートリアル](https://ja.reactjs.org/)