пожалуйста.
У меня есть фукнция, котору я записал как колбэк для определенного события (ещё на этапе монтирования компонента). Внутри этой функции я обращаюсь к значению стейта (которое конечно же с момента первого монтирования изменилось несколько раз), а в ней это значение ещё старое.
Как решение увидел -
передавать колбэк на setState((actualStateData) => какие-то действия тут и возвращаем новый стайт). Все работает как нужно, данные актуальные всегда обрабатываются и возвращаем уже новые, измененные значения. Но вот есть момент - одна из этапов обработки данных это дождаться выполнения запроса (асинхронного) и затем добавить в новый стейт полученные значения. Значит надо делать функцию асинхронной. Прописываю так - setState(async (actualState) => actions here). А у меня начинают ругатся другие компоненты, зависащие от этого стейта - что он имеет неправильное значение. Выводя в консоль - я вижу что возвращаются почему-то Promise всегда, хотя я даже могу не менять значение стейта и просто внутри этой функции вернуть то же самое - это уже будет промис, а не объект.
Как мне правильно получить актуальное значение стейта, выполнить запрос (который возвращает промис) дождавшись его и затем вернуть уже все вместе как новое значение стейта?
ничего не понял, лучше кодом. зачем передавать колбек в setState? нельзя просто вычислить то, что нужно и потом сделать setState(newValue)?
Почему в функции старые значения стейта, это надо код посмотреть, как так написано. Покажи код плиз Почему промис — async функция возвращает промис. Надо setState вызвать уже после разрешения промиса, имея готовое пришедшее значение.
router.events.on("routeChangeComplete", chatUrlIsChanged); - вот так передаётся функция, которую потом вызывает это событие. И внутри уже она не имеет доступа к актуальному стейту. А имеет те значения, которые были в стейте на момент передачи этой функции. Единственный способ узнать самый актуальный стейт (чтобы и конфликтов не было) - это я решил что вызов функции setState с параметрами (где будет актуальное значение). Поскольку мне надо это значение поменять, а не просто новое присвоить.
Использовать setState(val => newVal) в данном случае нельзя. Нужно использовать стандартный вариант
Так категорически нельзя делать. Функция, которая передается в setState должна быть чистой
забыл уточнить - я использую только хуки. Эта функци устанавливает значение только одного стейта, не глобально всех.
А покажи "момент передачи значений этой функции". Ну или как она сама создаётся
что если колбэк функцию обернуть в useCallback?
Обсуждают сегодня