vuexプロジェクトにおけるログインステータス管理の実践プロセス

vuexプロジェクトにおけるログインステータス管理の実践プロセス

道具:

簡単にデバッグできるように、Chrome ブラウザに Vue.js 開発ツールをインストールします。

ログインシナリオ:

ユーザーの現在のログイン状態は、ページナビゲーションやその他の場所に表示されることがあります。状態は、ログインしていない、ログイン中(読み込み中)、正常にログインした、ユーザー名の表示に分けられます。

一部のページはユーザーがログインせずに閲覧できますが、一部のページは閲覧する前にログインする必要があります。

練習する:

シナリオ1: 思考と実践

vuex でデータストアを作成する

// src ディレクトリの下に新しい store ディレクトリを作成し、次のように index.js を作成します // データ ウェアハウスを作成します import Vuex from 'vuex';
'vue' から vue をインポートします。
'loginUser.js' から loginUser をインポートします。
Vue.use(Vuex)

定数ストア = 新しい Vuex.Store({
    modules: { //モジュールは別のオブジェクト loginUser に異なる状態を置くことができます //ログインしているかどうか},
    strict: true, // ミューテーションによる状態の変更のみを許可する });

ログインステータスの読み込みと現在ログインしているユーザーを設定します

// loginUser.js を作成し、その状態/ミューテーション/アクションを作成する

//維持する必要がある状態 state: {
       loading: false, //ログイン状態 user: null, //現在ログインしているユーザー},
//計算プロパティのゲッター: {
       ステータス(状態) {
           if (状態.読み込み) {
               '読み込み中' を返す
           } それ以外の場合 (state.user) {
               「ログイン」を返す
           } それ以外 {
               'unLogin' を返す
           }
       }
   },
 
 // 読み込みとユーザーステータスの変更: {
       //読み込みを設定する
       setLoading(状態、メッセージ) {
           state.loading = メッセージ
       },
       //ユーザーを設定する setUser(state, msg) {
           状態.ユーザー = メッセージ
       }
   },
 
 //変更されたステータスをアクションで送信します。actions: {
       //ログインメソッドctxはstoreと同等です
       非同期ログイン(ctx, msg) {
           //ログインステータスをtrueに設定する
           ctx.commit("setLoading", true)
           const 結果 = xxxapi.login(msg.loginId, msg.loginPassword) を待機します
           if (結果) {
               //ログイン成功 ctx.commit('setUser', result)
               //ログインが成功すると、ログインステータスはfalseに設定されます
               ctx.commit('setLoading', false)
           }
           //ログインが成功したかどうかを返す結果を返す
       },
       //ログインしたかどうかを判定する async isLogin(ctx) {
           //ログイン ctx.commit('setLoading', true)
           // インターフェイスを呼び出して、ログインされているかどうかを確認します。const result = await xxxapi.isLogin();
           ctx.commit('setUser', 結果);
           ctx.commit('setLoading', false)
       },
       //ログアウト async logout(ctx) {
           ctx.commit('setLoading', false)
           xxxapi.logout() を待機します。
           ctx.commit('setUser', null);
           ctx.commit('setLoading', false)
       }
   },

ページの使用法:

ログインするとログインボタンがあり、Vuexウェアハウスでボタンのステータスを取得できます。

<button :disabled="loading">{{ loading ? 'loading...' : 'ログイン' }}
</ボタン>
計算: {
// 読み込みを計算済みにカプセル化します。これにより、呼び出すたびに this.$store.state.loginUser と記述する必要がなくなります。// loading() {
    // this.$store.state.loginUser.loading を返します。
    // }
    // 最適化 // 補助関数 // import {mapState} from "vuex"
    ...mapState({
      読み込み中: (状態) => state.loginUser.loading
    })
  }

ボタンをクリックしたときに送信するときにアクションをディスパッチする

非同期ハンドル送信() {
      const result = this.$store.dispatch("loginUser/login", { を待機します。
        ログインID: this.loginId、
        ログインパスワード: this.loginPassword
      });
      if (結果) {
        // ログイン成功ルートジャンプ const path = this.$route.query.url || '/'
        this.$router.push(パス)
      }
    },

ページナビゲーションでログイン状態を切り替える [読み込み/ログイン/ログイン解除]

  <!-- ページのログイン ステータスを表示 -->
<span v-if="status === 'loading'">ログイン中です。お待​​ちください...</span>
​
<テンプレート v-else-if="ステータス === 'ログイン'">
    <span>現在ログインしているユーザー {{user.name}}</span>
    <span @click="handleLogout">ログアウト</span>
</テンプレート>
​
<router-link to="/login" v-else>
        ログイン</router-link>
  計算: {
...mapGetters("ログインユーザー", ["ステータス"]),
...mapState("ログインユーザー", ["ユーザー"]),
}

ログアウト時にステータスを変更する

非同期ハンドルログアウト(){
    これを待ちます。$store.dispatch("loginUser/logout")
    //ログインページにジャンプします this.$route.push(/xxx)
},

ページが更新されるたびにログイン ステータスを確認する必要があり、これは vue が作成される main.js で決定する必要があります。
store.dispatch('loginUser/isLogin')

シナリオ2: 思考と実践

バックグラウンドプロジェクトの権限設定を参照してください

全体的なデザイン:

ページを更新した後、まずはVuexウェアハウスでログイン状態を確認します –> ナビゲーションガード(router.beforeEach)は、metaに設定されたパラメータを判断して、このページがログインされているかどうかを検出します。

--> ページのレンダリングを表示するにはログインする必要があります。

全体的なロジック:

1. ページに入るときに、このページを閲覧するためにログインが必要かどうかを確認します。

