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

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

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

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

Firebase

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

Q&A

解決済

1回答

3489閲覧

Vue.jsでユーザープロフィール編集ページの作り方

Khy

総合スコア118

Vue.js

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

Firebase

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

0グッド

0クリップ

投稿2019/03/25 07:10

Vue.js、Vuetify、firebaseを使いwebアプリを作成しております。
ユーザーが自分のプロフィールを編集するページを作っているのですが、行き詰ってしまいました。

「プロフィールを編集」ボタンを押したら入力フォームを表示し編集できるようにし、その際に「更新」ボタンを押したらデータを更新、「キャンセル」ボタンを押したら入力した内容を破棄して戻るようにしたいです。
1回目はキャンセルボタンがきちんと動作するのですが2回目以降はキャンセルが効かずに変更されてしまいます。

まだVueを勉強し始めたばかりなので至らぬ点が多いかとお思いますが、どこをどう直したら良いかご教授いただけると幸いです。宜しくお願い致します。

Vue

1<template> 2 <div> 3 <v-btn flat outline v-if="!isEdit" @click="edit" class="ml-4">プロフィールを編集</v-btn> 4 <v-btn flat outline v-if="isEdit" @click="update" v-bind:disabled="noChange" class="red red--text ml-4">更新</v-btn> 5 <v-btn flat outline v-if="isEdit" @click="cancel">キャンセル</v-btn> 6 <v-layout align-center> 7 <v-flex xs3><v-subheader>名前</v-subheader></v-flex> 8 <v-flex xs9 v-if="!isEdit">{{currentUser.onamae}}</v-flex> 9 <v-flex xs9 v-if="isEdit"> 10 <v-text-field v-model="currentUser.onamae"></v-text-field> 11 </v-flex> 12 </v-layout> 13 </div> 14</template> 15 16<script> 17import firebase from 'firebase' 18import db from '@/fb' 19 20export default { 21 22 data(){ 23 return{ 24 isEdit: false, 25 updated: false, 26 } 27 }, 28 29 methods: { 30 edit(){ 31 this.isEdit = true; 32 this.updated = false; 33 }, 34 35 update(){ 36 this.newUserData = { 37 onamae: this.currentUser.onamae, 38 }; 39 40 this.currentUserEmail = firebase.auth().currentUser.email; //ログイン中ユーザのメールアドレスを取得 41 var currentUserDoc = db.collection('users').doc(this.currentUserEmail); //ログイン中ユーザーのドキュメントを代入 42 currentUserDoc.update(this.newUserData) 43 .then(function(docRef) { 44 console.log("Document written with ID: ", docRef); 45 location.reload(); //ページをリロード 46 }) 47 .catch(function(error) { 48 console.error("Error adding document: ", error); 49 }); 50 }, 51 52 cancel(){ 53 this.isEdit = false; 54 this.$store.commit('setUser', this.oldUserData); 55 }, 56 }, 57 58 computed: { 59 60 changes: function() { 61 const changes = []; 62 const orig = this.oldUserData; 63 const dest = this.currentUser; 64 Object.keys(orig).forEach(function(key) { 65 if (orig[key] != dest[key]) { 66 changes.push({name: key}); 67 } 68 }); 69 return changes; 70 }, 71 72 noChange: function() { 73 // 何か情報がオリジナルと変わったときだけ、更新ボタンをアクティブにする。 74 return !(this.isEdit && this.changes.length > 0); 75 }, 76 77 currentUser: function(){ 78 return this.$store.getters.currentUser; 79 }, 80 81 oldUserData(){ 82 return this.$store.getters.oldUserData; 83 }, 84 } 85} 86 87 88

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

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

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

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

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

guest

回答1

0

ベストアンサー

操作手順とストアの詳細がどうなってるのか分からないのでこれで直るか不明ですが、

html

1<v-text-field v-model="currentUser.onamae"></v-text-field>

↑の部分で v-model に computed の値を入れているのに対して、

js

1 currentUser: function(){ 2 return this.$store.getters.currentUser; 3 },

↑の部分で算出 Setter 関数が定義されてないので不具合が出るのではないかと思います。

js

1 currentUser: { 2 get: function(){ 3 return this.$store.getters.currentUser; 4 }, 5 set: function(newValue){ 6 // ストアへの保存処理 7 } 8 },

参考リンク

投稿2019/03/25 13:17

yhg

総合スコア2161

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

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

Khy

2019/04/07 02:58

ご返信が遅れてしまい申し訳ございません。 changesのところを修正したところ何とか上手く動作するようになりました! v-modelを使用しているのにsetterを定義していないとのこと確認不足でした、ご指摘ありがとうございます!まだまだ勉強不足なので、精進してまいります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問