teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

redux-thunkの例を追加

2019/03/04 10:41

投稿

noka_blank
noka_blank

スコア252

answer CHANGED
@@ -47,6 +47,51 @@
47
47
  親コンポーネントを用いてデータを子コンポーネントに渡すという部分は認識が合っていると思います。
48
48
  全ての状態が1つの親コンポーネントで表現できればそれでも問題ないと思いますが、おそらくいくつかの単位に分けたくなると思いますので、ご参考いただければと思います。
49
49
 
50
+ 追記: API呼び出しをどこに書くのか
51
+
52
+ redux-thunkを使ったパターンを紹介します。
53
+
54
+ ```js
55
+ export default function reducer(state, action) {
56
+ switch (action.type) {
57
+ case REQUEST_LOGIN:
58
+ return Object.assign({}, state, {
59
+ isFetching: true,
60
+ });
61
+ case RESPONSE_LOGIN:
62
+ return Object.assign({}, state, {
63
+ isFetching: false,
64
+ isLogin: action.isLogin,
65
+ });
66
+ default:
67
+ return state;
68
+ }
69
+ }
70
+
71
+ export function requestLogin() {
72
+ return {
73
+ type: REQUEST_LOGIN,
74
+ };
75
+ }
76
+
77
+ export function responseLogin(json) {
78
+ return {
79
+ type: RESPONSE_LOGIN,
80
+ isLogin: json.is_login,
81
+ };
82
+ }
83
+ // この関数がコンポーネントから呼ばれる
84
+ // fetchの結果、非同期でActionがコールされ、Storeが書き換わります。
85
+ export function isLogin() {
86
+ return (dispatch) => {
87
+ dispatch(requestLogin());
88
+ return fetch('/api/auth', { credentials: 'include', cache: 'no-store' })
89
+ .then(response => response.json())
90
+ .then(json => dispatch(responseLogin(json)));
91
+ };
92
+ }
93
+ ```
94
+
50
95
  reactは自由度が高いライブラリですので、色々なサイトを見てもそれぞれ違った方法で構築されている事が多いので、戸惑うことがあると思いますが、それがReactの良さでもあるのかもしれませんね。
51
96
  回答になりましたでしょうか?
52
97
  追加のご質問があれば、コメントいただければと思います。