会社のサーバサイドエンジニアにReactとかReduxのことを説明する資料

筆者が、会社のサーバサイド(以下SS)エンジニア(Rails)に社内実績のあまりないReactとかReduxのことを説明する資料です。


# この資料の方針

1. 多少 __嘘__ を教えてでもとりあえずわかった気になってもらう
2. 概念の解説にフォーカスする
3. (2より) 具体的なコードを記載しない
4. (2より) 出来るだけ図解する
5. 主観/偏見に満ちている可能性をきにしない


# 書いてないこと
1. ReactやReduxにまつわる歴史・経緯・なぜ選ぶのか
2. virtual dom
4. Flux
5. 具体的なコーディング
6. react-reduxの細かいこと/詳しいこと

真面目に勉強するひとは他の記事も必ず読んで下さい。
（一応、参考文献とかは貼っていくつもり

# 説明すること
1. Reactの役割、用語
2. Reduxの役割、用語
3. ReactとReduxの連携

#  React
Reactは __テンプレートエンジン + α__ です。 (叱られるのを覚悟

<img width="485" alt="スクリーンショット 2017-01-23 10.31.27.png" src="https://qiita-image-store.s3.amazonaws.com/0/12657/cbf85e6d-510a-d795-a22b-617b190e74c3.png">

## Reactの機能

### 1. テンプレートエンジン
パラメータをHTMLに変換する機能をもちます。
この点ではSSのテンプレートエンジンと同じです。
ただしテンプレート機能自体は比較すると低機能です。

<img width="426" alt="スクリーンショット 2017-01-23 10.37.29.png" src="https://qiita-image-store.s3.amazonaws.com/0/12657/966c05d6-b3ba-8fb2-0e66-30649b5ebac7.png">

### 2. ユーザ入力 (≒ イベントハンドラ
αの部分は、ユーザ入力をハンドリングする機能です。
テンプレート内へ埋め込む形式で設定することができます。

この点、より汎用的なツールであるjQueryを使ってイベントを付与した場合と比べると、テンプレートと一体化していることで、HTML要素とイベントの関係をわかり易く表現できるようになっています。

## Reactの用語
おおざっぱに責務を理解してもらったところでReactの用語を説明します。

### React
justライブラリの名前。
Reactというライブラリの中ではReactという概念は出てこない。

### Component (コンポーネント
最重要キーワード
後述するstateとそれが表すHTMLを定義する単位

### State (とProps
最重要キーワード
コンポーネントの内部状態
コンポーネントが出力するHTMLはこれらから一意に決定されるように作る

### render
コンポーネントの内部状態をHTML表現に変換する。
多くのテンプレートエンジンとは違い、事前に内部状態を更新しておく

## React特徴
抑えておくべき特徴、というかReactのコンセプトは、 __内部状態がHTMLに変換される__ という点です。

なので他のテンプレートエンジンのように、レンダリングするタイミングでパラメータを取るのではなく、 __あらかじめ内部状態を更新して、そのあとrenderする__ というのを基本のながれとしています。

<img width="528" alt="スクリーンショット 2017-02-02 12.52.49.png" src="https://qiita-image-store.s3.amazonaws.com/0/12657/f07eb18f-232e-19db-758e-d55b9f634cde.png">

この思想が強く現れている仕様として [Controlled Component](https://facebook.github.io/react/tutorial/tutorial.html#an-interactive-component) があります。
この仕様は「たとえform要素だとしても、内部状態が更新されない限り見た目も変化しない」という仕様です。

例えば、テキストエリアにユーザが文字を入力しようとして、キーボードから入力しても、handlerでstateを更新しないかぎり、何も入力できない、という動きになります。

## Reactまとめ
- Reactはテンプレートエンジン + α
    - テンプレートエンジン
        - renderするとstateがHTMLとしてでてくる
    - α
        - stateを更新するきっかけとしてユーザ入力を扱いやすくできている
    - こういう役割のやつをviewライブラリとか言うらしい
- 見た目を変更したければstateを更新


# Redux
つづきまして[Redux](http://redux.js.org/)です。

![favicon-2.ico.png](https://qiita-image-store.s3.amazonaws.com/0/12657/6e84caa2-c1d8-9124-c283-430d301bd422.png) 


どういう役割をやってくれるかというと、状態の(読み書き含む)一元管理です。
なので __「アプリケーションの状態が変わると思ったら、とにかくReduxの作法で更新する」__ ということをやっていきます。

逆にReduxだけでは何も表示できません。

他に抑えておきたいことは

- (ソフトウェアとしての)ReactとReduxは何の関係もない
- 種別としては(たぶん)フレームワーク

## Reduxの用語

### Redux
justライブラリ名。

### Store
状態を持ち、一元管理のために暗躍する。

### Action
状態を更新する理由とパラメータをひとまとめにしたもの
曰く[「アプリケーションに何がおきたか？」](http://redux.js.org/docs/basics/Reducers.html)を定義するのが役目。

### Reducer
Actionを状態に反映させる。
曰く[「どのように状態を更新するか？」](http://redux.js.org/docs/basics/Reducers.html)を定義するのが役目。

### dispatch
Actionが発生したことをStoreに伝える作法/手順。

### subscribe/publish
状態に更新があったことを知る作法/手順。

### ActionCreator
脇役。
いなくてもReduxは使えるけどこいつがいると便利になるように設計されている。


## Redux図解
登場人物が多いので図にしました。
<img width="724" alt="スクリーンショット 2017-02-02 13.41.34.png" src="https://qiita-image-store.s3.amazonaws.com/0/12657/a1912fec-ef89-4646-d581-1e852cd8a4cc.png">

reducerは、Storeを生成するときに渡します。
なので、勝手にやってくれるのはStoreから伸びてる矢印の部分でほかは自分たちで実装します

## Reduxまとめ
Reduxは以下の役割をします。

- 状態管理の作法の定義
- 作法の一部の自動化

それ以外は作法にのっとった実装を利用者が行います。

# ReactとReduxの連携
react, redux 双方の役割をあらためて簡単に確認すると

- React -> __状態__ をHTMLに変換する
- Redux -> __状態__ を管理する

と言うような役割分担になっていて、なんか相性が良さそうな気がしませんか？

こんな感じに連携できそうな気がしますよね。

<img width="533" alt="スクリーンショット 2017-02-02 12.51.27.png" src="https://qiita-image-store.s3.amazonaws.com/0/12657/5affe73a-c76f-069a-1b68-536035ba558d.png">

コレをやってくれるのが、[react-redux](https://github.com/reactjs/react-redux)というライブラリです。

ざっくり言って以下のようなことができるようになります。

- componentからdispatchを呼べるようにする
    - ≒ dispatchをわたしてくれる
- stateが更新されたらprops(≒ state)に適用する
    - reduxのstateをreactコンポーネントのpropsに適用する関数はユーザがつくる
    - propsは付録参照

さて、このへんまで来るとかなり詳細な事柄になってしまうので以降は省略します。

理解を深める場合は、なんといってもキモであるところの[connect](https://github.com/reactjs/react-redux/blob/master/docs/api.md#connectmapstatetoprops-mapdispatchtoprops-mergeprops-options) あたりを読んでみるのが良いと思います。


# まとめ
React, Reduxがそれぞれどんなものであるかを簡単に説明し、連携方法などを通して位置づけをあらわしました。
もう一度簡単にまとめると。

- React
    - viewライブラリ
    - stateをrenderしてHTMLに変換
- Redux
    - stateの管理と作法の定義
- stateの部分をReactからReduxに預けることで連携
    - react-reduxでできる

とりあえずこの辺をわかってから、勉強するなり、ソースを読むことで理解が速まれば良いなと思います。


あとは、リンク集です。


# 付録
- [react.js](https://facebook.github.io/react/)
    - [Controlled Component](https://facebook.github.io/react/docs/forms.html)
        - 一貫性があってたいへん美しい仕様
        - reactの思想をりかいする手助けになる
    - [Props](https://facebook.github.io/react/docs/components-and-props.html)
        - stateとよく似ているが区別されている
        - react-reduxではこちらを使うことになる
        - 曰く 「ユーザ定義のコンポーネントに対してJSXアトリビュートに渡される１つのオブジェクト」のこと
            - `When React sees an element representing a user-defined component, it passes JSX attributes to this component as a single object. We call this object "props".`
- [redux](http://redux.js.org/)
    - [Middleware](http://redux.js.org/docs/advanced/Middleware.html)
        - dispatchの振る舞いを拡張するreduxの仕組み
    - [redux-thunk](https://github.com/gaearon/redux-thunk)
        - reduxの作法の中に非同期処理をいれるのに使うmiddleware
        - ある程度複雑なアプリになると実質必須
        - 類似するライブラリが他にもある (筆者が使ったことあるというだけ
- [react-redux](https://github.com/reactjs/react-redux)
    - [Presentational and Container Components](http://redux.js.org/docs/basics/UsageWithReact.html#presentational-and-container-components)
        - connectするコンポーネントとそうじゃないコンポーネントに分けてとらえる
        - あんまり重要じゃないかもしれない
        - 設計について周りと相談するときにこの分類をつかって議論するとよさそう
    - [connect関数のテスト](https://github.com/reactjs/react-redux/blob/master/test/components/connect.spec.js)
        - どのような振る舞いをするかじっくり読んでいけばかなり理解が深まる