Ваш пример должен работать, и это то, что происходит по порядку, например, когда вы передаете новый data
или используете setSortOrder
.
1 - вы попадаете в код вашего хука
2 - вы перехватываете setSortedData
для обновления своего sortedData
состояния
3 - он возвращает устаревший sortedData
вашему компоненту (потому что он был прочитан из useState
перед изменением)
4 - вызов setSortedData
запускается, изменяет данные в состоянии, запускает новый рендеринг вашего компонента, который снова будет использовать ваш хук, и хук предоставит правильную версию sortedData
.
В двух словах, у вас есть один дополнительный рендер.Если вы хотите предотвратить это, вы можете использовать useMemo
, например, так:
function useSorting(initialSort, data) {
const [sortOrder, setSortOrder] = useState(initialSort);
const sortedData = useMemo(() => sortBy(sortOrder, data), [data, sortOrder]);
return [sortedData, sortOrder, setSortOrder];
}
Ваш компонент сразу получит отсортированные данные без необходимости проходить через дополнительный цикл рендеринга, и у вас все еще естьпреимущества вызова функции сортировки только в случае изменения соответствующей информации (data
, sortOrder
).