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イメージリポジトリの使い方の詳しい説明

推薦する

Windows ベースの MySQL 8.0.12 のインストール

このチュートリアルは Windows システムにのみ適用されます。インストールしたがまだインストール...

HTML タイトルに二重引用符を追加する方法

<a href="https://www.jb51.net/" title...

ネイティブ js を使用してライブ バレット スクリーンのスクロール効果をシミュレートします。

目次1. 基本原則2. 特定のコード要約する1. 基本原則まず、生放送エリアを10の部分に分割し(個...

Vue+SSMは画像アップロードのプレビュー効果を実現します

現在の要件は、ファイルのアップロード ボタンがあることです。ボタンをクリックすると、アップロードする...

MySQLの7種類のログの概要

MySQL には次のログ ファイルがあります。 1: 再実行ログ2: ロールバックログ(元に戻すログ...

Node.js の非同期イテレータの詳細な説明

目次序文非同期イテレータとは何ですか?非同期イテレータストリームとしてページング機能を備えたAPIの...

Web デザイン スキル: iframe の適応高さの問題

おそらく、この問題にまだ遭遇していない人もいるでしょうから、まずは適応高さとは何かを説明しましょう。...

Vue3 における provide と inject の使用法と原則

序文:親コンポーネントと子コンポーネント間でデータを渡す場合、通常は props と emittin...

jsはショッピングウェブサイトの商品の拡大鏡効果を実現します

この記事では、ショッピングサイトの商品の拡大鏡効果を実現するためのjsの具体的なコードを紹介します。...

重要なmysqlログファイルの概要

著者: 丁易出典: https://chengxuzhixin.com/blog/post/mysq...

MySQLデータベースのパスワードを忘れた場合の解決策

先ほど MySQL パスワードを設定したのに、外食したり荷物を受け取ったりするときにパスワードを忘れ...

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

このチュートリアルでは、MySQL5.6.22のインストールと設定方法の具体的なコードを参考までに共...

Alibaba Cloud ドメイン名と IP バインディングの手順と方法

1 Alibaba Cloud コンソールに入り、ドメイン名コンソールを見つけて、バインドするドメイ...

MySQL データベース内の同じテーブルを同時にクエリして更新する方法

通常のプロジェクトでは、1 回の入札で同時にデータを更新および照会する必要があるという問題によく遭遇...

JavaScript 円グラフの例

描画効果実装コードJavaScript var キャンバス = document.getElemen...