前提・実現したいこと
Vue.jsで簡単な投げ銭アプリを作成しています。
Firebaseでログイン機能を実装し、ユーザー情報も管理しています。
今はsetTimeout()を使い、画面遷移する時間を遅らせてダッシュボードにユーザー名が表示されるようにしています。
ですが、setTimeout()を使わずasync awaitを使い同じような挙動をするように書き換えたいです。
該当のソースコード
↓Signup.vue(新規登録画面のコード)
vue
1<template> 2 <div> 3 <h1>新規登録画面</h1> 4 <form> 5 <ul> 6 <li class="user-name"> 7 <label for="user-name">ユーザー名</label> 8 <input type="text" id="user-name" placeholder="UserName" v-model="username" /> 9 </li> 10 <li class="email"> 11 <label for="email">メールアドレス</label> 12 <input type="email" id="email" placeholder="E-mail" v-model="email" /> 13 </li> 14 <li class="password"> 15 <label for="password">パスワード</label> 16 <input type="password" id="password" placeholder="PassWord" v-model="password" /> 17 </li> 18 </ul> 19 </form> 20 21 <button @click="register">新規登録</button> 22 <br /> 23 <router-link to="/">ログインはこちらから</router-link> 24 </div> 25</template> 26 27<script> 28import firebase from 'firebase'; 29 30export default { 31 data() { 32 return { 33 username: '', 34 email: '', 35 password: '' 36 }; 37 }, 38 methods: { 39 register() { 40 firebase 41 .auth() 42 .createUserWithEmailAndPassword(this.email, this.password) 43 .then(result => { 44 result.user.updateProfile({ 45 displayName: this.username 46 }); 47 48 //ユーザー名をFirebaseへ格納した後、非同期処理でstoreへ渡し、ログイン後画面へ遷移する 49 setTimeout(() => { 50 this.$store.dispatch('updataUser', result.user) 51 this.$router.push('/home'); 52 }, 1000) 53 }) 54 .catch(error => { 55 alert(error.message); 56 }); 57 } 58 } 59}; 60</script>
↓Home.vue(画面遷移後のコード)
vue
1<template> 2 <div> 3 <div class="login-message-area"> 4 <div> 5 <span>{{ userName }}さんようこそ!!</span> 6 </div> 7 8 <div> 9 <span>残高 : 1000</span> 10 <button>ログアウト</button> 11 </div> 12 </div> 13 14 <h1>ユーザ一覧</h1> 15 16 <div class="user-list-wrapper"> 17 <h4>ユーザ名</h4> 18 19 <ul class="user-list"> 20 <li> 21 <span>TEST</span> 22 <form> 23 <button>walletを見る</button> 24 <button>送る</button> 25 </form> 26 </li> 27 <li> 28 <span>TEST</span> 29 <form> 30 <button>walletを見る</button> 31 <button>送る</button> 32 </form> 33 </li> 34 <li> 35 <span>TEST</span> 36 <form> 37 <button>walletを見る</button> 38 <button>送る</button> 39 </form> 40 </li> 41 </ul> 42 </div> 43 </div> 44</template> 45 46<script> 47import firebase from 'firebase'; 48import { mapGetters } from 'vuex' 49 50export default { 51 data() { 52 return { 53 userName: '' 54 }; 55 }, 56 computed: mapGetters(['getUserName']), 57 // リロードしてもユーザー名が消えないようにする処理 58 created () { 59 firebase.auth().onAuthStateChanged((user)=> { 60 if (user) { 61 this.userName = user.displayName 62 } 63 }); 64}, 65 mounted() { 66 this.userName = this.getUserName 67 } 68}; 69</script>
↓store.js
javascript
1import { createStore } from 'vuex'; 2 3 4const store = createStore({ 5 state() { 6 return { 7 user: '' 8 } 9 }, 10 getters: { 11 getUserName: state => state.user.displayName 12 }, 13 mutations: { 14 updataUser(state, userInformation) { 15 state.user = userInformation; 16 } 17 }, 18 actions: { 19 updataUser(context, userInfomation) { 20 context.commit('updataUser', userInfomation) 21 } 22 } 23}); 24 25 26export default store;
自分でコードを書いてみたりしたのですが、1日考えてみても上手くできない為、お力添えいただけると助かります????♂️
よろしくお願いします。
#追記
methods: { register() { firebase .auth() .createUserWithEmailAndPassword(this.email, this.password) .then(result => { result.user.updateProfile({ displayName: this.username }); //ユーザー名をFirebaseへ格納した後、非同期処理でstoreへ渡し、ログイン後画面へ遷移する async function setUserName() { await this.$store.dispatch('updataUser', result.user) this.$router.push('/home'); } setUserName(); }) .catch(error => { alert(error.message); }); } }
自分なりにSignUp.vueファイルのmethodsを上記のように書き直してみたのですが、
SignUp.vue?5ace:49 Uncaught (in promise) TypeError: Cannot read property '$store' of undefined
$storeが見つからないよ!というエラーが出てしまいました。
原因がわからず全く前に進めません。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。