質問編集履歴

4

微修正

2020/06/04 03:46

投稿

takada.m
takada.m

スコア0

test CHANGED
File without changes
test CHANGED
@@ -318,9 +318,11 @@
318
318
 
319
319
  failedFetch,
320
320
 
321
- REFETCH,
321
+ REQUEST_REFETCH,
322
+
322
-
323
+ succeedReFetch,
324
+
323
- reFetch,
325
+ failedReFetch,
324
326
 
325
327
  } from './action';
326
328
 
@@ -448,9 +450,9 @@
448
450
 
449
451
  ```
450
452
 
451
- export const reFetch = (results) => ({
453
+ export const succeedReFetch = (results) => ({
452
-
454
+
453
- type: REFETCH,
455
+ type: SUCCESS_REFETCH,
454
456
 
455
457
  response: results,
456
458
 
@@ -460,9 +462,9 @@
460
462
 
461
463
  ```
462
464
 
463
- export const reFetch = (results) => ({
465
+ export const succeedReFetch = (results) => ({
464
-
466
+
465
- type: REFETCH,
467
+ type: SUCCESS_REFETCH,
466
468
 
467
469
  response: [results],
468
470
 
@@ -476,7 +478,7 @@
476
478
 
477
479
  ```
478
480
 
479
- case REFETCH:
481
+ case SUCCESS_REFETCH:
480
482
 
481
483
  return {
482
484
 
@@ -492,7 +494,7 @@
492
494
 
493
495
  ```
494
496
 
495
- case REFETCH:
497
+ case SUCCESS_REFETCH:
496
498
 
497
499
  return Object.assign({}, state, {
498
500
 
@@ -506,7 +508,7 @@
506
508
 
507
509
  ```
508
510
 
509
- case REFETCH:
511
+ case SUCCESS_REFETCH:
510
512
 
511
513
  return {
512
514
 

3

指摘をいただいたため、修正

2020/06/04 03:46

投稿

takada.m
takada.m

スコア0

test CHANGED
File without changes
test CHANGED
@@ -74,7 +74,11 @@
74
74
 
75
75
  export const FAILED_FETCH = 'FAILED_FETCH';
76
76
 
77
+ export const REQUEST_REFETCH = 'REQUEST_REFETCH';
78
+
79
+ export const SUCCESS_REFETCH = 'SUCCESS_REFETCH';
80
+
77
- export const REFETCH = 'REFETCH';
81
+ export const FAILED_REFETCH = 'FAILED_REFETCH';
78
82
 
79
83
 
80
84
 
@@ -112,103 +116,365 @@
112
116
 
113
117
 
114
118
 
119
+ // 再レンダーAPI
120
+
121
+ export const requestReFetch = (results) => ({
122
+
123
+ type: REQUEST_REFETCH,
124
+
125
+ });
126
+
127
+
128
+
129
+ // 再レンダーAPI成功
130
+
131
+ export const succeedReFetch = (results) => ({
132
+
133
+ type: SUCCESS_REFETCH,
134
+
135
+ results,
136
+
137
+ });
138
+
139
+
140
+
141
+ // 再レンダーエラー
142
+
143
+ export const failedReFetch = (results) => ({
144
+
145
+ type: FAILED_REFETCH,
146
+
147
+ results,
148
+
149
+ });
150
+
151
+ ```
152
+
153
+  
154
+
155
+ reducer.js
156
+
157
+ ```
158
+
159
+ import {
160
+
161
+ REQUEST_FETCH,
162
+
163
+ SUCCESS_FETCH,
164
+
165
+ FAILED_FETCH,
166
+
167
+ REQUEST_REFETCH,
168
+
169
+ SUCCESS_REFETCH,
170
+
171
+ FAILED_REFETCH,
172
+
173
+ } from './action';
174
+
175
+
176
+
177
+ const initialState = {
178
+
179
+ isFetching: true,
180
+
181
+ isError: false,
182
+
183
+ response: {},
184
+
185
+ };
186
+
187
+
188
+
189
+ const Reducer = (state = initialState, action) => {
190
+
191
+ switch (action.type) {
192
+
193
+ // API
194
+
195
+ case REQUEST_FETCH:
196
+
197
+ return {
198
+
199
+ ...state,
200
+
201
+ };
202
+
203
+
204
+
205
+ // API成功
206
+
207
+ case SUCCESS_FETCH:
208
+
209
+ return {
210
+
211
+ ...state,
212
+
213
+ isFetching: false,
214
+
215
+ isError: false,
216
+
217
+      response: action.response,
218
+
219
+ };
220
+
221
+
222
+
223
+ // APIエラー
224
+
225
+ case FAILED_FETCH:
226
+
227
+ return {
228
+
229
+ ...state,
230
+
231
+ isFetching: false,
232
+
233
+ isError: true,
234
+
235
+ response: action.error,
236
+
237
+ };
238
+
239
+
240
+
241
+ // 再レンダーAPI
242
+
243
+ case REQUEST_REFETCH:
244
+
245
+ return {
246
+
247
+ ...state,
248
+
249
+ };
250
+
251
+
252
+
253
+ // 再レンダーAPI成功
254
+
255
+ case SUCCESS_REFETCH:
256
+
257
+ return {
258
+
259
+ ...state,
260
+
261
+ isFetching: false,
262
+
263
+ // *** 問題のコード ***
264
+
265
+ response: [...state.response, action.results],
266
+
267
+
268
+
269
+      // 以下も試しましたが、同じくエラー
270
+
271
+ // response: state.response.concat(action.results),
272
+
273
+ };
274
+
275
+
276
+
277
+ // 再レンダーAPIエラー
278
+
279
+ case FAILED_REFETCH:
280
+
281
+ return {
282
+
283
+ ...state,
284
+
285
+ isFetching: false,
286
+
287
+ isError: true,
288
+
289
+ response: action.reError,
290
+
291
+ };
292
+
293
+ default:
294
+
295
+ return state;
296
+
297
+ }
298
+
299
+ };
300
+
301
+ ```
302
+
303
+
304
+
305
+ 一応saga.jsも記載します。
306
+
307
+ ```
308
+
309
+ import Api from './api';
310
+
311
+ import { call, put, takeEvery } from 'redux-saga/effects';
312
+
313
+ import {
314
+
315
+ REQUEST_FETCH,
316
+
317
+ succeedFetch,
318
+
319
+ failedFetch,
320
+
321
+ REFETCH,
322
+
323
+ reFetch,
324
+
325
+ } from './action';
326
+
327
+
328
+
329
+ // API操作
330
+
331
+ function* fetchData() {
332
+
333
+ const { response, error } = yield call(Api);
334
+
335
+ if (response) {
336
+
337
+ yield put(succeedFetch(response));
338
+
339
+ } else {
340
+
341
+ yield put(failedFetch(error));
342
+
343
+ }
344
+
345
+ }
346
+
347
+
348
+
115
349
  // 再レンダー
116
350
 
351
+ function* reFetchData() {
352
+
353
+ const { results, reError } = yield call(Api);
354
+
355
+ if (results) {
356
+
357
+ yield put(succeedReFetch(results));
358
+
359
+ } else {
360
+
361
+ yield put(failedReFetch(reError));
362
+
363
+ }
364
+
365
+ }
366
+
367
+
368
+
369
+ const mySaga = [
370
+
371
+ takeEvery(REQUEST_FETCH, fetchData),
372
+
373
+ takeEvery(REQUEST_REFETCH, reFetchData),
374
+
375
+ ];
376
+
377
+
378
+
379
+ export default mySaga;
380
+
381
+ ```
382
+
383
+  
384
+
385
+  
386
+
387
+ 理屈的にも、
388
+
389
+ 記載方法としても間違っていないように見えるのですが、
390
+
391
+ 以下のエラーが出てしまいます。
392
+
393
+
394
+
395
+ ### 発生している問題・エラーメッセージ
396
+
397
+ スプレッドで記載の場合
398
+
399
+ ```
400
+
401
+ TypeError: state.response is not iterable
402
+
403
+ ```
404
+
405
+ concatで記載の場合
406
+
407
+ ```
408
+
409
+ TypeError: state.response.concat is not a function
410
+
411
+ ```
412
+
413
+ ### 該当のソースコード
414
+
415
+ reducer.js
416
+
417
+
418
+
419
+ ```
420
+
421
+ response: [...state.response, action.results],
422
+
423
+ ```
424
+
425
+ ```
426
+
427
+ response: state.response.concat(action.results),
428
+
429
+ ```
430
+
431
+   
432
+
433
+  
434
+
435
+  
436
+
437
+   
438
+
439
+  
440
+
441
+ 色々書き方を変えて試してみましたが、
442
+
443
+ エラーがなくならないか、違う結果になってしまいます。
444
+
445
+ ### 試したこと
446
+
447
+ - actionでの受け取り方を変える
448
+
449
+ ```
450
+
117
451
  export const reFetch = (results) => ({
118
452
 
119
453
  type: REFETCH,
120
454
 
121
- results,
455
+ response: results,
122
-
456
+
123
- });
457
+ });
124
-
458
+
125
- ```
459
+ ```
126
-
127
-  
128
-
129
- reducer.js
460
+
130
-
131
- ```
461
+ ```
132
-
462
+
133
- import {
463
+ export const reFetch = (results) => ({
134
-
135
- REQUEST_FETCH,
464
+
136
-
137
- SUCCESS_FETCH,
138
-
139
- FAILED_FETCH,
140
-
141
- REFETCH,
465
+ type: REFETCH,
142
-
143
- } from './action';
466
+
144
-
145
-
146
-
147
- const initialState = {
148
-
149
- isFetching: true,
150
-
151
- isError: false,
152
-
153
- response: {},
467
+ response: [results],
154
-
468
+
155
- };
469
+ });
156
-
157
-
158
-
159
- const Reducer = (state = initialState, action) => {
470
+
160
-
161
- switch (action.type) {
162
-
163
- // API
164
-
165
- case REQUEST_FETCH:
166
-
167
- return {
168
-
169
- ...state,
170
-
171
- };
471
+ ```
172
-
173
-
174
-
175
- // API成功
472
+
176
-
177
- case SUCCESS_FETCH:
473
+  
178
-
179
- return {
474
+
180
-
181
- ...state,
182
-
183
- isFetching: false,
475
+ - reducerでの受け取り方を変える
184
-
185
- isError: false,
476
+
186
-
187
-      response: action.response,
188
-
189
- };
477
+ ```
190
-
191
-
192
-
193
- // APIエラー
194
-
195
- case FAILED_FETCH:
196
-
197
- return {
198
-
199
- ...state,
200
-
201
- isFetching: false,
202
-
203
- isError: true,
204
-
205
- response: action.error,
206
-
207
- };
208
-
209
-
210
-
211
- // 再レンダー
212
478
 
213
479
  case REFETCH:
214
480
 
@@ -216,205 +482,27 @@
216
482
 
217
483
  ...state,
218
484
 
485
+ response: {...state.response, action.results},
486
+
487
+ // response: state.response.concat([action.results]),
488
+
489
+ };
490
+
491
+ ```
492
+
493
+ ```
494
+
495
+ case REFETCH:
496
+
219
- // *** 問題のコード ***
497
+ return Object.assign({}, state, {
220
498
 
221
499
  response: [...state.response, action.results],
222
500
 
223
-
224
-
225
-      // 以下も試しましたが、同じくエラー
226
-
227
- // response: state.response.concat(action.results),
228
-
229
- };
501
+ });
230
-
231
- default:
502
+
232
-
233
- return state;
234
-
235
- }
236
-
237
- };
238
-
239
- ```
503
+ ```
240
-
241
-
242
-
243
- 一応saga.jsも記載します。
504
+
244
-
245
- ```
246
-
247
- import Api from './api';
248
-
249
- import { call, put, takeEvery } from 'redux-saga/effects';
250
-
251
- import {
252
-
253
- REQUEST_FETCH,
254
-
255
- succeedFetch,
256
-
257
- failedFetch,
258
-
259
- REFETCH,
260
-
261
- reFetch,
262
-
263
- } from './action';
264
-
265
-
266
-
267
- // API操作
268
-
269
- function* fetchData() {
270
-
271
- const { response, error } = yield call(Api);
272
-
273
- if (response) {
274
-
275
- yield put(succeedFetch(response));
276
-
277
- } else {
278
-
279
- yield put(failedFetch(error));
280
-
281
- }
282
-
283
- }
284
-
285
-
286
-
287
- // 再レンダー
288
-
289
- function* reFetchData() {
290
-
291
- const { results, error } = yield call(Api);
292
-
293
- if (results) {
294
-
295
- // yield put(succeedFetch(results)); タイポのため以下に修正
296
-
297
- yield put(reFetch(results));
298
-
299
- } else {
300
-
301
- // yield put(failedFetch(error)); タイポのため以下に修正
302
-
303
- yield put(failedFetch(error));
304
-
305
- }
306
-
307
- }
308
-
309
-
310
-
311
- const mySaga = [
312
-
313
- takeEvery(REQUEST_FETCH, fetchData),
314
-
315
- takeEvery(REFETCH, reFetchData),
316
-
317
- ];
318
-
319
-
320
-
321
- export default mySaga;
322
-
323
- ```
324
-
325
-  
326
-
327
-  
328
-
329
- 理屈的にも、
330
-
331
- 記載方法としても間違っていないように見えるのですが、
332
-
333
- 以下のエラーが出てしまいます。
334
-
335
-
336
-
337
- ### 発生している問題・エラーメッセージ
338
-
339
- スプレッドで記載の場合
340
-
341
- ```
342
-
343
- TypeError: state.response is not iterable
344
-
345
- ```
346
-
347
- concatで記載の場合
348
-
349
- ```
350
-
351
- TypeError: state.response.concat is not a function
352
-
353
- ```
354
-
355
- ### 該当のソースコード
356
-
357
- reducer.js
358
-
359
-
360
-
361
- ```
362
-
363
- response: [...state.response, action.results],
364
-
365
- ```
366
-
367
- ```
368
-
369
- response: state.response.concat(action.results),
370
-
371
- ```
372
-
373
-   
374
-
375
-  
376
-
377
-  
378
-
379
-   
380
-
381
-  
382
-
383
- 色々書き方を変えて試してみましたが、
384
-
385
- エラーがなくならないか違う結果になってしまいます
505
+ 以下は再レンダされる、追加ではなく、中身が丸々入れ替わってしま
386
-
387
- ### 試したこと
388
-
389
- - actionでの受け取り方を変える
390
-
391
- ```
392
-
393
- export const reFetch = (results) => ({
394
-
395
- type: REFETCH,
396
-
397
- response: results,
398
-
399
- });
400
-
401
- ```
402
-
403
- ```
404
-
405
- export const reFetch = (results) => ({
406
-
407
- type: REFETCH,
408
-
409
- response: [results],
410
-
411
- });
412
-
413
- ```
414
-
415
-  
416
-
417
- - reducerでの受け取り方を変える
418
506
 
419
507
  ```
420
508
 
@@ -422,42 +510,12 @@
422
510
 
423
511
  return {
424
512
 
425
- ...state,
426
-
427
- response: {...state.response, action.results},
513
+ response: action.results,
428
-
429
- // response: state.response.concat([action.results]),
430
-
431
- };
432
-
433
- ```
434
-
435
- ```
436
-
437
- case REFETCH:
438
-
439
- return Object.assign({}, state, {
440
-
441
- response: [...state.response, action.results],
442
514
 
443
515
  });
444
516
 
445
517
  ```
446
518
 
447
- 以下は再レンダーされるが、追加ではなく、中身が丸々入れ替わってしまう。
448
-
449
- ```
450
-
451
- case REFETCH:
452
-
453
- return {
454
-
455
- response: action.results,
456
-
457
- });
458
-
459
- ```
460
-
461
519
   
462
520
 
463
521
   

2

誤字微修正

2020/06/04 03:41

投稿

takada.m
takada.m

スコア0

test CHANGED
File without changes
test CHANGED
@@ -20,7 +20,7 @@
20
20
 
21
21
  0. 再レンダーのためのAPIを叩く
22
22
 
23
- レスポンスはきちんとってきてる
23
+ レスポンスはきちんとってきてる
24
24
 
25
25
   
26
26
 
@@ -40,7 +40,7 @@
40
40
 
41
41
 
42
42
 
43
- ※APIからのレスポンスは初期レンダーも、再レンダー時も配列がJSONの配列が返ってくる。
43
+ ※APIからのレスポンスは初期レンダーも、再レンダー時もJSONの配列が返ってくる。
44
44
 
45
45
 
46
46
 
@@ -124,6 +124,8 @@
124
124
 
125
125
  ```
126
126
 
127
+  
128
+
127
129
  reducer.js
128
130
 
129
131
  ```
@@ -236,6 +238,8 @@
236
238
 
237
239
  ```
238
240
 
241
+
242
+
239
243
  一応saga.jsも記載します。
240
244
 
241
245
  ```
@@ -252,7 +256,9 @@
252
256
 
253
257
  failedFetch,
254
258
 
259
+ REFETCH,
260
+
255
- reFetch
261
+ reFetch,
256
262
 
257
263
  } from './action';
258
264
 
@@ -288,13 +294,13 @@
288
294
 
289
295
  // yield put(succeedFetch(results)); タイポのため以下に修正
290
296
 
291
- yield put(succeedReFetch(results));
297
+ yield put(reFetch(results));
292
298
 
293
299
  } else {
294
300
 
295
301
  // yield put(failedFetch(error)); タイポのため以下に修正
296
302
 
297
- yield put(failedReFetch(error));
303
+ yield put(failedFetch(error));
298
304
 
299
305
  }
300
306
 

1

タイポがあったため、saga.js内部を修正してます!

2020/06/04 00:52

投稿

takada.m
takada.m

スコア0

test CHANGED
File without changes
test CHANGED
@@ -286,11 +286,15 @@
286
286
 
287
287
  if (results) {
288
288
 
289
+ // yield put(succeedFetch(results)); タイポのため以下に修正
290
+
289
- yield put(succeedFetch(results));
291
+ yield put(succeedReFetch(results));
290
292
 
291
293
  } else {
292
294
 
295
+ // yield put(failedFetch(error)); タイポのため以下に修正
296
+
293
- yield put(failedFetch(error));
297
+ yield put(failedReFetch(error));
294
298
 
295
299
  }
296
300