J'aimerais que l'utilisateur puisse trier une liste de tâches. Lorsque les utilisateurs sélectionnent un élément dans une liste déroulante, il définit le sortKey
qui créera une nouvelle version de setSortedTodos
, et déclenchera à son tour l' useEffect
appel et setSortedTodos
.
L'exemple ci-dessous fonctionne exactement comme je le souhaite, mais eslint m'invite à ajouter todos
au useEffect
tableau de dépendance, et si je le fais, cela provoque une boucle infinie (comme vous vous en doutez).
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]);
Exemple en direct:
Je pense qu'il doit y avoir une meilleure façon de faire cela qui garde eslint heureux.
eslint
lance?
[<>]
bouton de la barre d'outils)? Les extraits de pile prennent en charge React, y compris JSX; voici comment en faire un . De cette façon, les gens peuvent vérifier que leurs solutions proposées n'ont pas le problème de boucle infinie ...
todos
au tableau de dépendances useEffect
, et vous pouvez voir pourquoi vous ne devriez pas. :-)
sort
rappel peut être juste:return a[sortKey].toLowerCase().localeCompare(b[sortKey].toLowerCase());
ce qui a également l'avantage de comparer les paramètres régionaux si l'environnement dispose d'informations régionales raisonnables. Si vous le souhaitez, vous pouvez également lancer la déstructuration: pastebin.com/7X4M1XTH