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, sortKey
welches eine neue Version von erstellt setSortedTodos
, und der useEffect
Aufruf wird wiederum ausgelöst setSortedTodos
.
Das folgende Beispiel funktioniert genau so, wie ich es möchte, aber eslint fordert mich auf todos
, das useEffect
Abhä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.
eslint
wirft?
[<>]
? 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 ...
todos
das Abhängigkeitsarray hinzufügen müssen useEffect
, und Sie können sehen, warum Sie dies nicht tun sollten. :-)
sort
Rü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