『React』 +『Redux』 + 『Firebase』でLINE風のChat機能を作ろう！ 【状態管理編】

#はじめに

__『React』 +『Redux』 + 『Firebase』でLINE風のChat機能を作ろう！__シリーズですが、前々回と前回で【準備編】、【Component編】の記事を書きました。今回は最後の記事となる【状態管理編】です！

今回は

- __[redux-actions](https://redux-actions.js.org/)__
- __[createAction(s)](https://redux-actions.js.org/api/createaction)__
- __[handleAction(s)](https://redux-actions.js.org/api/handleaction)__
- __[immer](https://github.com/immerjs/immer)__

の4点について簡単にまとめます。

前回までの投稿とはディレクトリの配置が大きく変わっております。
__[Github](https://github.com/micropig3402/pigtalk)__に完成したコードを載せますので、詳細を知りたい方はそちらをご覧ください。

何か疑問点や修正箇所がございましたら、ご指摘をよろしくお願い致します。

####【準備編】
__[『React』 +『Redux』 + 『Firebase』でLINE風のChat機能を作ろう！ 【準備編】](https://qiita.com/micropig3402/items/5a24f35f68bb6b3c8e81)__

####【Component編】
__[『React』 +『Redux』 + 『Firebase』でLINE風のChat機能を作ろう！ 【Component編】](https://qiita.com/micropig3402/items/3431c998df582a441fa5)__

#redux-actions
__redux-actions__とは、reduxでの状態管理のガイドライン(Flux Standard Action)を引き、その実装を助けてくれるライブラリです。

__action__の記述を楽にする__『createAction(s)』__
__reducer__の記述を楽にする__『handleAction(s)』__
同じ__reducer__の処理をする際に、複数の__action__をまとめる__『combineActions』__
の３つがあります。

また、以下の３つのゴールを持って設計されました。

- __Human-friendly.__ (人に優しい)
- __Useful.__ (役に立つ)
- __Simple.__ (シンプル)

>- __Human-friendly.__ FSA actions should be easy to read and write by humans.
- __Useful.__ FSA actions should enable the creation of useful tools and abstractions.
- __Simple.__ FSA should be simple, straightforward, and flexible in its design.

それでは実際に、redux-actionsを用いて実装を進めていきましょう！

#createAction(s)
createActionsを使って、まとめてアクション(クリエイター)を生成します。

```react:src/redux/actions/messages.js
import {createActions} from 'redux-actions';

import {firebaseDb} from '../../firebase';

const messagesRef = firebaseDb.ref('messages');

const {messages} = createActions({ 
  messages: { 
    submit(value, image) { 
      const payload = value; 
      if (payload === '') { 
        alert('メッセージを入力してください'); 
        return false; 
      }

      messagesRef.push({ 
        image: image, 
        text: payload, 
      }); 

      return payload; 
    }, 
    change(value) { 
      const payload = value; 
      return payload; 
    }, 
  }, 
}); 

export {messages}; 
```

__『submit』__は入力されたメッセージをfirebaseに送信する際に生成されるactionで、__『change』__はtextareaに文字が入力される度に生成されるactionです。

また`messagesRef.push`にてfirebaseにデータを送信しています。

#handleAction(s)
handleActionsを使って、まとめてreducerを定義しましょう！

```react:src/redux/reducers/messages.js

import {handleActions} from 'redux-actions';

import {actions} from '../actions';
import {repos} from '../repos'; 
import {initialState} from '../store/initialState';

const messages = handleActions( 
  {
    [`${actions.messages.submit}`](state, action) {
      return repos.messages.addMessage(state, action.payload);
    }, 
    [`${actions.messages.change}`](state, action) { 
      return repos.messages.changeText(state, action.payload); 
    }, 
  }, 
  initialState 
); 

export {messages};
```
このファイルの中では状態遷移に関する記述はせず、以下の`repos/messages.js`にて__『immer』__を用いて状態遷移を行うようにしています。

#immer
immerに関しては、以下の説明がわかりやすかったので、そのまま引用させていただきます。

>immerは現在のstateを渡すと下書き状態であるdraftが渡されそれに対して変更を行うと、変更が反映された新しいオブジェウトを返却してくれます。変更は通常のJSオブジェクトと同様に行うことができるので、非常にとっつきやすいと思います。

```react:src/redux/repos/messages.js

import produce from 'immer';

export const addMessage = (state, payload) => {
  const newState = produce(state, draftState => {
    draftState.value = '';
    draftState.text = payload;   
  });

  return newState;
};

export const changeText = (state, payload) => { 
  const newState = produce(state, draftState => { 
    draftState.value = payload;
  }); 

  return newState;
};
```

以上で、『redux-actions』と『immer』を用いて状態遷移を行う部分のプログラムを実装しました。

説明を省いている箇所が多々ありますので、詳細に関しては__[Github](https://github.com/micropig3402/pigtalk)__をご覧いただければと思います。

#今後の勉強方針

- __『React Hooks』__に関して理解を深める
- __『AWS 認定ソリューションアーキテクト – アソシエイト』__の資格を取る

#リファレンス
- [redux-actions](https://redux-actions.js.org/)
- [createAction(s)](https://redux-actions.js.org/api/createaction)
- [handleAction(s)](https://redux-actions.js.org/api/handleaction)
- [immer](https://github.com/immerjs/immer)
- [React+Reduxで使っているライブラリなどまとめ
](https://qiita.com/ayatas/items/6a4249733c8317666550)
- [redux-actionsを使って、reduxの記述で楽をしよう！](https://qiita.com/putan/items/49d3003cb0210f0557b2)
- [reduxはredux-actionsギプスをつけて養成](http://mk.hatenablog.com/entry/2016/11/02/092458)
- [React+Fluxで正しく設計するためのFlux見直しガイド](https://aloerina01.github.io/blog/2018-09-14-1)