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

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

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

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

Vuex

Vuexは、Vue.js アプリケーションのための状態管理ライブラリです。アプリケーション内で使用するコンポーネントのための集中データストアを提供。コンポーネント同士でデータをやり取りし、処理のフローを一貫させたり、データの見通しを良くすることができます。

Q&A

解決済

1回答

914閲覧

????【Vue.firebase】テーブル内のモーダルに各ユーザー情報を表示させたい

yukiman

総合スコア7

Firebase

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

Vuex

Vuexは、Vue.js アプリケーションのための状態管理ライブラリです。アプリケーション内で使用するコンポーネントのための集中データストアを提供。コンポーネント同士でデータをやり取りし、処理のフローを一貫させたり、データの見通しを良くすることができます。

0グッド

0クリップ

投稿2021/08/30 05:53

編集2021/08/31 05:10

テーブル内の各行にあるモーダルボタンを押したら、ユーザー情報を取得したい

現在、Vue.FireStoreを利用し、仮想的な投げ銭アプリを制作しています。
その中で、モーダル機能をつけ、”Walletを見る”をクリックするとログインしていない各ユーザーの名前、残高を表示させたいです。

現在、モーダルを開くと、ログインしていないユーザー情報がすべて同じモーダルに表示されてしまいます。
クリックしたときに、そのユーザーと一致する情報を取得し、表示したいです。

Home.vueで

