Я бы хотел, чтобы пользователь мог сортировать список элементов задач. Когда пользователь выбирает элемент из выпадающего списка, он устанавливает, sortKey
который создаст новую версию setSortedTodos
, и, в свою очередь, вызывает useEffect
вызов и setSortedTodos
.
Приведенный ниже пример работает именно так, как я хочу, однако eslint побуждает меня добавить todos
к useEffect
массиву зависимостей, и если я это сделаю, это вызовет бесконечный цикл (как и следовало ожидать).
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]);
Живой пример:
Я думаю, что должен быть лучший способ сделать это, чтобы Эслинт был счастлив.
eslint
выкидывает?
[<>]
кнопка панели инструментов)? Фрагменты стека поддерживают React, включая JSX; вот как это сделать . Таким образом, люди могут проверить, что в их предложенных решениях нет проблемы бесконечного цикла ...
todos
массив зависимостей useEffect
, и вы можете понять, почему этого не следует делать . :-)
sort
обратный вызов может быть простым:return a[sortKey].toLowerCase().localeCompare(b[sortKey].toLowerCase());
что также имеет преимущество в сравнении локали, если среда имеет разумную информацию о локали. Если хотите, вы также можете применить к нему деструктуризацию: pastebin.com/7X4M1XTH