2. ログインステータスを確認します。次の 3 つの状態があります。

  1. すでにログインしている場合は、目的のページに直接移動してください。
  2. ユーザーがログインしていない場合は、ログイン ページに移動してユーザーにログインしてもらいます。
  3. ステータスがロード中の場合は、移動先のページのパスを渡し、ロード中のページで Vuex ウェアハウス内のユーザーのログイン ステータスの変化を監視します。ステータスの変化を監視した後、ログインしているか、ログインしていないかを確認し、ステップ 1 に戻ってログイン権限が必要かどうかを判断します。

練習する:

ルーターにメタを設定します。auth が true の場合、アクセスするにはログインする必要があります。

//routes.js の "./xx/xx.vue" から Home をインポートします
エクスポートデフォルト[
{
      パス:"/home",
    コンポーネント:ホーム、
    メタ: {
      auth: true, //アクセス権限が必要なページ}
}
]
index.js でルートガードを設定する router.beforeEach((to, from, next) => {
    (to.meta.auth)の場合{
        // アクセスするにはログイン権限が必要です const result = store.getters["loginUser/status"]
        if (結果 === 'ロード中') {
            // 読み込み状態。ログインしているかどうかはわかりません // ログイン中のページにジャンプし、そのページでログインが成功したかどうかを監視します。そうでない場合は、永遠にここに留まります // ルートがジャンプするときは、以前どこから来たのかを記録する必要があります。そうしないと、次にどのページにジャンプするかわかりません({
                path: '/loading', //[ログイン]ページへ移動 query: {
                    url: to.fullpath
                }
            })
        } そうでない場合 (結果 === 'ログイン') {
            // ログイン成功next();
        } それ以外 {
            // ログインしていません this.$message.info('ログインする必要があります');
             次({
                パス: '/login', //[ログイン]ページに移動します。クエリ: {
                    url: to.fullpath
                }
            })
        }
    } それ以外 {
        //ログイン権限なしでアクセスできるページ next()
    }
})

ログインページで現在のステータスを監視する

作成された() {
  this.unWatch = this.$watch(() => this.$store.getters["loginUser/status"], (status) => {
    console.log('現在のステータス', ステータス);
    if (ステータス !== 'ロード中'){
      this.$router.push(this.$route.query.url || '/home').catch(() => {}
    }
  }, {
    即時: 真
  })
},
破壊された() {
  //監視をキャンセル this.unWatch()
}

要約する

これで、vuex プロジェクトでのログイン ステータス管理に関するこの記事は終了です。vuex ログイン ステータス管理に関するより関連性の高いコンテンツについては、123WORDPRESS.COM で以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • Vuex管理ログインステータスの詳細な説明
  • Vue でユーザーのログイン状態を保存するためのサンプルコード
  • Vue に登録してログイン状態を維持する方法
  • Vue プロジェクトでユーザーをログイン状態に保つ方法 (localStorage+vuex はページを更新した後もステータスを保持します)

<<:  MySQL インデックスの長所と短所、およびインデックス作成のガイドライン

>>:  DockerHubイメージリポジトリの使い方の詳しい説明

推薦する

Docker 基本チュートリアル: Dockerfile 構文の詳細な説明

序文Dockerfile は Docker プログラムによって解釈されるスクリプトです。Docker...

ウェブデザイン実践者必読のキャリアプラン

原文記事、転載の際は著者と出典を明記してください! Web デザインは間違いなくテクノロジーであり、...

チェックボックスの選択またはキャンセルを実装するJavaScript

この記事では、すべてのチェックボックスを選択または解除するためのJavaScriptの具体的なコード...

あなたが知らない Linux KDE アプリケーション 11 選

翻訳Kool Desktop Environment の略称。 Linux、Unix、FreeBSD...

このポイントのJavaScriptの基本

目次これ方法オブジェクト内これを隠した厳密モード要約するJavaScript の this も不思議...

MySQLデータのエクスポートとインポートに関する知識ポイントの簡単な分析

多くの場合、ローカル データベースのデータをエクスポートしたり、他のデータベースからデータをインポー...

スーパーバイザーを使用して nginx + tomcat コンテナを管理する例

必要: docker を使用して nginx + tomcat デュアル プロセスを起動します。実際...

Mysql の大きな SQL ファイルの高速リカバリ ソリューションの共有

序文MySQL データベースを使用する過程では、データベースのバックアップと復元が必要になることがよ...

React スキャフォールディングの構築方法を学ぶ

1. フロントエンドエンジニアリングの複雑さいくつかの小さなデモ プログラムを開発するだけであれば、...

DockerコンテナにRedisをデプロイする手順の紹介

目次1 つの Redis 設定ファイル2 Dockerコマンドの開始3 docker-compose...

空のパスがページのパフォーマンスに与える影響に対する解決策

数日前、Google Reader で Yu Bo さんが共有した投稿「空のパスがページのパフォーマ...

MySQL 5.7.21 解凍版のインストールと設定方法のグラフィックチュートリアル

私は頻繁にシステムをインストールするので、インストールのたびにいくつかのソフトウェアを再インストール...

Vueリストレンダリングキーの原理と機能の詳細な説明

目次リストレンダリングキーの原理と機能主要原則の分析キーの役割要約するリストレンダリングキーの原理と...

デザイン理論:人の心を理解する方法

<br />かつて、仏印と東坡氏が仏教について雑談していたとき、東坡氏が突然こう言った。...

JS 関数とコンストラクタを簡単に理解する

目次1. 概要1.1 Functionコンストラクタを使用して関数を作成する1.2 機能と目的2. ...