openModal (user,index){ console.log(user)

でコンソールで確認すると、クリックしたユーザーの情報が取得できてはいるのですが、これをモーダルに反映させる方法が何度試行錯誤してもわかりません。

初学者なため、基礎的な質問かもしれませんが、ご教授いただけると幸いです。

イメージ説明
イメージ説明

該当のソースコード

Home.vue

<template> <div class="home"> <img alt="Vue logo" src="../assets/logo.png" /> <button @click="signOut" class="signout">ログアウト</button> <p class="name">{{ userName }}さんようこそ!</p> <p class="wallet">残高:{{ $store.getters.myWallet }}</p> <h1>ユーザ一覧</h1> <table> <thead> <tr> <th>ユーザー</th> </tr> </thead> <tr v-for="(user,index) in userData" v-bind:key="index"> <td>{{ user.name}}</td> <td><button class="button2" @click="openModal(user,index)">Walletを見る</button></td> <td><button class="button2" @click="openModal2(index)">送る</button></td> </tr> </table> <div> <transition> <Modal :val="usersIndex" v-show="showContent" @click="closeModal" @open="showContent = true" @close="showContent = false" ></Modal> </transition> </div> <div> <transition> <Modal2 :val="usersIndex" v-show="showContent2" @click="closeModal2" @open="showContent2 = true" @close="showContent2 = false" ></Modal2> </transition> </div> </div> </template> <script> import Modal from '../Modal.vue'; import Modal2 from '../Modal2.vue'; import firebase from "firebase"; export default { name: 'Home', components:{ Modal, Modal2, }, data() { return { userName: "", showContent: false, showContent2: false, usersIndex:'', userData: [], }; }, methods: { openModal (user,index){ console.log(user) this.showContent = true this.usersIndex = index const usersIndex = this.usersIndex this.$store.dispatch('modalSet', usersIndex) }, closeModal (){ this.showContent = false }, openModal2 (index){ this.showContent2 = true this.usersIndex = index const usersIndex = this.usersIndex this.$store.dispatch('modalSet', usersIndex) }, closeModal2 (){ this.showContent2 = false }, signOut() { firebase .auth() .signOut() .then(() => { this.$router.push("/signin"); }); }, }, computed: { name() { return this.$store.getters.name; }, myWallet() { return this.$store.getters.myWallet; }, }, mounted() { firebase.auth().onAuthStateChanged((user) => { this.userName = user.displayName; }); firebase.auth().onAuthStateChanged((user) => { if (user) { console.log("true"); } else { location.href = "/signin"; } const currentUser = firebase.auth().currentUser; this.uid = currentUser.uid; firebase .firestore() .collection("userData") .where(firebase.firestore.FieldPath.documentId(), "!=", currentUser.uid) .get() .then((querySnapshot) => { querySnapshot.forEach((doc) => { let data = { name: doc.data().name, myWallet: doc.data().myWallet, }; this.userData.push(data); }); }); }); }, }; </script>

Modal.vue

<template> <div class="overlay" v-show="showContent"> <div class="main-content"> <div v-for="(user,index) in userData" v-bind:key="index"> <p>{{ user.name }}さんの残高</p> <p>{{ user.myWallet}}</p> </div> <div id="button-content"> <p> <button @click="closeModal" class="modal-button">close</button> </p> </div> </div> </div> </template> <script> import firebase from "firebase"; export default { data() { return { showContent: false, userData:[], }; }, methods: { openModal() { this.$emit("open", this.showContent); }, closeModal() { this.$emit("close", this.showContent); }, returnUserData(id) { const userData = this.userData.find((user) => user.uid === id); return userData; }, }, mounted() { firebase.auth().onAuthStateChanged(() => { const currentUser = firebase.auth().currentUser; this.uid = currentUser.uid; firebase .firestore() .collection("userData") .where(firebase.firestore.FieldPath.documentId(), "!=", currentUser.uid) .get() .then((querySnapshot) => { querySnapshot.forEach((doc) => { let data = { name: doc.data().name, myWallet: doc.data().myWallet, }; this.userData.push(data); }); }); }); }, }; </script>

index.js

import Vue from 'vue' import Vuex from 'vuex' import firebase from 'firebase' import router from '@/router' Vue.use(Vuex) export default new Vuex.Store({ state: { user: { name: '', email: '', password: '', myWallet: '', }, users: [], modalDatas: [], }, getters: { email(state) { return state.user.email; }, password(state) { return state.user.password; }, name(state) { return state.user.name; }, myWallet(state) { return state.user.myWallet; }, users(state) { return state.users }, modalDatas(state) { return state.modalDatas }, }, mutations: { setUser(state, payload) { state.user.email = payload.email state.user.password = payload.password state.user.name = payload.name state.user.myWallet = payload.myWallet }, setUserData(state, doc) { state.user.name = doc.data().name state.user.myWallet = doc.data().myWallet }, setUsersData(state, users) { state.users = users }, setModalDatas(state, modalDatas) { state.modalDatas = modalDatas }, }, actions: { signUp(context, payload) { firebase.auth().createUserWithEmailAndPassword(payload.email, payload.password) .then(() => { const user = firebase.auth().currentUser user.updateProfile({ displayName: payload.name, }, ) .then(() => { const db = firebase.firestore(); db.collection("userData").doc(user.uid).set({ uid: user.uid, email: payload.email, password: payload.password, name: payload.name, myWallet: payload.myWallet, }) }) .then(() => { context.commit('setUser', payload) }) .then(() => { router.push('/home') }) }) .catch(function (error) { alert('入力に誤りがあります(' + error.message + ')'); }); }, signIn(context, payload) { firebase.auth().signInWithEmailAndPassword(payload.email, payload.password) .then(() => { const user = firebase.auth().currentUser const docRef = firebase.firestore().collection("userData").doc(user.uid); docRef.get() .then((doc) => { if (doc.exists) { context.commit('setUserData', doc) } else { console.log(); } }) .then(() => { router.push('/home') }) .catch(function (error) { alert('パスワードもしくはメールアドレスが異なります(' + error.message + ')'); }) }) }, modalSet (context, usersIndex) { const modalDatas = []; const user = firebase.auth().currentUser const db = firebase.firestore(); db.collection("userData") .where(firebase.firestore.FieldPath.documentId(), "!=", user.uid) .get() .then((querySnapshot) => { querySnapshot.forEach((doc) => { const modalData = { uid: usersIndex, name: doc.data().name, myWallet: doc.data().myWallet } modalDatas.push(modalData) context.commit('setModalDatas', modalDatas) console.log(modalDatas) }); }); }, }, modules: { } })

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

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

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

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

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

guest

回答1

0

自己解決

コンポーネント、propsを利用し、動的に処理を実行したら、解決いたしました。

投稿2021/09/01 04:23

yukiman

総合スコア7

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問