Я хотів би, щоб користувач міг сортувати список предметів. Коли користувач вибере елемент зі спадного меню, він встановить те, 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