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 sortKeyqui créera une nouvelle version de setSortedTodos, et déclenchera à son tour l' useEffectappel et setSortedTodos.
L'exemple ci-dessous fonctionne exactement comme je le souhaite, mais eslint m'invite à ajouter todosau useEffecttableau 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.
eslintlance?
[<>]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 ...
todosau tableau de dépendances useEffect, et vous pouvez voir pourquoi vous ne devriez pas. :-)
sortrappel 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