реагируйте на использование функции очистки эффекта

#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() не будет разрешена во время процесса размонтирования.