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

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

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

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

Onsen UI

HTML5で記述されたモバイルアプリの高速化、およびネイティブアプリライクなUIが作れるフレームワーク。 様々なJavaScriptフレームワークと併せて使用することができます。スマートフォン向けアプリ、Webサイトに必要なアニメーション、UI/UXを実装することが可能になります。

Q&A

1回答

720閲覧

ログイン後のaxios headersのベストプラクティスの追求

garchomp

総合スコア128

Vue.js

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

Onsen UI

HTML5で記述されたモバイルアプリの高速化、およびネイティブアプリライクなUIが作れるフレームワーク。 様々なJavaScriptフレームワークと併せて使用することができます。スマートフォン向けアプリ、Webサイトに必要なアニメーション、UI/UXを実装することが可能になります。

0グッド

0クリップ

投稿2018/09/09 03:24

環境 OS:linux(ubuntu studio) npm:6.2.0 node:10.8.0 vue-cli:2.9.6 UIフレームワーク:onsen ui

ログインした後、マイページ情報を表示するのがゴールという仮定で話を進めます。

これを実現するために、ログイン後トークンを格納した状態でマイページ情報を呼び出す必要があります。
目的として、いちいちaxiosのheader情報を書くのは大変であるため、mainで一括管理をできるようにすることをゴールとしています。

現在自分の行った実装は以下のようになります。

js

1export default new Vuex.Store({ 2 modules: { 3 login: { 4 state: { 5 loginFlg: false, 6 access_token: localStorage.LgbtProjectToken 7 }, 8 mutations: { 9 logout (state) { 10 state.access_token = '' 11 state.loginFlg = false 12 }, 13 login (state, token) { 14 state.access_token = token 15 state.loginFlg = true 16 } 17 } 18 } 19 } 20})

js

1// main.js 2 3const axiosBase = axios.create({ 4 baseURL: process.env.BASE_URL, 5 headers: { 6 Authorization: 'Bearer ' + store.state.login.access_token 7 } 8}) 9/* eslint-disable no-new */ 10// `myOption` カスタムオプションにハンドラを注入する 11Vue.mixin({ 12 data: function () { 13 return { 14 axios: axiosBase, 15 headers: { 16 headers: { 17 Authorization: 'Bearer ' + store.state.login.access_token 18 } 19 }, 20 token: store.state.login.access_token 21 } 22 }, 23 watch: { 24 token: function (val) { 25 console.log(val) 26 } 27 } 28}) 29 30Vue.mixin({ 31 data: function () { 32 return { 33 axios: axiosBase, 34 headers: { 35 headers: { 36 Authorization: 'Bearer ' + store.state.login.access_token 37 } 38 }, 39 token: store.state.login.access_token 40 } 41 } 42})

js

1// Profile.js 2this.axios 3.get(process.env.BASE_URL + 'getProfile', this.headers) 4.then(function(res) { ... }

試行錯誤した結果、とりあえずmixinでどのコンポーネントからも参照できるようにすることで、少しでもコンポーネント内のheaderの記述を減らそうという作戦です。
ただ、現状ですと、headersがネストしている状態になっているため、あまりいいアプローチとは言えません。

もっと見やすく、かつわかりやすいコードを記述するためのアプローチがありましたらぜひご教授のほどよろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

現状のコードで煩雑化している原因として、dataにヘッダの情報を入れていることがあると思います。

策はいろいろありますが、Vuex には store の情報を活用するために getter 機能 があるので、これを使って axios に入れたい情報をすべて入れこんでしまえばいいと思います。

Javascript

1export default new Vuex.Store({ 2 modules: { 3 login: { 4 ... 5 getters: { 6 axiosProfile: state => { 7 return { 8 Authorization: 'Bearer ' + state.login.access_token 9 } 10 } 11 } 12 } 13 } 14}) 15 16//Profile.js 17this.axios 18.get(process.env.BASE_URL + 'getProfile', this.$store.getters.axiosProfile) 19.then(function(res) { ... }

他にも、現状では loginFlg でログインしたかを判定していますが、getters により

getters: { isLogedin: state => !!state.access_token }

などとすることで、アクセストークンの有無で(state として保持することなく)ログインしたかの判定ができたりします。

getters はとても便利なので、ぜひ活用することをおすすめします!

投稿2018/09/28 12:56

fuuki

総合スコア70

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問