Vorrei che l'utente fosse in grado di ordinare un elenco di cose da fare. Quando gli utenti selezionano un elemento da un menu a discesa, imposterà quello sortKey
che creerà una nuova versione setSortedTodos
e, a sua volta, attiverà useEffect
e chiamerà setSortedTodos
.
L'esempio seguente funziona esattamente come voglio, tuttavia eslint mi sta chiedendo di aggiungere todos
l' useEffect
array di dipendenze e, se lo faccio, provoca un ciclo infinito (come ci si aspetterebbe).
const [todos, setTodos] = useState([]);
const [sortKey, setSortKey] = useState('title');
const setSortedTodos = useCallback((data) => {
const cloned = data.slice(0);
const sorted = cloned.sort((a, b) => {
const v1 = a[sortKey].toLowerCase();
const v2 = b[sortKey].toLowerCase();
if (v1 < v2) {
return -1;
}
if (v1 > v2) {
return 1;
}
return 0;
});
setTodos(sorted);
}, [sortKey]);
useEffect(() => {
setSortedTodos(todos);
}, [setSortedTodos]);
Esempio live:
Sto pensando che ci debba essere un modo migliore per farlo che renda felice la fuga.
eslint
lanciando?
[<>]
pulsante della barra degli strumenti)? Stack Snippet supportano React, incluso JSX; ecco come fare uno . In questo modo le persone possono verificare che le soluzioni proposte non presentino il problema del loop infinito ...
todos
l'array di dipendenze useEffect
e puoi capire perché non dovresti. :-)
sort
margine : il callback può essere solo: ilreturn a[sortKey].toLowerCase().localeCompare(b[sortKey].toLowerCase());
che ha anche il vantaggio di fare un confronto delle impostazioni locali se l'ambiente ha informazioni sulle impostazioni locali ragionevoli. Se lo desideri, puoi anche lanciarlo in modo distruttivo: pastebin.com/7X4M1XTH