質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Vue.js

Vue.jsは、Webアプリケーションのインターフェースを構築するためのオープンソースJavaScriptフレームワークです。

Q&A

解決済

2回答

941閲覧

Vue.js+vuexでのログイン処理の書き方

shichiria

総合スコア33

Vue.js

Vue.jsは、Webアプリケーションのインターフェースを構築するためのオープンソースJavaScriptフレームワークです。

3グッド

1クリップ

投稿2017/12/27 06:22

Vue.js+vuexでログイン処理を書いているのですが、
ログイン処理の書き方に迷っています。
ログインでトークンを作成し、
API呼び出しの度にトークンを引き回して使用したいのですが、

最初のログイン時、APIでトークンが無効だったなど、
何かしらログインが無効になった時に任意の画面にログインダイアログを出そうと思っています。

その際に、どこでログイン処理をして、どこでダイアログを書けばいいのか困っています。
vuexのstore内のアクションでログイン処理をしようとしたのですが、
アクション内だとダイアログが出せず、別途コンポーネントとしてダイアログを実装し、
各画面に置かねばなりません。
これは少し冗長かなと感じています。

イメージ説明

出来れば下記のようにログイン処理を呼び出したら完結するようにしたいのですが、
それはそれで出来たとしてもVuexを使った正しい書き方のような気がしません。

イメージ説明

Vuexを使い慣れてないせいもあると思いますが、
このような場合どう書くのが一番綺麗になるでしょうか?
私自身があまりVuexを理解していないので、ぼんやりした質問ですみません。

Yatima, kochoru, nazonohito51👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

上の認識であっております。
storeにコンポーネントを持つことはできません。

そのため、共通のコンポーネントを持つように実装するのがよろしいかと思います。
コンポーネントはそれのみ単独で動作するようにして、それを各ページでは呼び出すのみとします。

冗長性を取り除く例をnuxt.jsでのフォルダ構造を例にサンプルで作ってみました。
https://codesandbox.io/s/github/sakapun/vue-slot-sample/tree/master/
slotを使い各ページでダイアログ要素を埋め込んでいますが、各ページにはコンポーネントを配置するようなことなことはしていません。

投稿2017/12/27 09:26

編集2017/12/27 09:27
sakapun

総合スコア888

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

shichiria

2017/12/27 11:13

Componentを入れ子にしてレイアウトを作るという発想はありませんでした。 確かに冗長性なく今のダイアログを綺麗に使えそうです。 ありがとうございました。
guest

0

  1. Loginの失敗状態をStoreに追加
  2. Loginの失敗失敗したら、StoreのLoginの失敗状態をtrue
  3. 失敗理由をLoginStoreに書き込み
  4. rootに配置した、login-dialogにとエラーメッセージとLogin失敗状態をバインディング

コンポーネントの配置に関しては下記のような感じで、
root要素にアラート要素にlogin-dialogコンポーネントを差し込んでみるといいかと思います。
position:absoluteとか指定すれば、login-dialog要素は各画面より上に乗っかるかと思います。

<div id="app"> <h1>Hello App!</h1> <p> <!-- ナビゲーションに router-link コンポーネントを使う --> <!-- リンク先を `to` プロパティに指定します --> <!-- デフォルトで `<router-link>` は `<a>` タグとして描画されます --> <router-link to="/foo">Go to Foo</router-link> <router-link to="/bar">Go to Bar</router-link> </p> <!-- ルートアウトレット --> <!-- ルートとマッチしたコンポーネントがここへ描画されます --> <router-view></router-view> <login-dialog v-if="isLogin" :message="errorMessage"></login-dialog> </div>

投稿2017/12/27 09:28

編集2017/12/27 09:38
oligin

総合スコア138

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

shichiria

2017/12/27 11:14

この方法でも綺麗にできそうです、ありがとうございます。 こちらも参考にさせていただきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問