[Suggestion]: Alternative Approach for Managing State with Event Handlers
Nessuno ha ancora preso questa issue.
- Lingua principale
- JavaScript
- Stelle
- 11.8k
- Fork
- 7.9k
- Merge medio
- 1g 11h
- PR unite (30g)
- 11
Descrizione
Summary
In some cases, React documentation suggests using a chain of useEffect hooks to manage state updates when synchronizing with network requests. However, it is also possible to handle these scenarios using event handlers effectively.
Page
https://react.dev/learn/you-might-not-need-an-effect#sharing-logic-between-event-handlers
Details
Hi,
In the documentation, it states: "In some cases, you can’t calculate the next state directly in the event handler. For example, imagine a form with multiple dropdowns where the options of the next dropdown depend on the selected value of the previous dropdown. Then, a chain of Effects is appropriate because you are synchronizing with network." However, when properly structured, it is also possible to manage these scenarios using event handlers.
For example, in the following setup, we can handle dropdown changes and asynchronous data updates using event handlers:
import React, { useState, useEffect } from 'react';
export default function CascadingDropdowns() {
const [countries, setCountries] = useState([]);
const [cities, setCities] = useState([]);
const [regions, setRegions] = useState([]);
const [selectedCountry, setSelectedCountry] = useState('');
const [selectedCity, setSelectedCity] = useState('');
useEffect(() => {
async function fetchCountries() {
const response = await fetch('/api/countries'); // Example API call
const data = await response.json();
setCountries(data);
}
fetchCountries();
}, []);
const handleCountryChange = async (event) => {
const country = event.target.value;
setSelectedCountry(country);
setSelectedCity('');
setCities([]);
setRegions([]);
if (country) {
const response = await fetch(`/api/cities?country=${country}`);
const data = await response.json();
setCities(data);
}
};
const handleCityChange = async (event) => {
const city = event.target.value;
setSelectedCity(city);
setRegions([]);
if (city) {
const response = await fetch(`/api/regions?city=${city}`);
const data = await response.json();
setRegions(data);
}
};
return (
<div>
<div>
<label>Country:</label>
<select value={selectedCountry} onChange={handleCountryChange}>
<option value="">Select Country</option>
{countries.map((country) => (
<option key={country.id} value={country.name}>
{country.name}
</option>
))}
</select>
</div>
<div>
<label>City:</label>
<select value={selectedCity} onChange={handleCityChange} disabled={!selectedCountry}>
<option value="">Select City</option>
{cities.map((city) => (
<option key={city.id} value={city.name}>
{city.name}
</option>
))}
</select>
</div>
<div>
<label>Region:</label>
<select disabled={!selectedCity}>
<option value="">Select Region</option>
{regions.map((region) => (
<option key={region.id} value={region.name}>
{region.name}
</option>
))}
</select>
</div>
</div>
);
}
This approach demonstrates how to manage asynchronous data updates using event handlers, and it may be more suitable in certain situations.
Thanx
Yusuf Kaymaz
Guida per i contributori
Apri la guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Direzione di ricerca
Iniziate dalla pagina collegata “You Might Not Need an Effect”, in particolare “Sharing Logic Between Event Handlers”, e confrontate le indicazioni con l’esempio di cascading-dropdown nell’issue. L’issue non indica alcun file del repository, test o modifica specifica della formulazione; pertanto, prima dell’implementazione, sarà necessario concordare l’ambito e i criteri di accettazione.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Valutazione
- Stack tecnologico
- javascript, react
- Ambito
- documentation
- Tipo di issue
- Documentazione
- Difficoltà
- 5/5
- Tempo stimato
- Più di una settimana
- Stato di attività
- Ferma
- Chiarezza
- Da chiarire
- Idoneità per principianti
- 25/100