0

管理者ダッシュボードのセットアップ:

// 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 was called on an unmounted component というエラーが表示されます。

だから私はそれを次のように変更しました:

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');
  }
})

しかし、リッスンは 1 回のルート変更で 2 回または 3 回起動していました。

上記のコードは正しいですか、またはそれを解決するためのより良い方法はありますか? 基本的に、誰かが localStorage からトークンを手動で削除した場合にログインするようにルーティングしたいだけです。

React、React ルーター、Redux、および React redux の最新バージョンを使用しています。

ありがとうございます。

4

0 に答える 0