Reputation: 129
I need to mount a dynamic 'select' on the react, but I have a problem.
I'm doing a 'for' to call an API, however as the 'for' is executed, I lose the previous values.
How can I maintain these values?
I tried to do this, but it generated an infinite loop:
const Form = (props) => {
const [makes, setMakes] = useState([]);
const [models, setModels] = useState([]);
useEffect(() => {
api.get("Make").then((response) => {
setMakes([...response.data]);
});
}, []);
async function handleModels() {
for (let i = 0; i < makes.length; i++) {
const response = await api.get(`Model?MakeID=${makes[i]["ID"]}`);
const model = response.data;
setModels([...models, model]);
}
}
if (makes.length) {
handleModels();
}
Thanks!
Upvotes: 0
Views: 334
Reputation: 2976
You need to pass a function that takes in current state:
setModels((models)=> [...models, model]);
Or even better, push results to an array and then update state only once:
async function handleModels() {
let allModels = []
for (let i = 0; i < makes.length; i++) {
const response = await api.get(`Model?MakeID=${makes[i]["ID"]}`);
const model = response.data;
allModels.push(model);
}
setModels(allModels);
}
See working example: https://codesandbox.io/s/happy-sunset-nv3oc?file=/src/App.js
Upvotes: 1