リアクトルーティングガード(ルーティングインターセプション)の実装

リアクトルーティングガード(ルーティングインターセプション)の実装

React は Vue とは異なります。ルートにメタ文字を設定することでルートインターセプションを実装します。 Vue を使用する場合、フレームワークはルーティング ガード関数を提供します。これは、特定のルートに入る前に検証作業を実行するために使用されます。検証が失敗すると、Vue の beforeEnter 関数のように、404 ページまたはログイン ページにジャンプします。

...
router.beforeEach(async(to, from, next) => {
    定数 toPath = to.path;
    定数 fromPath = from.path;
})
...

ルーティングインターセプションを実装するためのReactの基本的な考え方は、Routeのrender関数を使用することです。インターセプションは、インターセプション条件を判断してさまざまなコンポーネントのジャンプを実現することによって実現されます。以前のバージョンでは、React Router も同様の onEnter フックを提供していましたが、React Router 4.0 ではこのメソッドは廃止されました。 React Router 4.0 以降では宣言型コンポーネントを使用します。ルーターはコンポーネントです。ルーティングガード機能を実装するには、自分で記述する必要があります。
ルーティング ガードがない場合、ルーター コンポーネントは次のようになります。

'react' から * を React としてインポートします。
'react-router-dom' から { HashRouter、Switch、Route、Redirect } をインポートします。
 
「./page/index」からIndexをインポートします。
「./page/home」からHomeをインポートします。
「./page/error」からErrorPageをインポートします。
「./page/login」からログインをインポートします。
 
エクスポートconstルーター = () => (
    <ハッシュルーター>
        <スイッチ>
            <ルートパス="/" 正確なコンポーネント={インデックス}/>
            <ルート パス="/login" 正確なコンポーネント = {ログイン}/>
            <ルート パス="/home" 正確なコンポーネント={Home}/>
            <ルート パス="/404" 正確なコンポーネント = {ErrorPage}/>
            <リダイレクト先="/404" />
        </スイッチ>
    </ハッシュルーター>
);

上記の Router コンポーネントには 3 つのページが含まれています。

ログインホームページ
404 ページと 4 つのルート:
ルートルーター ログインルーター ホームルーター
404 ルート このうち、ルート ルートと /home ルートは両方ともホームページ ルートに誘導されます。
上記は、ログイン/ホームページと 404 ページの間を行き来できる基本的なルート定義ですが、いくつか問題もあります。
ログインしていない状態では、ホームページに直接ジャンプできます。ログインした状態では、/login ルートを入力してログインページにジャンプすることもできます。ここで、次の機能を完成させます。
非ログイン状態では、ホームページに直接ジャンプすることはできません。非ログイン状態でホームページにジャンプする場合は、ログインルートにリダイレクトする必要があります。ログイン状態では、ログインページにジャンプすることはできません。ログイン状態でログインページにジャンプする場合は、ホームページルートにリダイレクトする必要があります。この機能を実現するには、次の 2 つの解決策があります。
各コンポーネントでは、propsの履歴オブジェクトに従ってジャンプし、グローバルルーティングガード処理を実行します。

まず、ルート ディレクトリ src に routerMap.js ファイルを作成します。コードは次のとおりです。
auth を true に設定すると、ルートに権限の検証が必要になります。

/**
 * ルーティングコンポーネントを定義し、auth を true に設定して、ルートに権限検証が必要であることを示します */

「./pages/Admin」からAdminをインポートします。
「./pages/Login」からLoginをインポートします。
「./pages/Error」からErrorをインポートします。

エクスポートconst routerMap = [
    {パス: "/"、名前: "admin"、コンポーネント: Admin、認証: true}、
    {パス: "/login", 名前: "ログイン", コンポーネント: ログイン},
    {パス: "/error", 名前: "error", コンポーネント: Error},
];

すべてのルーティング ジャンプは、FrontendAuth 高次コンポーネント プロキシによって完了します。 FrontendAuth.js コンポーネントの実装は次のとおりです。

/**
 * ルーティングガード検証 */
React をインポートし、{Component} を "react" から取得します。
「react-router-dom」から {Route、Redirect} をインポートします。

クラスFrontendAuthはComponentを拡張します{
    // eslint は、次の行に無駄なコンストラクタを無効にします
    コンストラクタ(props) {
        スーパー(小道具);
    }

    与える() {
        定数 {routerConfig, location} = this.props;
        const {パス名} = 場所;
        const isLogin = localStorage.getItem("user");
        console.log(パス名、isLogin);
        console.log(場所);
        // ログイン状態でログインページ以外、権限チェックを必要としないルートの場合 // ログイン後はログインページにジャンプできないため // この部分のコードは、非ログイン状態で権限チェックを必要としないルートにアクセスするためのものです const targetRouterConfig = routerConfig.find(
            (item) => item.path === パス名
        );
        コンソールにログ出力します。
        targetRouterConfig が targetRouterConfig.auth であり、isLogin である場合、
            const {コンポーネント} = targetRouterConfig;
            return <ルートの正確なパス={パス名} コンポーネント={コンポーネント}/>;
        }
        if (ログイン) {
            // ログインしている場合は、ログインページにジャンプしてホームページにリダイレクトします if (pathname === "/login") {
                <Redirect to="/"/> を返します。
            } それ以外 {
                // ルートが正当な場合は、対応するルートにジャンプします if (targetRouterConfig) {
                    戻る (
                        <ルート パス = {パス名} コンポーネント = {targetRouterConfig.component} />
                    );
                } それ以外 {
                    // ルートが不正な場合は、404 ページにリダイレクトします。 return <Redirect to="/error"/>;
                }
            }
        } それ以外 {
            // 非ログイン状態で、ルートが正当であり、権限の検証が必要な場合は、ログインページにジャンプしてログインを要求します。if (targetRouterConfig && targetRouterConfig.auth) {
                <Redirect to="/login"/> を返します。
            } それ以外 {
                // ログインしていない状態で、ルートが不正な場合は404にリダイレクトします
                <Redirect to="/error"/> を返します。
            }
        }
    }
}

