🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Vue.js

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

Firebase

Firebaseは、Googleが提供するBasSサービスの一つ。リアルタイム通知可能、並びにアクセス制御ができるオブジェクトデータベース機能を備えます。さらに認証機能、アプリケーションのログ解析機能などの利用も可能です。

Vue CLI

Vue CLIは、Vue.jsでアプリケーション開発を行うためのコマンドラインインタフェース(CLI)に基づいた開発ツールです。インタラクティブなプロジェクトの雛形や設定なしで使用できるプロトタイプの作成など、さまざまな機能が用意されています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

1回答

2316閲覧

async awaitを使いFirebaseからユーザー情報をdispatchしてから画面遷移したい

F_Yohei

総合スコア14

Vue.js

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

Firebase

Firebaseは、Googleが提供するBasSサービスの一つ。リアルタイム通知可能、並びにアクセス制御ができるオブジェクトデータベース機能を備えます。さらに認証機能、アプリケーションのログ解析機能などの利用も可能です。

Vue CLI

Vue CLIは、Vue.jsでアプリケーション開発を行うためのコマンドラインインタフェース(CLI)に基づいた開発ツールです。インタラクティブなプロジェクトの雛形や設定なしで使用できるプロトタイプの作成など、さまざまな機能が用意されています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

1クリップ

投稿2021/02/06 04:38

編集2021/02/06 08:56

前提・実現したいこと

イメージ説明

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が見つからないよ!というエラーが出てしまいました。
原因がわからず全く前に進めません。

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

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

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

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

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

guest

回答1

0

自己解決

新規登録画面のメソッド部分を以下のように書き換えたところ無事に解決しました。

async awaitとtry catchを利用してコードを書き直してみました????‍♂️

methods: { async register() { try { await firebase .auth() .createUserWithEmailAndPassword(this.email, this.password); const user = firebase.auth().currentUser; await user.updateProfile({ displayName: this.username }); //ユーザー名をFirebaseへ格納した後、非同期処理でstoreへ渡し、ログイン後画面へ遷移する this.$store.dispatch('updataUser', user); this.$router.push('/home'); } catch (e) { alert(e.message); } } }

投稿2021/02/09 08:52

F_Yohei

総合スコア14

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問