0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【react-redux】私的まとめ

Posted at

こちらの記事は以下の書籍を参考にアウトプットとして執筆しました。
React入門 React・Reduxの導入からサーバサイドレンダリングによるUXの向上まで

react-redux

ReactとReduxをつなぐ架け橋的なもの

Container ComponentとPresentational Component

Container Component

  • 責務はReactとReduxの橋渡しのみ
  • ここにJSXを書くのは好ましくない

Presentational Component

  • 純粋なReactコンポーネント
  • 自分以外のコンポーネントに依存しない

以下は公式から

Presentational Component Container Component
目的 どう見えるか どう動くか
Redux 関係ない 関係する
データ取得 props Reduxのstateをsubscribe
データ変更 propsから取得したCallbackを使う ReduxのactionsをDispatch
作成方法 手動 react-reduxのconnect()

react-reduxがやっていること

  • Provider
  • connect

Provider

これを使うと好きなコンポーネントとStoreを紐付けられる

ReactDOM.render(
    <Provider store={store}>
        <MyRootComponent/>
    </Provider>,
    document.getElementById('root')
)

storeをMyRootComponentに渡さずProviderに渡している。
MyRootComponentはconnect関数でStoreを受け取る

connect

Storeを提供する

mapStateToProps[state,[pwnProps]]

Storeのstateをコンポーネントのpropsに割り当てる関数を指定
returnしたオブジェクトをPropsで受け取れる

mapDispatchProps(dispatch,[pwnProps])

第1引数のdispatchでコンポーネントからdispatchの概念を隠蔽

ここでdispatchを発行

mergeProps(stateProps,dispatchPtops,ownProps)

上2つを経たPropsをマージしてコンポーネントに渡す。

Todoアプリにreact-reduxを導入

import { connect } from 'react-redux';
import TodoApp from '../components/TodoApp';
import { inputTask, addTask } from '../actions/tasks';

function mapStateToProps({ task, tasks }) {
  return {
    task,
    tasks
  };
}

function mapDispatchToProps(dispatch) {
  return {
    addTask(task) {
      dispatch(addTask(task));
    },
    inputTask(task) {
      dispatch(inputTask(task))
    }
  };
}

export default connect(mapStateToProps, mapDispatchToProps)(TodoApp);

引用:React入門 React・Reduxの導入からサーバサイドレンダリングによるUXの向上まで
ここでやっていることは以下の2つ

  • mapStateToPropsでStoreにあるtaskとtasksというStateをPropsに渡す
  • mapDispatchToPropsで該当ActionをDispatchさせる関数をPropsに渡す

これでこのコンポーネントにはPropsとして次の4つが渡される

  • task:inputフォームに入力されたタスク
  • tasks:タスク配列
  • addTask:タスクを追加する関数
  • inputTask:タスクを入力する関数
import React from 'react';

export default function TodoApp({ task, tasks, inputTask, addTask }) {
  return (
    <div>
      <input type="text" onChange={(e) => inputTask(e.target.value)} />
      <input type="button" value="add" onClick={() => addTask(task)} />
      <ul>
        {
          tasks.map(function(item, i) {
            return (
              <li key={i}>{item}</li>
            );
          })
        }
      </ul>
    </div>
  );
}

引用:React入門 React・Reduxの導入からサーバサイドレンダリングによるUXの向上まで

これだとさっきのコードから整形されたオブジェクトがPropsに渡される
先コードではActionCreate,Dispatchもやっているから、inputTaskとaddtaskを呼び出すだけでいい
これでRedux依存が消えて再利用性も高まったという。。。わかんねぇ

また読み直しか。。

参考

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?