Tôi muốn người dùng có thể sắp xếp danh sách các mục việc cần làm. Khi người dùng chọn một mục từ danh sách thả xuống, nó sẽ đặt mục sortKeyđó sẽ tạo một phiên bản mới setSortedTodosvà lần lượt kích hoạt useEffectvà gọi setSortedTodos.
Ví dụ dưới đây hoạt động chính xác như tôi muốn, tuy nhiên eslint đang nhắc tôi thêm todosvào useEffectmảng phụ thuộc và nếu tôi làm điều đó sẽ gây ra một vòng lặp vô hạn (như bạn mong đợi).
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]);
Ví dụ trực tiếp:
Tôi nghĩ rằng phải có một cách tốt hơn để làm điều này để giữ cho eslint hạnh phúc.
eslintném?
[<>]nút thanh công cụ) không? Stack Snippets hỗ trợ React, bao gồm cả JSX; Dưới đây là cách thực hiện . Bằng cách đó, mọi người có thể kiểm tra xem các giải pháp được đề xuất của họ không có vấn đề vòng lặp vô hạn ...
todosvào mảng phụ thuộc useEffectvà bạn có thể thấy lý do tại sao bạn không nên. :-)
sortgọi lại có thể chỉ là:return a[sortKey].toLowerCase().localeCompare(b[sortKey].toLowerCase());điều này cũng có lợi thế khi thực hiện so sánh miền địa phương nếu môi trường có thông tin miền địa phương hợp lý. Nếu bạn thích, bạn cũng có thể ném phá hủy nó: pastebin.com/7X4M1XTH