В идеале, вы бы добавили некоторое условие / проверку, чтобы увидеть, имеет ли values
то значение, которое вы хотите. Поскольку setValues
, кажется, вызывается при каждом рендеринге, который вызывает повторный рендеринг, умноженный на бесконечность.
Потенциально, используя что-то вроде Loda sh 's isEqual в сочетании с Loda sh s orderBy сделает этот трюк (потому что sort будет видоизменять исходный массив).
const [ascValue, setAscValue] = useState(true);
const [values, setValues] = useState([
{ id: 10 },
{ id: 5 },
{ id: 12 },
{ id: 1 },
{ id: 2 },
{ id: 900 },
{ id: 602 }
]);
useEffect(() => {
function sortValues() {
const sorter = ascValue ? "asc" : "desc";
if (!_.isEqual(values, _.orderBy(values, ["id"], [sorter]))) {
console.log("logged");
setValues(() => _.orderBy(values, ["id"], [sorter]));
}
}
sortValues();
}, [ascValue, values]);
Дело в том, что useEffect не должно устанавливать состояние каждый при каждом рендеринге по умолчанию (он может завершить рендеринг, когда пользователь запускает действие).
Форк вашего CodeSandbox, чтобы продемонстрировать , что побочный эффект должен обновлять состояние компонентов только в случае выполнения условия.