質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

Q&A

解決済

1回答

1819閲覧

React.jsにてWarning: Each child in a list should have a unique "key" prop.というエラーが発生しました。

React

総合スコア10

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

0グッド

0クリップ

投稿2020/08/07 08:56

編集2020/08/08 01:07

コロナ感染のトラッカーを作る過程でタイトルのようなエラーが発生しました。
DeepLにて翻訳をかけてみたら「警告。リスト内の各子は一意の "キー" プロップを持つ必要があります。」
と出てきたので、Reaactの公式リファレンスの方で「リストとkey」、「レンダープロップ」について確認してみましたが、自分のエラーに対してどういった風にその知識を転換させ、エラー解決に持ち込めるのか分からなくなってしまったので質問させていただきました。

エラー(画像)

イメージ説明
イメージ説明

該当のソースコード(App.js)

import React, { useState, useEffect } from "react"; import "./App.css"; import { MenuItem, FormControl, Select, Card, CardContent, } from "@material-ui/core"; import InfoBox from "./InfoBox"; import LineGraph from "./LineGraph"; import Table from "./Table"; import { sortData, prettyPrintStat } from "./util"; import numeral from "numeral"; import Map from "./Map"; import "leaflet/dist/leaflet.css"; const App = () => { const [country, setInputCountry] = useState("worldwide"); const [countryInfo, setCountryInfo] = useState({}); const [countries, setCountries] = useState([]); const [mapCountries, setMapCountries] = useState([]); const [tableData, setTableData] = useState([]); const [casesType, setCasesType] = useState("cases"); const [mapCenter, setMapCenter] = useState({ lat: 34.80746, lng: -40.4796 }); const [mapZoom, setMapZoom] = useState(3); useEffect(() => { fetch("https://disease.sh/v3/covid-19/all") .then((response) => response.json()) .then((data) => { setCountryInfo(data); }); }, []); useEffect(() => { const getCountriesData = async () => { fetch("https://disease.sh/v3/covid-19/countries") .then((response) => response.json()) .then((data) => { const countries = data.map((country) => ({ name: country.country, value: country.countryInfo.iso2, })); let sortedData = sortData(data); setCountries(countries); setMapCountries(data); setTableData(sortedData); }); }; getCountriesData(); }, []); console.log(casesType); const onCountryChange = async (e) => { const countryCode = e.target.value; const url = countryCode === "worldwide" ? "https://disease.sh/v3/covid-19/all" : `https://disease.sh/v3/covid-19/countries/${countryCode}`; await fetch(url) .then((response) => response.json()) .then((data) => { setInputCountry(countryCode); setCountryInfo(data); setMapCenter([data.countryInfo.lat, data.countryInfo.long]); setMapZoom(4); }); }; return ( <div className="app"> <div className="app__left"> <div className="app__header"> <h1>COVID-19 Tracker</h1> <FormControl className="app__dropdown"> <Select variant="outlined" value={country} onChange={onCountryChange} > <MenuItem value="worldwide">Worldwide</MenuItem> {countries.map((country) => ( <MenuItem value={country.value}>{country.name}</MenuItem> ))} </Select> </FormControl> </div> <div className="app__stats"> <InfoBox onClick={(e) => setCasesType("cases")} title="Coronavirus Cases" isRed active={casesType === "cases"} cases={prettyPrintStat(countryInfo.todayCases)} total={numeral(countryInfo.cases).format("0.0a")} /> <InfoBox onClick={(e) => setCasesType("recovered")} title="Recovered" active={casesType === "recovered"} cases={prettyPrintStat(countryInfo.todayRecovered)} total={numeral(countryInfo.recovered).format("0.0a")} /> <InfoBox onClick={(e) => setCasesType("deaths")} title="Deaths" isRed active={casesType === "deaths"} cases={prettyPrintStat(countryInfo.todayDeaths)} total={numeral(countryInfo.deaths).format("0.0a")} /> </div> <Map countries={mapCountries} casesType={casesType} center={mapCenter} zoom={mapZoom} /> </div> <Card className="app__right"> <CardContent> <div className="app__information"> <h3>Live Cases by Country</h3> <Table countries={tableData} /> <h3>Worldwide new {casesType}</h3> <LineGraph casesType={casesType} /> </div> </CardContent> </Card> </div> ); }; export default App;

