This piece of code is from my App.js
I am using this as the default location of the map once the app opens
const [mapCenter, setMapCenter] = useState({lat: 34.80746, lng: -40.4796});I use this to update the location of the map, as selected from the dropdown menu, I am getting the lat and lng from data pulled from an endpoint
setMapCenter([data.countryInfo.lat, data.countryInfo.lng]);I am passing the following props to the Map
```<Map center={mapCenter} zoom={mapZoom} countries={mapCountries} casesType={casesType} />```This is from my utils.js file, colors of the said circles according to their case types
```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, }, };```This is from my utilis.js. I am trying to draw the circle and popup on the map. Console error (Uncaught TypeError: Cannot read properties of undefined (reading ‘lng’)
```export const showDataOnMap = (data, casesType = "cases") => ( data.map((country) => ( <Circle > center = {[country.countryInfo.lat, country.countryInfo.long]} fillOpacity = {0.4}, color={casesTypeColors[casesType].hex}, fillColor={casesTypeColors[casesType].hex}, radius={ Math.sqrt(country[casesType]) * casesTypeColors[casesType].multiplier } <Popup> <h6>Is the POPUP working</h6> </Popup> </Circle> )) );```This is from my Map.js. Console error (Uncaught TypeError: Cannot read properties of undefined (reading ‘lng’)
```import { showDataOnMap } from './utils'; function Map({center, zoom, countries, casesType}) { return ( <div className='map'> <LeafletMap center={center} zoom={zoom} scrollWheelZoom={false} > <TileLayer attribution='© <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors' url="https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png" /> {showDataOnMap(countries, casesType)} </LeafletMap> </div> ) } export default Map```
Advertisement
Answer
The problem is in your showDataOnMap function where you render the Circle:
<Circle >
center = {[country.countryInfo.lat, country.countryInfo.long]}
fillOpacity = {0.4},
color={casesTypeColors[casesType].hex},
fillColor={casesTypeColors[casesType].hex},
radius={
Math.sqrt(country[casesType]) * casesTypeColors[casesType].multiplier
}
<Popup>
<h6>Is the POPUP working</h6>
</Popup>
</Circle>
All of the properties of the Circle (center, fillOpacity, color etc) are defined after you’ve already closed the Circle element with a >. This should be changed to:
<Circle
center={[country.countryInfo.lat, country.countryInfo.long]}
fillOpacity={0.4}
color={casesTypeColors[casesType].hex}
fillColor={casesTypeColors[casesType].hex}
radius={
Math.sqrt(country[casesType]) * casesTypeColors[casesType].multiplier
}
>
There’s a working demo here that renders the circles.