デフォルトのFrontendAuthをエクスポートします。

次に、Router コンポーネントを定義します。App.js では、このコンポーネントは高階コンポーネントによってラップされた結果です。

'./App.less' をインポートします。
React をインポートし、{Fragment} を "react" から取得します。
'react-router-dom' から {Switch} をインポートします。
「./FrontendAuth」からFrontendAuthをインポートします。
「./routerMap」から {routerMap} をインポートします。

関数App() {
    戻る (
        <断片>
            1 つだけ一致させ、一致が成功した場合はそれ以上一致させないため、効率が高くなります*/
            <スイッチ>
                <フロントエンド認証 routerConfig={routerMap}/>
            </スイッチ>
        </フラグメント>
    );
}

デフォルトのアプリをエクスポートします。

テスト

これで、React Routing Guard (ルートインターセプション) の実装に関するこの記事は終了です。React Routing Guard に関するより関連性の高いコンテンツについては、123WORDPRESS.COM の過去の記事を検索するか、以下の関連記事を引き続き閲覧してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • Reactルーティングの各バージョンのリダイレクト方法の詳細な説明
  • React-router v4: 履歴を使用してルートジャンプを制御する方法
  • Reactがコンポーネント内のルーティングパラメータを取得する方法の詳細な説明
  • react-router4でネストされたルートを使用する方法
  • Reactルートの遅延読み込みのためのいくつかの実装ソリューション
  • React-router4ルート監視の実装
  • React-router v4 ルーティング設定方法の概要
  • Reactルーティング認証の実装方法
  • 反応ルーティング設定の詳細な説明

<<:  Linux dirnameコマンドの具体的な使い方

>>:  MySql の知識ポイント: トランザクション、インデックス、ロックの原則、使用状況の分析

推薦する

MySQL データベースの手動およびスケジュールされたバックアップ手順

目次手動バックアップタイマーバックアップ手動バックアップ1) cmd コンソール: mysqldum...

Linux で文字化けしたファイルや特殊文字のファイルを削除する方法

エンコーディングの理由により、Linux サーバーに中国語のファイルやディレクトリをアップロードまた...

elementui の el-popover スタイルの変更が有効にならない問題の解決策

element-uiを使用する場合、el-popoverというよく使われるコンポーネントがありますが...

HTML ウェブページのブラウザタイトルバーに小さなアイコンを表示する方法

この効果と同様に、方法も非常に簡単です。ヘッダーに次のように記述します: <link rel=...

WeChatアプレットでSVGアイコンを使用する方法

SVG は、さまざまな利点があるため、近年広く使用されています。残念ながら、WeChat ミニプログ...

LayUI+Shiroは動的なメニューを実装し、メニュー拡張の例を記憶します

目次1. Maven 依存関係2. メニュー関連クラス1. メインメニュー2. サブメニュー3. S...

初心者向けBootstrap 3.0学習ノート

この学習ノートの最初の記事として、シリーズの他の記事と同様に、Bootstrap の紹介から始め、そ...

Vue ソング プログレス バーのサンプル コード

なお、これはvue-cliで作成したプロジェクトではありません。vue.jsを参照して記述したHTM...

Docker を使用して Jenkins をインストールするためのサンプル コード

Dockerコンテナのインストール時に遭遇しやすい2つの問題1.ポートはすでに割り当てられています(...

Linux のハードリンクとソフトリンクの原理と使用法の分析

Linux システムには、ファイル共有を解決するために使用できるリンク ファイルと呼ばれる種類のファ...

CSS3 タブアニメーションの例 背景切り替えの動的効果

CSS 3 アニメーションの例 - タブの背景切り替えの動的効果、具体的なコードは次のとおりです。 ...

CentOS6.8 は cmake を使用して MySQL5.7.18 をインストールします。

オンライン情報を参考に、cmakeを使用してCentOS6.8サーバーにMySQL5.7.18をイン...

WeChatミニプログラムページ間の価値転送を実装する方法の例

ミニプログラムページ間で値を渡すみなさんこんばんは。こんばんはと言うのは、これを夜に書いたからです。...

case when文のエラー問題の詳細な説明

序文MySQL データベースでは、if else のような判断演算を使用することがあります。では、M...

HTML でのアンカーポイントの使用_PowerNode Java アカデミー

ここで、アンカー ポイントを制御するいくつかの状況をまとめてみましょう。 1. 同じページ <...