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 setSortedTodos
và lần lượt kích hoạt useEffect
và 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 todos
vào useEffect
mả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.
eslint
né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 ...
todos
vào mảng phụ thuộc useEffect
và bạn có thể thấy lý do tại sao bạn không nên. :-)
sort
gọ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