Saya ingin pengguna dapat mengurutkan daftar item todo. Ketika pengguna memilih item dari dropdown itu akan mengatur sortKeyyang akan membuat versi baru setSortedTodos, dan pada gilirannya memicu useEffectdan memanggil setSortedTodos.
Contoh di bawah ini berfungsi persis seperti yang saya inginkan, namun eslint mendorong saya untuk menambahkan todoske useEffectarray dependancy, dan jika saya lakukan itu menyebabkan loop tak terbatas (seperti yang Anda harapkan).
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]);
Contoh Langsung:
Saya pikir harus ada cara yang lebih baik untuk melakukan ini yang membuat eslint bahagia.
eslintmelempar?
[<>]tombol bilah alat)? Stack Snippets mendukung React, termasuk JSX; inilah cara melakukannya . Dengan begitu orang dapat memeriksa bahwa solusi yang mereka tawarkan tidak memiliki masalah loop tak terbatas ...
todoske array dependensi useEffect, dan Anda dapat melihat mengapa Anda tidak perlu. :-)
sortCallback bisa adil:return a[sortKey].toLowerCase().localeCompare(b[sortKey].toLowerCase());yang juga memiliki keunggulan melakukan perbandingan lokal jika lingkungan memiliki informasi lokal yang masuk akal. Jika Anda suka, Anda juga dapat melakukan penghancuran padanya: pastebin.com/7X4M1XTH