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

推薦する

テキストエリアの使用に関する注意事項

なぜテキストエリアについて具体的に言及するのでしょうか?なぜなら、textarea ノードは実際には...

Docker プライベートリポジトリの管理とローカルリポジトリ内のイメージの削除

1: Dockerプライベートウェアハウスのインストール1. イメージリポジトリからイメージをダウン...

HTML テーブル マークアップ チュートリアル (29): セルのライト境界線の色属性 BORDERCOLORLIGHT

セルでは、明るい境界線の色を個別に定義できます。 > 基本構文<TD ボーダーカラーライ...

複数のドメイン名、ポート、IP仮想ホストに基づくNginx構成

1. タイプの導入1.1 ドメインベースの仮想ホスティングいわゆるドメイン名ベースの仮想ホストとは、...

CocosCreator MVCアーキテクチャの詳細な説明

概要この記事では、ゲームクライアントでよく使用される MVC アーキテクチャについて紹介します。ゲー...

MySQL における識別子の大文字と小文字の区別の問題の詳細な分析

MySQL では、テーブル名の大文字と小文字の区別の問題が発生する可能性があります。実際、これはプラ...

MySQL ALTERコマンドの知識ポイントのまとめ

テーブル名を変更したり、テーブル フィールドを変更したりする必要がある場合は、 MySQL ALTE...

HTML でのメタタグと使用法の詳細な説明

これ以上無駄話をして時間を無駄にしないので、今日の話題を始めましょう。 HTML のメタタグ1. メ...

MySQL で中国語の文字をピンインでソートする簡単な例

名前を格納するフィールドが GBK 文字セットを使用している場合、GBK 内部コード自体がエンコード...

CSS 画面サイズ適応実装例

CSS 画面サイズの適応を実現するには、まず CSS3 @media メディア クエリを導入する必要...

CSS で div 凹角スタイルを実装するサンプル コード

通常の開発では、凸型の丸い角、つまり border-radius 属性を使用するのが一般的です。凹角...

JSで画面録画機能を作成する

OBS studioかっこいいですが、 JavaScriptもっとかっこいいです。では、 JavaS...

MySQL 8.0 でのチェック制約の実装

みなさんこんにちは。私は技術の話ばかりして髪を切らない先生のトニーです。今回はMySQL 8.0で追...

NGINXがウェブサイトのPV、UV、独立IPをカウントする方法の詳細な説明

Nginx: PV、UV、独立IPウェブサイトを作成する人なら誰でも、ウェブサイトのPV、UV、その...

CentOS 8.0.1905 は ZABBIX 4.4 バージョンをインストールします (検証済み)

Zabbix サーバー環境プラットフォームバージョン: ZABBIX バージョン 4.4システム:...