#reactjs
Вопрос:
У меня есть компонент post, в котором у меня есть эффект использования, в котором фотография установлена внутри состояния. Если я перейду по другим ссылкам, чтобы быстро, я получу ошибку «Не удается выполнить обновление состояния реакции для размонтированного компонента». Таким образом, это говорит о том, что мне нужно почиститься, но независимо от того, что я пытаюсь прочитать в Интернете, я не могу понять, как правильно сделать уборку, и все равно получаю ту же ошибку. Это то, что у меня есть сейчас.
const ignore = useRef(true);
const [postImage, setPostImage] = useState();
useEffect(() => {
if (ignore) {
if (postPhoto) {
storageRef
.child(postPhoto)
.getDownloadURL()
.then((url) => {
setPostImage(url);
});
}
}
if (pathname === "/profile" || pathname === `/profile/${params.user}`) {
setShow(false);
} else {
setShow(true);
}
return () => (ignore.current = false);
}, [postData]);
Как должна выглядеть уборка? Это то, что я больше всего пытаюсь понять в последние недели.
Комментарии:
1. Ваше имя переменной кажется обратным — вы хотите игнорировать данные, КОГДА ваш компонент отключается. Я бы переименовал
ignore
вunmounted
и установил егоtrue
в функцию очистки. Вам нужно остановить ВСЕ изменения состояния, поэтому вам также нужно проверить наличиеunmount
«внутри» вашего.then
обратного вызова
Ответ №1:
Проблема в том, что setPostImage(url)
запускается, когда компонент размонтирован. Чтобы избежать этой ошибки, проверьте, есть ли ignore.current
true
она, прежде чем обновлять состояние:
storageRef
.child(postPhoto)
.getDownloadURL()
.then((url) => {
if(ignore.current) setPostImage(url); //--> here
});
Комментарии:
1. Значит, я хочу только навести порядок в штате? И я не останавливаю функции, работающие внутри useEffect, с помощью очистки?
2. да, выполните проверку внутри блока then, потому что возможно, что функция getDownloadURL() не будет разрешена во время процесса размонтирования.