認証済みユーザー毎にプロフィール情報をHTMLに表示させる
mypage.vue
<modal
class="modal-inner"
v-scroll-lock="open"
name="edit"
:width="1100"
:height="740"
>
<div data-modal="edit" aria-expanded="true" class="vm--overlay">
<div class="vm--top-right-slot"></div>
</div>
<div class="modal-header flex">
<h2 class="profile-tll flex">プロフィールを編集する</h2>
<hr class="separate" />
</div>
<div class="modal-body">
<div class="profile-inner flex">
<div class="profile-contens flex">
<div class="profile-img-inner flex">
<img
src="../assets/アイコン.jpg"
width="200"
height="200"
class="profile-img"
alt="プロフィール画像"
/>
<button class="profile-txt profile-update" @click="update">
プロフィール画像を編集する
</button>
</div>
<div class="line"></div>
<div class="profile-items flex">
<div class="profile-contens flex">
<input
type="text"
class="profile-item"
placeholder="名前"
v-model="name"
/>
</div>
<div class="profile-contens flex">
<select
class="profile-select"
v-model="sex"
:style="{ color: sex == '' ? 'gray' : 'white' }"
>
<option class="profile-item" value hidden>性別</option>
<option
v-for="sex in sexs"
:value="sex.name"
:key="sex.id"
class="profile-item"
style="color: white;"
>{{ sex.name }}</option
>
</select>
</div>
~ 省略 ~
<button
class="hide-btn flex" @click=" hide(); closeModal();">×</button>
</div>
<button @click="updateBtn" class="update-btn flex">更新</button>
</div>
</div>
</modal>
mypage.vue
<script>
import firebase from "firebase";
import Header from "@/components/header.vue";
import Vue from "vue";
~ 省略 ~
export default {
data() {
return {
name: "",
sex: "",
sexs: [{ name: "男性" }, { name: "女性" }, { name: "その他" }],
age: "",
ages: [
{ name: "10際未満" },
{ name: "10 ~ 19歳" },
~ 省略 ~
],
access: "",
accesses: [
{ name: "北海道" },
{ name: "青森県" },
{ name: "岩手県" },
~ 省略 ~
],
profession: "",
professions: [
{ name: "公務員" },
{ name: "会社員" },
~ 省略 ~
],
selfpr: "",
genre: "",
genres: [
{ id: 0, name: "ジャンル" },
{ id: 1, name: "アクション" },
{ id: 2, name: "ドラマ" },
~ 省略 ~
],
favMovie: "",
uploadedImage: "",
profileData: {},
open: false,
};
},
components: {
Header,
},
methods: {
// updateBtn()が押下されたら、dbインスタンスを初期化して"posts"という名前のコレクションへの参照
updateBtn() {
firebase
.firestore()
.collection("users")
.doc(this.$route.params.uid)
//uidとは、routerの/mypage/:uidの[uid]のこと。
//コレクションのusersを参照して、ドキュメントのuidを参照。
.set(
{
name: this.name,
sex: this.sex,
age: this.age,
access: this.access,
selfpr: this.selfpr,
profession: this.profession,
uploadedImage: this.uploadedImage,
genre: this.genre,
favMovie: this.favMovie,
time: firebase.firestore.FieldValue.serverTimestamp(),
//サーバ側で値設定
},
{ merge: true }
//set()でmergeをtrueにすると、上書き。updetaと同様。
);
this.$swal({
title: "内容確認",
text: "この内容で投稿しますか?",
icon: "info",
buttons: true,
dangerMode: true,
}).then((willDelete) => {
if (willDelete) {
this.$swal("投稿しました。", {
icon: "success",
});
this.$router.go({
path: `/mypage/${this.$route.params.uid}`,
force: true,
});
//プロフィール編集されたらページをリロード
} else {
this.$swal("キャンセルしました。");
}
});
},
~ 省略 ~
created() {
const currentUser = firebase.auth().currentUser;
if (currentUser) {
firebase
.firestore()
.collection("users")
.doc(this.$route.params.uid)
.get()
.then((snapshot) => {
this.profileData = snapshot.data();
//全てのデータを取得して、profileDataへ代入。
// console.log(snapshot.data());
});
}
},
</script>
usersというコレクションを参照して、.doc(this.$route.params.uid)で現在のURLのパラメーター情報を取得。
get().then((snapshot)を使って、対象ユーザーの全データを取得して、
そのデータをthis.profileData = snapshot.data();でthis.profileDataへ代入してます。
profileDataへはJSON形式で格納されるようにしてます。
router.js
{
path: "/mypage/:uid",
name: "Mypage",
component: Mypage,
meta: { requiresAuth: true },
},
mypage.vue
export default {
data() {
return {
profileData: {},
//JSON形式で格納。
};
created() {
const currentUser = firebase.auth().currentUser;
if (currentUser) {
firebase
.firestore()
.collection("users")
.doc(this.$route.params.uid)
.get()
.then((snapshot) => {
this.profileData = snapshot.data();
//全てのデータを取得して、profileDataへ代入。
});
}
あとはthis.profileDataに格納されたデータを{{ profileData.○○ }}で取得し表示させてます。
mypage.vue
<div class="profile-list">
<ul class="list-item">
<li class="list-items">
性別:
<div class="list-color">{{ profileData.sex }}</div>
</li>
<li class="list-items">
年齢:
<div class="list-color">{{ profileData.age }}</div>
</li>
<li class="list-items">
職業:
<div class="list-color">{{ profileData.profession }}</div>
</li>
<li class="list-items">
居住地:
<div class="list-color">{{ profileData.access }}</div>
</li>
<li class="list-items">
好きな映画:
<div class="list-color">{{ profileData.favMovie }}</div>
</li>
<li class="list-items">
好きなジャンル:
<div class="list-color">{{ profileData.genre }}</div>
</li>
<li class="list-items">
自己紹介:
<div class="list-color">{{ profileData.selfpr }}</div>
</li>
</ul>
</div>