質問編集履歴
6
文法の修正をいたしました
test
CHANGED
@@ -1 +1 @@
|
|
1
|
-
React.jsにて
|
1
|
+
React.jsにてWarning: Each child in a list should have a unique "key" prop.というエラーが発生しました。
|
test
CHANGED
@@ -1,22 +1,14 @@
|
|
1
|
-
### 前提・実現したいこと
|
2
|
-
|
3
|
-
コロナ感染のトラッカーを作っているのですが、感染者数推移のグラフを作るあたりから画面にグラフが表示されなくなり、ほぼリアルタイムでコロナ感染数がわかるAPIとマップを作る頃には今まで作っていたものが画面に表示されなくなりました。
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
1
|
+
コロナ感染のトラッカーを作る過程でタイトルのようなエラーが発生しました。
|
2
|
+
|
8
|
-
|
3
|
+
DeepLにて翻訳をかけてみたら「警告。リスト内の各子は一意の "キー" プロップを持つ必要があります。」
|
4
|
+
|
9
|
-
|
5
|
+
と出てきたので、Reaactの公式リファレンスの方で「リストとkey」、「レンダープロップ」について確認してみましたが、自分のエラーに対してどういった風にその知識を転換させ、エラー解決に持ち込めるのか分からなくなってしまったので質問させていただきました。
|
10
6
|
|
11
7
|
### エラー(画像)
|
12
8
|
|
13
|
-
![イメージ説明](
|
9
|
+
![イメージ説明](9b159c0efe352c3d440321bcd7b780e2.png)
|
14
|
-
|
15
|
-
|
10
|
+
|
16
|
-
|
17
|
-
![イメージ説明](e
|
11
|
+
![イメージ説明](31733ec13db3924e3f7c65995e53899c.png)
|
18
|
-
|
19
|
-
|
20
12
|
|
21
13
|
### 該当のソースコード(App.js)
|
22
14
|
|
@@ -130,7 +122,7 @@
|
|
130
122
|
|
131
123
|
|
132
124
|
|
133
|
-
console.log(
|
125
|
+
console.log(casesType);
|
134
126
|
|
135
127
|
|
136
128
|
|
@@ -204,8 +196,6 @@
|
|
204
196
|
|
205
197
|
</div>
|
206
198
|
|
207
|
-
|
208
|
-
|
209
199
|
<div className="app__stats">
|
210
200
|
|
211
201
|
<InfoBox
|
@@ -280,9 +270,9 @@
|
|
280
270
|
|
281
271
|
<Table countries={tableData} />
|
282
272
|
|
283
|
-
<h3
|
273
|
+
<h3>Worldwide new {casesType}</h3>
|
284
|
-
|
274
|
+
|
285
|
-
<LineGraph c
|
275
|
+
<LineGraph casesType={casesType} />
|
286
276
|
|
287
277
|
</div>
|
288
278
|
|
@@ -304,128 +294,252 @@
|
|
304
294
|
|
305
295
|
|
306
296
|
|
307
|
-
### 該当のソースコード(
|
297
|
+
### 該当のソースコード(Table.js)
|
308
|
-
|
298
|
+
|
309
|
-
```
|
299
|
+
```
|
310
|
-
|
300
|
+
|
311
|
-
import React from
|
301
|
+
import React from "react";
|
312
|
-
|
302
|
+
|
313
|
-
import "./
|
303
|
+
import "./Table.css";
|
314
|
-
|
304
|
+
|
315
|
-
import
|
305
|
+
import numeral from "numeral";
|
316
|
-
|
317
|
-
|
318
|
-
|
319
|
-
|
306
|
+
|
320
|
-
|
307
|
+
|
308
|
+
|
321
|
-
|
309
|
+
function Table({ countries }) {
|
322
310
|
|
323
311
|
return (
|
324
312
|
|
313
|
+
<div className="table">
|
314
|
+
|
315
|
+
{countries.map((country) => (
|
316
|
+
|
317
|
+
<tr>
|
318
|
+
|
319
|
+
<td>{country.country}</td>
|
320
|
+
|
321
|
+
<td>
|
322
|
+
|
323
|
+
<strong>{numeral(country.cases).format("0,0")}</strong>
|
324
|
+
|
325
|
+
</td>
|
326
|
+
|
327
|
+
</tr>
|
328
|
+
|
329
|
+
))}
|
330
|
+
|
331
|
+
</div>
|
332
|
+
|
333
|
+
);
|
334
|
+
|
335
|
+
}
|
336
|
+
|
337
|
+
|
338
|
+
|
339
|
+
export default Table;
|
340
|
+
|
341
|
+
```
|
342
|
+
|
343
|
+
###該当のソースコード(Map.js)
|
344
|
+
|
345
|
+
```
|
346
|
+
|
347
|
+
import React from "react";
|
348
|
+
|
349
|
+
import { Map as LeafletMap, TileLayer } from "react-leaflet";
|
350
|
+
|
351
|
+
import "./Map.css";
|
352
|
+
|
353
|
+
import { showDataOnMap } from "./util";
|
354
|
+
|
355
|
+
|
356
|
+
|
357
|
+
function Map({ countries, casesType, center, zoom }) {
|
358
|
+
|
359
|
+
return (
|
360
|
+
|
361
|
+
<div className="map">
|
362
|
+
|
363
|
+
<LeafletMap center={center} zoom={zoom}>
|
364
|
+
|
365
|
+
<TileLayer
|
366
|
+
|
367
|
+
url="https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png"
|
368
|
+
|
369
|
+
attribution='© <a href="http://osm.org/copyright">OpenStreetMap</a> contributors'
|
370
|
+
|
371
|
+
/>
|
372
|
+
|
373
|
+
{showDataOnMap(countries, casesType)}
|
374
|
+
|
375
|
+
</LeafletMap>
|
376
|
+
|
377
|
+
</div>
|
378
|
+
|
379
|
+
);
|
380
|
+
|
381
|
+
}
|
382
|
+
|
383
|
+
|
384
|
+
|
385
|
+
export default Map;
|
386
|
+
|
387
|
+
```
|
388
|
+
|
389
|
+
###該当のソースコード(util.js)
|
390
|
+
|
391
|
+
```
|
392
|
+
|
393
|
+
import React from "react";
|
394
|
+
|
395
|
+
import numeral from "numeral";
|
396
|
+
|
397
|
+
import { Circle, Popup } from "react-leaflet";
|
398
|
+
|
399
|
+
|
400
|
+
|
401
|
+
const casesTypeColors = {
|
402
|
+
|
403
|
+
cases: {
|
404
|
+
|
405
|
+
hex: "#CC1034",
|
406
|
+
|
407
|
+
rgb: "rgb(204, 16, 52)",
|
408
|
+
|
409
|
+
half_op: "rgba(204, 16, 52, 0.5)",
|
410
|
+
|
411
|
+
multiplier: 800,
|
412
|
+
|
413
|
+
},
|
414
|
+
|
415
|
+
recovered: {
|
416
|
+
|
417
|
+
hex: "#7dd71d",
|
418
|
+
|
419
|
+
rgb: "rgb(125, 215, 29)",
|
420
|
+
|
421
|
+
half_op: "rgba(125, 215, 29, 0.5)",
|
422
|
+
|
423
|
+
multiplier: 1200,
|
424
|
+
|
425
|
+
},
|
426
|
+
|
427
|
+
deaths: {
|
428
|
+
|
429
|
+
hex: "#fb4443",
|
430
|
+
|
431
|
+
rgb: "rgb(251, 68, 67)",
|
432
|
+
|
433
|
+
half_op: "rgba(251, 68, 67, 0.5)",
|
434
|
+
|
435
|
+
multiplier: 2000,
|
436
|
+
|
437
|
+
},
|
438
|
+
|
439
|
+
};
|
440
|
+
|
441
|
+
|
442
|
+
|
443
|
+
export const sortData = (data) => {
|
444
|
+
|
445
|
+
let sortedData = [...data];
|
446
|
+
|
447
|
+
sortedData.sort((a, b) => {
|
448
|
+
|
449
|
+
if (a.cases > b.cases) {
|
450
|
+
|
451
|
+
return -1;
|
452
|
+
|
453
|
+
} else {
|
454
|
+
|
455
|
+
return 1;
|
456
|
+
|
457
|
+
}
|
458
|
+
|
459
|
+
});
|
460
|
+
|
461
|
+
return sortedData;
|
462
|
+
|
463
|
+
};
|
464
|
+
|
465
|
+
|
466
|
+
|
467
|
+
export const prettyPrintStat = (stat) =>
|
468
|
+
|
469
|
+
stat ? `+${numeral(stat).format("0.0a")}` : "+0";
|
470
|
+
|
471
|
+
|
472
|
+
|
473
|
+
export const showDataOnMap = (data, casesType = "cases") =>
|
474
|
+
|
475
|
+
data.map((country) => (
|
476
|
+
|
325
|
-
<C
|
477
|
+
<Circle
|
478
|
+
|
326
|
-
|
479
|
+
center={[country.countryInfo.lat, country.countryInfo.long]}
|
480
|
+
|
481
|
+
color={casesTypeColors[casesType].hex}
|
482
|
+
|
483
|
+
fillColor={casesTypeColors[casesType].hex}
|
484
|
+
|
327
|
-
|
485
|
+
fillOpacity={0.4}
|
486
|
+
|
328
|
-
|
487
|
+
radius={
|
488
|
+
|
329
|
-
c
|
489
|
+
Math.sqrt(country[casesType]) * casesTypeColors[casesType].multiplier
|
330
|
-
|
331
|
-
|
490
|
+
|
332
|
-
|
333
|
-
}
|
491
|
+
}
|
334
492
|
|
335
493
|
>
|
336
494
|
|
337
|
-
<
|
338
|
-
|
339
|
-
<
|
340
|
-
|
341
|
-
|
342
|
-
|
343
|
-
|
344
|
-
|
345
|
-
|
346
|
-
|
347
|
-
|
348
|
-
|
349
|
-
</
|
350
|
-
|
351
|
-
|
352
|
-
|
353
|
-
|
354
|
-
|
355
|
-
|
356
|
-
|
357
|
-
<
|
358
|
-
|
359
|
-
|
360
|
-
|
361
|
-
</
|
362
|
-
|
363
|
-
|
364
|
-
|
365
|
-
}
|
366
|
-
|
367
|
-
|
368
|
-
|
369
|
-
|
370
|
-
|
371
|
-
|
372
|
-
|
373
|
-
|
374
|
-
|
375
|
-
|
376
|
-
|
377
|
-
|
378
|
-
|
379
|
-
|
380
|
-
|
381
|
-
import React from "react";
|
382
|
-
|
383
|
-
import "./Map.css";
|
384
|
-
|
385
|
-
import { Map as LeafleMap, TileLayer } from "react-leaflet";
|
386
|
-
|
387
|
-
import { showDataOnmap } from "./util";
|
388
|
-
|
389
|
-
|
390
|
-
|
391
|
-
function Map({ countries, casesType, center, zoom }) {
|
392
|
-
|
393
|
-
return (
|
394
|
-
|
395
|
-
<div className="map">
|
396
|
-
|
397
|
-
<LeafleMap center={center} zoom={zoom}>
|
398
|
-
|
399
|
-
<TileLayer
|
400
|
-
|
401
|
-
uurl="https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png"
|
402
|
-
|
403
|
-
attribution='© <a href="http://osm.org/copyright">OpenStreetMap</a> contributors'
|
404
|
-
|
405
|
-
/>
|
406
|
-
|
407
|
-
{showDataOnmap(countries, casesType)}
|
408
|
-
|
409
|
-
</LeafleMap>
|
410
|
-
|
411
|
-
</div>
|
412
|
-
|
413
|
-
);
|
414
|
-
|
415
|
-
}
|
416
|
-
|
417
|
-
|
418
|
-
|
419
|
-
export default Map;
|
420
|
-
|
421
|
-
|
422
|
-
|
423
|
-
```
|
424
|
-
|
425
|
-
### 補足情報(OS/参考動画/GitHubのソースコード)
|
495
|
+
<Popup>
|
496
|
+
|
497
|
+
<div className="info-container">
|
498
|
+
|
499
|
+
<div
|
500
|
+
|
501
|
+
className="info-flag"
|
502
|
+
|
503
|
+
style={{ backgroundImage: `url(${country.countryInfo.flag})` }}
|
504
|
+
|
505
|
+
></div>
|
506
|
+
|
507
|
+
<div className="info-name">{country.country}</div>
|
508
|
+
|
509
|
+
<div className="info-confirmed">
|
510
|
+
|
511
|
+
Cases: {numeral(country.cases).format("0,0")}
|
512
|
+
|
513
|
+
</div>
|
514
|
+
|
515
|
+
<div className="info-recovered">
|
516
|
+
|
517
|
+
Recovered: {numeral(country.recovered).format("0,0")}
|
518
|
+
|
519
|
+
</div>
|
520
|
+
|
521
|
+
<div className="info-deaths">
|
522
|
+
|
523
|
+
Deaths: {numeral(country.deaths).format("0,0")}
|
524
|
+
|
525
|
+
</div>
|
526
|
+
|
527
|
+
</div>
|
528
|
+
|
529
|
+
</Popup>
|
530
|
+
|
531
|
+
</Circle>
|
532
|
+
|
533
|
+
));
|
534
|
+
|
535
|
+
```
|
536
|
+
|
537
|
+
### 補足情報(OS/参考動画/GitHub/react公式)
|
426
538
|
|
427
539
|
OS Windows10
|
428
540
|
|
429
541
|
[学習元動画](https://www.youtube.com/watch?v=cF3pIMJUZxM&feature=youtu.be&t=12317)
|
430
542
|
|
431
543
|
[GitHub](https://github.com/CleverProgrammers/react-covid-tracker)
|
544
|
+
|
545
|
+
[React公式](https://ja.reactjs.org/)
|
5
エラー文を追加しました
test
CHANGED
File without changes
|
test
CHANGED
@@ -14,6 +14,10 @@
|
|
14
14
|
|
15
15
|
![イメージ説明](65639208c3ad37f63b530c6ee24a414f.png)
|
16
16
|
|
17
|
+
![イメージ説明](e2d97b75c44ed7c97a24ae073836e0c1.png)
|
18
|
+
|
19
|
+
|
20
|
+
|
17
21
|
### 該当のソースコード(App.js)
|
18
22
|
|
19
23
|
```
|
@@ -298,6 +302,8 @@
|
|
298
302
|
|
299
303
|
```
|
300
304
|
|
305
|
+
|
306
|
+
|
301
307
|
### 該当のソースコード(InfoBox.js)
|
302
308
|
|
303
309
|
```
|
@@ -366,6 +372,8 @@
|
|
366
372
|
|
367
373
|
```
|
368
374
|
|
375
|
+
|
376
|
+
|
369
377
|
### 該当のソースコード(Map.js)
|
370
378
|
|
371
379
|
```
|
4
Map.jsのコードを追加しました
test
CHANGED
File without changes
|
test
CHANGED
@@ -366,6 +366,54 @@
|
|
366
366
|
|
367
367
|
```
|
368
368
|
|
369
|
+
### 該当のソースコード(Map.js)
|
370
|
+
|
371
|
+
```
|
372
|
+
|
373
|
+
import React from "react";
|
374
|
+
|
375
|
+
import "./Map.css";
|
376
|
+
|
377
|
+
import { Map as LeafleMap, TileLayer } from "react-leaflet";
|
378
|
+
|
379
|
+
import { showDataOnmap } from "./util";
|
380
|
+
|
381
|
+
|
382
|
+
|
383
|
+
function Map({ countries, casesType, center, zoom }) {
|
384
|
+
|
385
|
+
return (
|
386
|
+
|
387
|
+
<div className="map">
|
388
|
+
|
389
|
+
<LeafleMap center={center} zoom={zoom}>
|
390
|
+
|
391
|
+
<TileLayer
|
392
|
+
|
393
|
+
uurl="https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png"
|
394
|
+
|
395
|
+
attribution='© <a href="http://osm.org/copyright">OpenStreetMap</a> contributors'
|
396
|
+
|
397
|
+
/>
|
398
|
+
|
399
|
+
{showDataOnmap(countries, casesType)}
|
400
|
+
|
401
|
+
</LeafleMap>
|
402
|
+
|
403
|
+
</div>
|
404
|
+
|
405
|
+
);
|
406
|
+
|
407
|
+
}
|
408
|
+
|
409
|
+
|
410
|
+
|
411
|
+
export default Map;
|
412
|
+
|
413
|
+
|
414
|
+
|
415
|
+
```
|
416
|
+
|
369
417
|
### 補足情報(OS/参考動画/GitHubのソースコード)
|
370
418
|
|
371
419
|
OS Windows10
|
3
文法の修正をいたしました
test
CHANGED
File without changes
|
test
CHANGED
@@ -6,6 +6,14 @@
|
|
6
6
|
|
7
7
|
実現したいことはエラーを解決して推移グラフと感染マップが表示されるようにしたいです。
|
8
8
|
|
9
|
+
|
10
|
+
|
11
|
+
### エラー(画像)
|
12
|
+
|
13
|
+
![イメージ説明](dabd7193c108e3deccdff97b0ff7be32.png)
|
14
|
+
|
15
|
+
![イメージ説明](65639208c3ad37f63b530c6ee24a414f.png)
|
16
|
+
|
9
17
|
### 該当のソースコード(App.js)
|
10
18
|
|
11
19
|
```
|
2
タイトルに誤字があったので訂正いたしました
test
CHANGED
@@ -1 +1 @@
|
|
1
|
-
Reactjsにて未定義のプロパティ 'replace' を読みとれませんというエラーで困ってます
|
1
|
+
React.jsにて未定義のプロパティ 'replace' を読みとれませんというエラーで困ってます
|
test
CHANGED
File without changes
|
1
文法の修正をいたしました
test
CHANGED
@@ -1 +1 @@
|
|
1
|
-
Reactjsにて未定義のプロパティ 'replace' を読みとれませんと
|
1
|
+
Reactjsにて未定義のプロパティ 'replace' を読みとれませんというエラーで困ってます
|
test
CHANGED
@@ -1,8 +1,10 @@
|
|
1
|
-
###
|
1
|
+
### 前提・実現したいこと
|
2
|
+
|
2
|
-
|
3
|
+
コロナ感染のトラッカーを作っているのですが、感染者数推移のグラフを作るあたりから画面にグラフが表示されなくなり、ほぼリアルタイムでコロナ感染数がわかるAPIとマップを作る頃には今まで作っていたものが画面に表示されなくなりました。
|
4
|
+
|
5
|
+
|
6
|
+
|
3
|
-
|
7
|
+
実現したいことはエラーを解決して推移グラフと感染マップが表示されるようにしたいです。
|
4
|
-
|
5
|
-
![イメージ説明](4dcafb808446e92580c18d4199ce7828.png)
|
6
8
|
|
7
9
|
### 該当のソースコード(App.js)
|
8
10
|
|
@@ -360,6 +362,6 @@
|
|
360
362
|
|
361
363
|
OS Windows10
|
362
364
|
|
363
|
-
[
|
365
|
+
[学習元動画](https://www.youtube.com/watch?v=cF3pIMJUZxM&feature=youtu.be&t=12317)
|
364
366
|
|
365
367
|
[GitHub](https://github.com/CleverProgrammers/react-covid-tracker)
|