#やっていること
LaravelをAPIサーバーとして使用、vue(axios)でアクセスして画面表示させるアプリケーションを作成中です。
Laravelでの認証は標準装備のtokenを利用したもので、下記のようにハードコードすればvueも表示できます。
vue
1let axios = require('axios').create({ 2 baseURL: ApiUrl, 3 headers: { 4 'Accept': 'application/json', 5 'Authorization': 'Bearer '+'uGI09ICALLdclOBvsbdthstXKodnfavpHMmRCi4KhALJShbN1s8KmTdi', 6 }, 7 responseType: 'json' 8 });
#実現させたい状態
'Bearer '+'uGI09ICALLdclOBvsbdthstXKodnfavpHMmRCi4KhALJShbN0s8KmTdi'
↓
'Bearer '+tokenData
とトークンを変数にしたい。
#試したこと
tokenDataは親コンポーネントから送られてきているのでpropsにあります。(vueのdevツールやtemplateに{{ tokenData }}で文字列は表示されるので変数には代入されているようです。)
vueのドキュメントにはpropsからdataやcomputedに入れてから使用するようにとあったので、dataやcomputedを介しての使用も試しました。
'Bearer '+tokenData, //NG
'Bearer '.concat(tokenData), //NG
'Bearer '.concat(this.tokenData), //NG
#教えて欲しいこと
そもそも実現させたいことが間違っているのか、JS構文のミスなのか。
いずれはvuexも使用をするつもりですが、今は動きの確認中なのでvuexは使用せずpropsでの動作を試みています。
ヒントだけでも教えていただけると助かります。
#追記
実際に動かしているコンポーネントの全体像になります。
以下のハードコード時はvueDevツール内のpropsとcomputedには文字列が入っております。
vue
1<template> 2 <div> 3 <div class="head"> 4 <h2>User Registration</h2> 5 </div> 6 <ul class="side-bar-list"> 7 <SideBar 8 v-for="user in users" 9 :key="user.id" 10 :userData="user" 11 @userEdit="userEdit" 12 ></SideBar> 13 </ul> 14 </div> 15</template> 16 17<script> 18 import SideBar from './registration_components/SideBar'; 19 20 const ApiUrl = 'http://localhost/*******/*******/public/api/items'; 21//==================================================================== 22//ここの部分に問題があると考えています。 23 24 var headers = { 25 'Accept': 'application/json', 26 // 'Authorization': 'Bearer '+'uGI09ICALLdclOBe8UtTvykugiydnoJkcc6pHMmRCi4KhALJShbN2s8KmTdi',//このようにハードコードするとエラーがありません。 27 'Authorization': 'Bearer '.concat(this.tokenNo), 28 }; 29 30//==================================================================== 31 let axios = require('axios').create({ 32 baseURL: ApiUrl, 33 headers: headers, 34 responseType: 'json' 35 }); 36 37export default { 38 name: 'UserControl', 39 props:{ 40 tokenData: { 41 type: String, 42 // required: true 43 } 44 }, 45 components: { 46 SideBar 47 }, 48 computed:{ 49 tokenNo() { 50 return this.tokenData 51 } 52 }, 53 data () { 54 return { 55 users: null, 56 editUser: { 57 first_name: '', 58 family_name: '', 59 age: '', 60 email: '', 61 password: '', 62 edit: false 63 } 64 }; 65 }, 66 mounted () { 67 axios.get(ApiUrl) 68 .then(response => (this.users = response.data)); 69 }, 70 methods: { 71 // edit method 72 clearEdit () { 73 this.editUser = { 74 first_name: '', 75 family_name: '', 76 age:'', 77 email: '', 78 password: '', 79 edit: false 80 }; 81 }, 82 // SideBar method 83 userEdit (selectUserID) { // ユーザー編集のONとOFF 84 let selectEditUser = this.users.findIndex(({ id }) => id === selectUserID);// IDから編集を選択されたユーザー取得 85 this.releaseEdit(selectEditUser); 86 this.users[selectEditUser].edit = !this.users[selectEditUser].edit; 87 this.setCurrentUser(); 88 this.$forceUpdate(); 89 }, 90 releaseEdit (userIndex) { // 選択したユーザー以外が編集中だった場合に解除 91 let editTrueIndex = this.users.findIndex(({ edit }) => edit === true);// 編集中のユーザーインデックスを取得 92 if (editTrueIndex > -1) { // indexで取得のためindexが有効かチェック 93 if (this.users[editTrueIndex].edit !== this.users[userIndex].edit) { // 編集中のユーザーと選択したユーザーが違う場合に削除発火 94 this.users[editTrueIndex].edit = false; 95 } 96 } 97 }, 98 setCurrentUser () { // 編集ONになった際に右の編集画面に反映させるメソッド 99 let editTrueIndex = this.users.findIndex(({ edit }) => edit === true); 100 if (editTrueIndex > -1) { 101 this.editUser = this.users[editTrueIndex]; 102 } else { 103 this.refresh();//編集を更新しない場合はデータベースを再取得 104 this.clearEdit();//右側の記入欄をクリア 105 } 106 }, 107 //Api method 108 async update (data) {//ユーザー情報の更新 109 await axios.put(ApiUrl+'/'+data.id, data) 110 .then( 111 alert('user edit ok') 112 ) 113 .catch(function (err) { 114 alert(err) 115 }); 116 this.refresh() 117 }, 118 async addUser () {//Userの追加 119 await axios.post(ApiUrl, this.editUser) 120 .then( 121 alert('user add ok') 122 ) 123 .catch(function (err) { 124 alert(err); 125 }); 126 this.refresh()//thenの中に書いて不安定になってたけど、ここにして安定した。 127 }, 128 async softDelete (id) {//Userの論理削除、Deleted_atにTimeStamp入力 129 await axios.delete(ApiUrl+'/'+id) 130 .then( 131 alert('user softDeleted ok') 132 ) 133 .catch(function (err) { 134 alert(err) 135 }); 136 this.refresh() 137 }, 138 refresh (){//Api処理後の再表示 139 axios.get(ApiUrl) 140 .then(response => ( 141 this.users = response.data 142 )) 143 .catch(err => ( 144 alert(err) 145 )); 146 }, 147 // Registration method 148 add () { 149 if (this.users.find(editId => editId.id === this.editUser.id)) { //users内にeditUserのidが存在する=>更新の場合 150 if (confirm('ユーザー情報を更新しますか?')) { 151 //↑ var result = confirm('ユーザー情報を更新しますか?')をそのまま代入している。 152 var editTrueIndex = this.users.findIndex(({edit}) => edit === true);// 編集中のインデックス取得 153 this.users[editTrueIndex].edit = !this.users[editTrueIndex].edit; // 編集ボタンを解除 154 this.update(this.users[editTrueIndex]); 155 this.clearEdit(); 156 } 157 } else { // users内にeditUserのidが存在しない=>追加の場合 158 if (confirm('ユーザーを追加しますか?')) { 159 this.addUser(); 160 this.clearEdit(); 161 } 162 } 163 }, 164 del () { 165 if (confirm('ユーザーを削除しますか?')) {//user削除 166 var editTrueIndex = this.users.findIndex(({edit}) => edit === true); 167 this.softDelete(this.users[editTrueIndex].id); 168 this.clearEdit(); 169 this.refresh(); 170 } 171 }, 172 } 173}; 174</script> 175 176<style scoped lang="scss"> 177 178</style>
methods内でもaxiosは使用していますが、動的な部分ですので初期表示のmountedがメインのエラー個所と考えています。
#エラーコード
vue
1'Authorization': 'Bearer '.concat(this.tokenNo)
上記、使用時のエラーコードは以下になります。
app.js:2947 Uncaught TypeError: Cannot read property 'tokenNo' of undefined
恥ずかしい話、今回の質問後にエラーを確認しましたがundefinedでした。
しかし、なぜundefinedになってしまっているのかわかりません。

回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/01/30 20:19
2019/01/31 04:19
2019/01/31 08:17