Excuse my lack of knowledge as i am fairly new to ReactJS. I'm trying to create a dynamic Dropdown system where i have The Country DropDown and the cities DropDown, and i want to fetch my data from a const that has multiple arrays in it, here's an example of the const i have:
const countries = {"France":["Paris","Marseille","Lille","Lyon"],
"Usa":["New York","San Francisco","Austin","Dallas"]
};
I know that i need to use the useState and the useEffect hooks and a function to handle the event changes.
What i'm having a hard time to figure out is how to deal with the data format, especially that the variables inside the const can't be accessed easily, it would've been much easier if the data was in this shape:
const countries =[
{ name: 'Usa', cities: ["New York", "San Francisco", "Austin", "Dallas"]},
{ name: 'France', cities: ["Paris", "Marseille", "Lille", "Lyon"]},
]
But unfortunately the first sample is the shape of data i have to deal with and i can't modify it manually because i have a very large sample of data. So if anyone could just direct me briefly into the steps i should make, i would be very thankful.
You can abstract the country in a separate list with the "Object.keys" and use the first one to get the cities. I think in this case you don't need to use "useEffect".
Example here: https://codesandbox.io/s/dropdown-react-p0nj7
import React, { useState } from "react";
import "./styles.css";
export default function App() {
const [cities, setCities] = useState([]);
const [selectedCounty, setSelectedCountry] = useState("");
const [selectedCity, setSelectedCity] = useState("");
const countries = {
France: ["Paris", "Marseille", "Lille", "Lyon"],
Usa: ["New York", "San Francisco", "Austin", "Dallas"],
Brazil: ["São Paulo", "Rio de Janeiro", "Salvador"]
};
const countryList = Object.keys(countries).map(key => ({
name: key
}));
function handleCountrySelect(e) {
console.log("Selected country", e.target.value);
const countrySel = e.target.value;
const citiesSel = countrySel !== "" ? countries[countrySel] : [];
setSelectedCountry(countrySel);
setCities(citiesSel);
setSelectedCity("");
}
function handleCitySelect(e) {
console.log("Selected city", e.target.value);
const citiesSel = e.target.value;
setSelectedCity(citiesSel);
}
return (
<div className="App">
<h1>Example DropDown Coutries and Cities</h1>
<div className="Container">
<select
name="Countries"
onChange={e => handleCountrySelect(e)}
value={selectedCounty}
>
<option value="">Select the country</option>
{countryList.map((country, key) => (
<option key={key} value={country.name}>
{country.name}
</option>
))}
</select>
<select
name="Cities"
onChange={e => handleCitySelect(e)}
value={selectedCity}
>
<option value="">Select the city</option>
{cities.map((city, key) => (
<option key={key} value={city}>
{city}
</option>
))}
</select>
</div>
</div>
);
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With