Ich möchte, dass der Benutzer eine Liste von Aufgabenelementen sortieren kann. Wenn der Benutzer ein Element aus einem Dropdown-Menü auswählt, wird festgelegt, sortKeywelches eine neue Version von erstellt setSortedTodos, und der useEffectAufruf wird wiederum ausgelöst setSortedTodos.
Das folgende Beispiel funktioniert genau so, wie ich es möchte, aber eslint fordert mich auf todos, das useEffectAbhängigkeitsarray zu erweitern, und wenn ich dies tue, verursacht es eine Endlosschleife (wie zu erwarten).
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]);
Live-Beispiel:
Ich denke, es muss einen besseren Weg geben, der eslint glücklich macht.
eslintwirft?
[<>]? Stack-Snippets unterstützen React, einschließlich JSX. Hier erfahren Sie, wie Sie eine erstellen . Auf diese Weise können die Leute überprüfen, ob ihre vorgeschlagenen Lösungen nicht das Endlosschleifenproblem haben ...
todosdas Abhängigkeitsarray hinzufügen müssen useEffect, und Sie können sehen, warum Sie dies nicht tun sollten. :-)
sortRückruf kann einfach sein: Diesreturn a[sortKey].toLowerCase().localeCompare(b[sortKey].toLowerCase());hat auch den Vorteil, dass ein Gebietsschemavergleich durchgeführt wird, wenn die Umgebung über angemessene Gebietsschemainformationen verfügt. Wenn Sie möchten, können Sie auch Destrukturierung darauf werfen: pastebin.com/7X4M1XTH