Неопределенное нарушение инварианта: findDOMNode был вызван для неустановленного компонента

Настройка панели администратора:

// React modules
import React, { Component } from 'react';
import { connect } from 'react-redux';
import { browserHistory } from 'react-router';

import { progressDone } from 'utils/nprogress-func';

// Admin Header section
import AdminHeader from '../admin-header/admin-header';


// Admin dashboard styling
import './styles/admin-dashboard';

class AdminDashboard extends Component {

  componentDidMount() {
    progressDone();
  }

  componentDidUpdate() {
    if(!localStorage.getItem('admin_log_toks')) {
        browserHistory.push('/admin-login');
    }
  }

  render() {
    if(this.props.isAuthenticated) {
      return (
        <div className="admin-dashboard">

          {/* admin-bg class has been styled in main.scss */}
          <div className="admin-bg"></div>

          <AdminHeader />

          <main>
            <div className="admin-content-wrapper">
              {this.props.children}
            </div>
          </main>
        </div>
      );
    } else {
      browserHistory.push('/admin-login');
      return (
        <div></div>
      );
    }
  }
}

// These props come from the application's
// state when it is started
function mapStateToProps(state) {

  const { authAdmin } = state;
  const { isAuthenticated } = authAdmin;

  return {
    isAuthenticated
  };
}

export default connect(mapStateToProps)(AdminDashboard);

У меня есть панель администратора с меню навигации.

<AdminHeader /> состоит из меню, которое направляет к различным разделам администратора и загружается с использованием AdminDashboards {this.props.children},

Я прибываю на панель администратора через форму входа и отправляется действие, которое устанавливает переменную isAuthenticated в true. После успешного входа isAuthenticated становится доступным для всех компонентов через редукторы. isAuthenticated устанавливается на основе токена, полученного от сервера, и затем токен сохраняется в localStorage браузера.

Но я также хотел проверить, что произойдет, если пользователь удалит токен из localStorage.

Я установил

funtion auth (state = {
  isAuthenticated: localStorage.getItem('token') ? true : false
})

Теперь, если пользователь вручную удаляет localStorage, то при обновлении пользователь отправляется обратно на экран входа в систему. Но я разрабатываю одностраничное приложение и хочу подтвердить, что когда пользователь перенаправляет на другой маршрут / URL без обновления, тогда токен в localStorage все еще существует.

Следовательно, я написал этот код:

componentWillReceiveProps() {
  if(!localStorage.getItem('admin_log_toks')) {
    browserHistory.push('/admin-login');
  }
}

Но я получаю ошибку Uncaught Invariant Violation: findDOMNode был вызван для неустановленного компонента.

Поэтому я изменил это на:

componentWillUpdate() {
  if(!localStorage.getItem('admin_log_toks')) {
    browserHistory.push('/admin-login');
  }
}

Тем не менее я получаю ту же ошибку. Итак, я изменил приведенный выше код:

componentWillUpdate() {
  if(!localStorage.getItem('admin_log_toks')) {
    setTimeout(function() {
      browserHistory.push('/admin-login');
    }, 10);
  }
}

Все работало, но по некоторым причинам я не думаю, что это правильный метод.

Сначала я попытался решить эту проблему при изменении маршрута:

browserHistory.listen(location => {
  if(!localStorage.getItem('admin_log_toks')) {
    browserHistory.push('/admin-login');
  }
})

Но слушай стрелял дважды или трижды только за одно изменение маршрута.

Правильный ли приведенный выше код, или есть лучший способ его решить? По сути, я просто хочу направить вход в систему, если кто-нибудь вручную удалит токен из localStorage.

Я использую последнюю версию React, React router, Redux и React redux.

Спасибо в ожидании.

0 ответов

Другие вопросы по тегам