Chciałbym, aby użytkownik mógł posortować listę rzeczy do zrobienia. Gdy użytkownicy wybiorą element z listy rozwijanej, ustawi, sortKey
która utworzy nową wersję setSortedTodos
, a następnie uruchomi useEffect
i zadzwonisetSortedTodos
.
Poniższy przykład działa dokładnie tak, jak chcę, jednak eslint zachęca mnie do dodania todos
do useEffect
tablicy zależności, a jeśli to zrobię, spowoduje nieskończoną pętlę (jak można się spodziewać).
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]);
Przykład na żywo:
Myślę, że musi istnieć lepszy sposób na zrobienie tego, co zapewni zadowolenie eslintowi.
eslint
generowany?
[<>]
przycisk paska narzędzi)? Fragmenty stosu obsługują React, w tym JSX; oto jak to zrobić . W ten sposób ludzie mogą sprawdzić, czy ich proponowane rozwiązania nie mają problemu z nieskończoną pętlą ...
todos
do tablicy zależności useEffect
, i możesz zobaczyć, dlaczego nie powinieneś. :-)
sort
wywołanie zwrotne może być po prostu:return a[sortKey].toLowerCase().localeCompare(b[sortKey].toLowerCase());
co ma tę zaletę, że porównuje ustawienia narodowe, jeśli środowisko ma rozsądne informacje o ustawieniach regionalnych. Jeśli chcesz, możesz też rzucić w to destrukcją: pastebin.com/7X4M1XTH