Полное предупреждающее сообщение: Предупреждение: не удается выполнить обновление состояния React для отключенного компонента. Это не работает, но указывает на утечку памяти в вашем приложении. Чтобы исправить это, отмените все подписки и асинхронные задачи в функции очистки useEffect.

Это предупреждение НЕ отображается постоянно, оно отображается всякий раз, когда кажется. В большинстве случаев, когда приложение только запускается.

export default class something extends React.Component {
  _isMounted = false;
  state = {
    
  };

componentDidMount() {
    this._isMounted = true;
    firebase = new Fire((error, user) => {
      if (error) {
        return alert('something something something something');
      }

      firebase.getLists((lists) => {
        this.setState({ lists, user }, () => {
            this.setState({ loading: false });
        });
      });
      this.setState({ user });
    });
  }

componentWillUnmount() {
    this._isMounted = true;
    firebase.detach();
  }

Это в другом файле, который содержит весь код firebase

detach() {
    this.unsubscribe();
  }

Я предполагаю, что это связано с отсоединением firebase.detach

2
iLightFPS 18 Окт 2020 в 20:44

1 ответ

Лучший ответ

Есть несколько незначительных обновлений, которые необходимо внести в ваш код для правильной работы.

Перед обновлением каких-либо переменных состояния вы захотите проверить, равен ли _isMounted true.

Вы также захотите установить _isMounted=false в componentWillUnmount() вместо _isMounted=true.

См. Обновленный код ниже:

export default class something extends React.Component {
  _isMounted = false;
  state = {
    
  };

componentDidMount() {
    this._isMounted = true;
    firebase = new Fire((error, user) => {
      if (error) {
        return alert('something something something something');
      }

      firebase.getLists((lists) => {
        if (this._isMounted){
          this.setState({ lists, user }, () => {
            this.setState({ loading: false });
          });
        }
      });
      if (this._isMounted){
        this.setState({ user });
      }
    });
  }

componentWillUnmount() {
    this._isMounted = false;
    firebase.detach();
  }
0
Tejogol 22 Окт 2020 в 17:48