該当のソースコード(Table.js)

import React from "react"; import "./Table.css"; import numeral from "numeral"; function Table({ countries }) { return ( <div className="table"> {countries.map((country) => ( <tr> <td>{country.country}</td> <td> <strong>{numeral(country.cases).format("0,0")}</strong> </td> </tr> ))} </div> ); } export default Table;

###該当のソースコード(Map.js)

import React from "react"; import { Map as LeafletMap, TileLayer } from "react-leaflet"; import "./Map.css"; import { showDataOnMap } from "./util"; function Map({ countries, casesType, center, zoom }) { return ( <div className="map"> <LeafletMap center={center} zoom={zoom}> <TileLayer url="https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png" attribution='&copy; <a href="http://osm.org/copyright">OpenStreetMap</a> contributors' /> {showDataOnMap(countries, casesType)} </LeafletMap> </div> ); } export default Map;

###該当のソースコード(util.js)

import React from "react"; import numeral from "numeral"; import { Circle, Popup } from "react-leaflet"; const casesTypeColors = { cases: { hex: "#CC1034", rgb: "rgb(204, 16, 52)", half_op: "rgba(204, 16, 52, 0.5)", multiplier: 800, }, recovered: { hex: "#7dd71d", rgb: "rgb(125, 215, 29)", half_op: "rgba(125, 215, 29, 0.5)", multiplier: 1200, }, deaths: { hex: "#fb4443", rgb: "rgb(251, 68, 67)", half_op: "rgba(251, 68, 67, 0.5)", multiplier: 2000, }, }; export const sortData = (data) => { let sortedData = [...data]; sortedData.sort((a, b) => { if (a.cases > b.cases) { return -1; } else { return 1; } }); return sortedData; }; export const prettyPrintStat = (stat) => stat ? `+${numeral(stat).format("0.0a")}` : "+0"; export const showDataOnMap = (data, casesType = "cases") => data.map((country) => ( <Circle center={[country.countryInfo.lat, country.countryInfo.long]} color={casesTypeColors[casesType].hex} fillColor={casesTypeColors[casesType].hex} fillOpacity={0.4} radius={ Math.sqrt(country[casesType]) * casesTypeColors[casesType].multiplier } > <Popup> <div className="info-container"> <div className="info-flag" style={{ backgroundImage: `url(${country.countryInfo.flag})` }} ></div> <div className="info-name">{country.country}</div> <div className="info-confirmed"> Cases: {numeral(country.cases).format("0,0")} </div> <div className="info-recovered"> Recovered: {numeral(country.recovered).format("0,0")} </div> <div className="info-deaths"> Deaths: {numeral(country.deaths).format("0,0")} </div> </div> </Popup> </Circle> ));

補足情報(OS/参考動画/GitHub/react公式)

OS Windows10
学習元動画
GitHub
React公式

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2020/08/07 09:05

Map.jsの中身も提示していただけませんでしょうか?
React

2020/08/07 09:09

ありがとうございます! Map.jsの方も表示させていただきました。
guest

回答1

0

ベストアンサー

エラーメッセージのとおりです。showDataOnMapの中で配列をJSXの配列に変換していますが、いちばん外側に当たる<Circle>に、各要素ごとにユニークなkeyを与える必要があります。

この場合、country.country(国名…ですよね)あたりが適任かと思います。

投稿2020/08/08 01:21

maisumakun

総合スコア145183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

React

2020/08/09 12:53

エラーを翻訳してみたらできました!ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問