TheSnegok
@TheSnegok

Как обновлять state с первого раза в useEffect?

Здрасьте! И так у меня есть select со списком разных сортировок и див с элементами которые нужно отсортировать(это как раз setMatched который не обновляется), всё вызывается, всё работает кроме setMatched он отрабатывает только со второй смены:
<select onChange={(e) => setSelectValue(+e.target.value)} value={selectValue}>
                            <option value="1">От дешёвых к дорогим</option>
                            <option value="2">От дорогих к дешёвых</option>
                            <option value="3">Популярные</option>
                            <option value="4">По рейтингу</option>
                        </select>

И вот сама смена state in useEffect:
useEffect(() => {
        if (selectValue === 1) {
            console.log('first');
            setMatched(findInput.matchFound.sort((first, second) => first.price[0] - second.price[0]));
        } else if (selectValue === 2) {
            console.log('second');
            setMatched(findInput.matchFound.sort((first, second) => second.price[0] - first.price[0]));
        }
    }, [findInput.matchFound, selectValue])

тут идёт сортировка массива после выбора значения из select, главная загвоздка что state обновляет только после второго раза, а консоль отрабатывает, я уже и в функцию выносил и switch case использовал но потом прочитал что setState асинхронное, наверное нужно использовать async await, но я вообще не понимаю как это реализовать, подскажите пожалуйста как обойти это, спасибо.
  • Вопрос задан
  • 95 просмотров
Решения вопроса 1
@HealSpirit
Т.к sort НЕ возвращает новую ссылку на массив а сортирует текущий реакт не тригерит ререндер. Ререндер из-за чего то другого происходит. Попробуй
setMatched(findInput.matchFound.sort((first, second) => first.price[0] - second.price[0]));

заменить на
setMatched([...findInput.matchFound.sort((first, second) => first.price[0] - second.price[0])]);
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы