質問編集履歴
11
内容について分かりにくかった為、整理し修正させて頂きました。
title
CHANGED
@@ -1,1 +1,1 @@
|
|
1
|
-
【Vue × Firestore】
|
1
|
+
【Vue × Firestore】ブックマーク機能にて「保存」と「削除」と条件に応じて切り替えたい
|
body
CHANGED
@@ -1,69 +1,16 @@
|
|
1
|
-
#
|
1
|
+
#ブックマーク機能にて「保存」と「削除」と条件に応じて切り替えたい
|
2
2
|
|
3
|
-
現状list.vueにて以下のように左下のボタンを用意して、
|
4
|
-
それぞれsaveBookmark()とdeleteBookmark()を作成し、並べている状態です。
|
3
|
+
現状list.vueにて以下のように左下のボタンを用意して、それぞれsaveBookmark()とdeleteBookmark()を作成し、並べている状態です。
|
5
4
|
|
6
5
|

|
7
6
|
|
8
|
-
|
7
|
+
#実際のソース
|
9
|
-
存在したら「削除」と条件分岐させて切替をしたいと考えております。
|
10
8
|
|
11
|
-
```ここに言語を入力
|
12
|
-
<img
|
13
|
-
src="../assets/ブックマーク保存.jpg"
|
14
|
-
alt="ブックマーク"
|
15
|
-
class="bookmark-icon"
|
16
|
-
@click="saveBookmark"
|
17
|
-
v-if="hasBookmark(list)"
|
18
|
-
/>
|
19
|
-
<img
|
20
|
-
src="../assets/ブックマーク未保存.jpg"
|
21
|
-
alt="ブックマーク"
|
22
|
-
class="bookmark-icon"
|
23
|
-
@click="deleteBookmark"
|
24
|
-
v-else
|
25
|
-
/>
|
26
|
-
```
|
27
|
-
|
28
|
-
分かる方いらっしゃいましたらお力添えを頂きたいです。
|
29
|
-
|
30
|
-
よろしくお願いいたします。
|
31
|
-
|
32
|
-
#内容変更
|
33
|
-
|
34
9
|
####bookmark.vue(親コンポーネント)
|
35
10
|
|
36
11
|
```ここに言語を入力
|
37
|
-
<template>
|
38
|
-
<div>
|
39
|
-
<Header />
|
40
|
-
<div class="bookmarkList flex">
|
41
|
-
<h3 class="bookmarkList-title flex">{{ profileData.name }} さんのブックマーク一覧</h3>
|
42
|
-
<hr class="separate" />
|
43
|
-
<div class="bookmarkList-posts">
|
44
|
-
<paginate
|
45
|
-
name="paginate-bookmarkList"
|
46
|
-
tag="ol"
|
47
|
-
:list="bookmarkList"
|
48
|
-
:per="12"
|
49
|
-
v-if="bookmarkList.length !== 0"
|
50
|
-
>
|
51
|
-
|
12
|
+
<List v-for="(list) in paginated('paginate-bookmarkList')" :list="list" :key="list.id" />
|
52
|
-
|
13
|
+
<!-- data内にあるbookmarkList配列から、v-forディレクティブを使って1つずつ要素を取り出し描画。 -->
|
53
|
-
</paginate>
|
54
|
-
<div v-else class="nothing flex">ブックマークされた投稿はありません</div>
|
55
|
-
<paginate-links
|
56
|
-
for="paginate-bookmarkList"
|
57
|
-
name="paginate-bookmarkList"
|
58
|
-
:async="true"
|
59
|
-
class="pagination flex"
|
60
|
-
:show-step-links="true"
|
61
|
-
:style="bookmarkList == '' ? 'display:none;' : 'display:flex;'"
|
62
|
-
></paginate-links>
|
63
|
-
</div>
|
64
|
-
</div>
|
65
|
-
</div>
|
66
|
-
</template>
|
67
14
|
```
|
68
15
|
|
69
16
|
```
|
@@ -274,18 +221,19 @@
|
|
274
221
|
},
|
275
222
|
```
|
276
223
|
|
277
|
-
#追記
|
224
|
+
#追記 「内容整理」
|
278
225
|
|
226
|
+
####⑴bookmark.vueにてブックマークされた一覧を表示する際について。
|
279
|
-
|
227
|
+
ブックマーク保存(savebookmark)する際、投稿(list)のidをサブコレクションのbookmarksへ「postId」としてデータを保存してあげて、
|
228
|
+
そのブックマークされた際に取得した「postId」と投稿時に取得する「id」が一致されたものをブックマーク一覧に表示させています。
|
280
229
|
|
230
|
+
◆投稿時に取得する「id」
|
281
|
-

|
232
|
+
◆ブックマークされた際に取得した「postId」
|
233
|
+

|
282
234
|
|
283
235
|
しかし、以下2点でthis.bookmarkListに追加しているからなのか、一つの投稿をブックマークすると2つの投稿が表示されてしまいます。
|
284
236
|
|
285
|
-
単純に「各ユーザー(ページ内のユーザー)がブックマークしたリスト」を消したらいいのかと思ったのですが、消すと他のユーザーのブックマーク一覧を閲覧した際にそのユーザーのブックマーク一覧を表示するのではなく、ログイン中のユーザーのブックマーク一覧を表示してしまいます・・
|
286
|
-
|
287
|
-
他のユーザーのブックマークを閲覧した際にはそのユーザーのブックマーク一覧を表示して、1枚のみを表示したいです。
|
288
|
-
|
289
237
|
####各ユーザー(ページ内のユーザー)がブックマークしたリスト
|
290
238
|
```ここに言語を入力
|
291
239
|
|
@@ -342,13 +290,76 @@
|
|
342
290
|
}
|
343
291
|
```
|
344
292
|
|
293
|
+
単純に「各ユーザー(ページ内のユーザー)がブックマークしたリスト」を消したらいいのかと思ったのですが、消すと他のユーザーのブックマーク一覧を閲覧した際にそのユーザーのブックマーク一覧を表示するのではなく、ログイン中のユーザーのブックマーク一覧を表示してしまいます・・
|
345
294
|
|
346
|
-
|
295
|
+
他のユーザーのブックマークを閲覧した際にはそのユーザーのブックマーク一覧を表示して、被らずに1枚のみを表示したいです。
|
347
296
|
|
348
|
-
|
297
|
+

|
349
298
|
|
350
|
-
上記データ構造から少し複雑であると指摘がありましたので変更しております・・・が、分からず行き詰まってしまっている状況です。。
|
351
299
|
|
300
|
+
#⑵投稿の中にisBookmarkedとしてブックマークされている投稿かどうかが判定したい。
|
301
|
+
|
302
|
+
※以下赤で囲っている箇所参照
|
303
|
+
|
304
|
+

|
305
|
+
|
306
|
+
ブックマークされている投稿かどうかが判定できる情報「isBookmarked」を一緒に渡してあげているので、listコンポーネント側で、isBookmarkedがtrue,かfalseかで表示を変えてあげようと考えておりますが、以下について悩んでおります。
|
307
|
+
|
308
|
+
propsで子コンポーネントであるlist.vueにデータを渡し、「isBookmarked」がtrue,かfalseか確認すればよろしいのでしょうか。
|
309
|
+
もしくはFirestore内に「isBookmarked」を保存してあげたほうがよいのでしょうか。
|
310
|
+
|
311
|
+
またlist.vue側でどのように「isBookmarked」がtrue,かfalseか判定してあげたらよいのか分からない状況です・・
|
312
|
+
|
313
|
+
#⑶board.vue「投稿一覧」からでもブックマークの「保存」と「削除」を行えるようにしたい
|
314
|
+
|
315
|
+
board.vueコンポーネントでも同様に、ログインしているユーザーのブックマーク一覧から、それに紐づいたpostIdを持つ投稿を取り出してきて、それにisBookmarkedをつけてあげてboard.vue側でもブックマークの保存と削除を行えるようにしたいと考えております。
|
316
|
+
|
317
|
+
```ここに言語を入力
|
318
|
+
export default {
|
319
|
+
data() {
|
320
|
+
return {
|
321
|
+
currentUserBookmarkIds: [],
|
322
|
+
uid: null
|
323
|
+
};
|
324
|
+
},
|
325
|
+
|
326
|
+
//各ユーザーがブックマークしたリスト
|
327
|
+
|
328
|
+
firebase
|
329
|
+
.firestore()
|
330
|
+
.collection("users") //「users」コレクションを参照
|
331
|
+
.doc(this.$route.params.uid) //現在表示中ユーザーを参照
|
332
|
+
.collection("bookmarks") //「bookmarks」サブコレクションを参照
|
333
|
+
.get()
|
334
|
+
.then(snapshot => {
|
335
|
+
snapshot.forEach(doc => {
|
336
|
+
//forEachで全てのドキュメントに対して
|
337
|
+
this.currentUserBookmarkIds.push(doc.data().postId);
|
338
|
+
//「postId」を追加し、this.currentUserBookmarkIdsへ格納
|
339
|
+
});
|
340
|
+
});
|
341
|
+
firebase
|
342
|
+
.firestore()
|
343
|
+
.collection("posts") //「posts」コレクションを参照
|
344
|
+
.orderBy("time", "desc")
|
345
|
+
.get()
|
346
|
+
.then(snapshot => {
|
347
|
+
snapshot.forEach(doc => {
|
348
|
+
//forEachで全てのドキュメントに対して
|
349
|
+
if (this.currentUserBookmarkIds.includes(doc.data().id)) {
|
350
|
+
//this.currentUserBookmarkIdsに「id」が含まれていたら、
|
351
|
+
this.postData.push({
|
352
|
+
isBookmarked: true
|
353
|
+
});
|
354
|
+
//isBookmarkedを追加。
|
355
|
+
}
|
356
|
+
});
|
357
|
+
});
|
358
|
+
}
|
359
|
+
```
|
360
|
+
|
361
|
+
以上bookmark.vueと同様の方法でisBookmarked: trueをpushしてあげようと考えていますが、こちらにつきましても⑵同様にpropsでデータを渡すかFirestore内に保存してあげたらよいのか悩んでいる状況です。
|
362
|
+
|
352
363
|
ご教示頂けると幸いです。。
|
353
364
|
|
354
365
|
よろしくお願いいたします。
|
10
内容変更
title
CHANGED
File without changes
|
body
CHANGED
@@ -43,21 +43,20 @@
|
|
43
43
|
<div class="bookmarkList-posts">
|
44
44
|
<paginate
|
45
45
|
name="paginate-bookmarkList"
|
46
|
-
class="paginate-pctb"
|
47
46
|
tag="ol"
|
48
47
|
:list="bookmarkList"
|
49
48
|
:per="12"
|
50
49
|
v-if="bookmarkList.length !== 0"
|
51
50
|
>
|
52
51
|
<List v-for="(list) in paginated('paginate-bookmarkList')" :list="list" :key="list.id" />
|
53
|
-
<!-- data内
|
52
|
+
<!-- data内にあるbookmarkList配列から、v-forディレクティブを使って1つずつ要素を取り出し描画。 -->
|
54
53
|
</paginate>
|
55
54
|
<div v-else class="nothing flex">ブックマークされた投稿はありません</div>
|
56
55
|
<paginate-links
|
57
56
|
for="paginate-bookmarkList"
|
58
57
|
name="paginate-bookmarkList"
|
59
58
|
:async="true"
|
60
|
-
class="pagination
|
59
|
+
class="pagination flex"
|
61
60
|
:show-step-links="true"
|
62
61
|
:style="bookmarkList == '' ? 'display:none;' : 'display:flex;'"
|
63
62
|
></paginate-links>
|
@@ -74,7 +73,7 @@
|
|
74
73
|
profileData: {},
|
75
74
|
paginate: ["paginate-bookmarkList"],
|
76
75
|
bookmarkList: [],
|
77
|
-
|
76
|
+
currentUserBookmarkIds: [],
|
78
77
|
uid: null
|
79
78
|
};
|
80
79
|
},
|
@@ -112,27 +111,38 @@
|
|
112
111
|
const uid = user.uid;
|
113
112
|
firebase
|
114
113
|
.firestore()
|
115
|
-
.collection("users")
|
114
|
+
.collection("users") //「users」コレクションを参照
|
116
|
-
.doc(uid)
|
115
|
+
.doc(uid) //ログイン中のユーザーを参照
|
117
|
-
.collection("bookmarks")
|
116
|
+
.collection("bookmarks") //「bookmarks」サブコレクションを参照
|
118
117
|
.get()
|
119
118
|
.then(snapshot => {
|
120
119
|
snapshot.forEach(doc => {
|
120
|
+
//forEachで全てのドキュメントに対して
|
121
|
-
this.
|
121
|
+
this.currentUserBookmarkIds.push(doc.data().postId);
|
122
|
+
//「postId」を追加し、this.currentUserBookmarkIdsへ格納
|
122
123
|
});
|
123
124
|
});
|
124
125
|
firebase
|
125
126
|
.firestore()
|
126
|
-
.collection("posts")
|
127
|
+
.collection("posts") //「posts」コレクションを参照
|
127
128
|
.get()
|
128
129
|
.then(snapshot => {
|
129
130
|
snapshot.forEach(doc => {
|
131
|
+
//forEachで全てのドキュメントに対して
|
130
|
-
if (this.
|
132
|
+
if (this.currentUserBookmarkIds.includes(doc.data().id)) {
|
133
|
+
//this.currentUserBookmarkIdsに「id」が含まれていたら、
|
134
|
+
this.bookmarkList.push({
|
135
|
+
...doc.data(),
|
136
|
+
isBookmarked: true
|
137
|
+
});
|
138
|
+
console.log(this.bookmarkList);
|
131
|
-
|
139
|
+
//...doc.data()としてバラした「posts」の投稿データとisBookmarkedを代入。
|
132
140
|
}
|
133
141
|
});
|
134
142
|
});
|
135
143
|
});
|
144
|
+
}
|
145
|
+
};
|
136
146
|
```
|
137
147
|
|
138
148
|
####list.vue(子コンポーネント)
|
@@ -151,7 +161,6 @@
|
|
151
161
|
"
|
152
162
|
/>
|
153
163
|
<h3>{{ list.title }}</h3>
|
154
|
-
{{bookmark}}
|
155
164
|
</div>
|
156
165
|
</div>
|
157
166
|
<div class="face face2 flex">
|
@@ -218,13 +227,13 @@
|
|
218
227
|
|
219
228
|
firebase
|
220
229
|
.firestore()
|
221
|
-
.collection("users")
|
230
|
+
.collection("users") //「users」コレクションを参照
|
222
|
-
.doc(this.$route.params.uid)
|
231
|
+
.doc(this.$route.params.uid) //対象ページのユーザーを参照
|
223
|
-
.collection("bookmarks")
|
232
|
+
.collection("bookmarks") //「bookmarks」サブコレクションを参照
|
224
|
-
.doc(id)
|
233
|
+
.doc(id) //自動生成されたドキュメントIDを参照
|
225
234
|
.set(
|
226
235
|
{
|
227
|
-
postId: this.list.id,
|
236
|
+
postId: this.list.id, //「postId」に投稿データである「this.list.id」を代入。
|
228
237
|
time: firebase.firestore.FieldValue.serverTimestamp()
|
229
238
|
}
|
230
239
|
)
|
@@ -246,7 +255,7 @@
|
|
246
255
|
.collection("users")
|
247
256
|
.doc(this.$route.params.uid)
|
248
257
|
.collection("bookmarks")
|
249
|
-
.doc(this.list.
|
258
|
+
.doc(this.list.postId)
|
250
259
|
.delete()
|
251
260
|
.then(() => {
|
252
261
|
this.$swal("ブックマークを取り消ししました。", {
|
@@ -267,12 +276,73 @@
|
|
267
276
|
|
268
277
|
#追記 「Firestoreのデータ構造を変更しました。」が、わからない点がいくつかある状況です。。
|
269
278
|
|
270
|
-
⑴ブックマーク表示について、ブックマーク保存(savebookmark)する際に、投稿(list)のidをサブコレクションのbookmarksへ「postId」としてデータを保存してあげて、そのブックマークされたidである「postId」と投稿のidである「list.id」が一致されたものをブックマーク一覧に表示させ
|
279
|
+
⑴ブックマーク表示について、ブックマーク保存(savebookmark)する際に、投稿(list)のidをサブコレクションのbookmarksへ「postId」としてデータを保存してあげて、そのブックマークされたidである「postId」と投稿のidである「list.id」が一致されたものをブックマーク一覧に表示させています。
|
271
280
|
|
272
|
-

|
273
282
|
|
274
|
-
|
283
|
+
しかし、以下2点でthis.bookmarkListに追加しているからなのか、一つの投稿をブックマークすると2つの投稿が表示されてしまいます。
|
275
284
|
|
285
|
+
単純に「各ユーザー(ページ内のユーザー)がブックマークしたリスト」を消したらいいのかと思ったのですが、消すと他のユーザーのブックマーク一覧を閲覧した際にそのユーザーのブックマーク一覧を表示するのではなく、ログイン中のユーザーのブックマーク一覧を表示してしまいます・・
|
286
|
+
|
287
|
+
他のユーザーのブックマークを閲覧した際にはそのユーザーのブックマーク一覧を表示して、1枚のみを表示したいです。
|
288
|
+
|
289
|
+
####各ユーザー(ページ内のユーザー)がブックマークしたリスト
|
290
|
+
```ここに言語を入力
|
291
|
+
|
292
|
+
firebase
|
293
|
+
.firestore()
|
294
|
+
.collection("users")
|
295
|
+
.doc(this.$route.params.uid)
|
296
|
+
.collection("bookmarks")
|
297
|
+
.orderBy("time", "desc")
|
298
|
+
.get()
|
299
|
+
.then(snapshot => {
|
300
|
+
snapshot.forEach(doc => {
|
301
|
+
this.bookmarkList.push(doc.data());
|
302
|
+
});
|
303
|
+
});
|
304
|
+
```
|
305
|
+
|
306
|
+
####ログイン中ユーザーがブックマークしたリスト
|
307
|
+
```
|
308
|
+
firebase.auth().onAuthStateChanged(user => {
|
309
|
+
const uid = user.uid;
|
310
|
+
firebase
|
311
|
+
.firestore()
|
312
|
+
.collection("users") //「users」コレクションを参照
|
313
|
+
.doc(uid) //ログイン中のユーザーを参照
|
314
|
+
.collection("bookmarks") //「bookmarks」サブコレクションを参照
|
315
|
+
.get()
|
316
|
+
.then(snapshot => {
|
317
|
+
snapshot.forEach(doc => {
|
318
|
+
//forEachで全てのドキュメントに対して
|
319
|
+
this.currentUserBookmarkIds.push(doc.data().postId);
|
320
|
+
//「postId」を追加し、this.currentUserBookmarkIdsへ格納
|
321
|
+
});
|
322
|
+
});
|
323
|
+
firebase
|
324
|
+
.firestore()
|
325
|
+
.collection("posts") //「posts」コレクションを参照
|
326
|
+
.get()
|
327
|
+
.then(snapshot => {
|
328
|
+
snapshot.forEach(doc => {
|
329
|
+
//forEachで全てのドキュメントに対して
|
330
|
+
if (this.currentUserBookmarkIds.includes(doc.data().id)) {
|
331
|
+
//this.currentUserBookmarkIdsに「id」が含まれていたら、
|
332
|
+
this.bookmarkList.push({
|
333
|
+
...doc.data(),
|
334
|
+
isBookmarked: true
|
335
|
+
});
|
336
|
+
console.log(this.bookmarkList);
|
337
|
+
//...doc.data()としてバラした「posts」の投稿データとisBookmarkedを代入。
|
338
|
+
}
|
339
|
+
});
|
340
|
+
});
|
341
|
+
});
|
342
|
+
}
|
343
|
+
```
|
344
|
+
|
345
|
+
|
276
346
|
⑵listの中にisBookmarkedとしてブックマークされている投稿かどうかが判定できる情報を一緒に渡してあげ、listコンポーネント側で、isBookmarkedがtrue,かfalseかで表示を変えてあげようと考えておりますが、こちらにつきましても実装したいのですがわからず行き詰まっている状況です・・
|
277
347
|
|
278
348
|
⑶board.vueコンポーネントでも同様に、ログインしているユーザーのブックマーク一覧から、それに紐づいたpostIdを持つ投稿を取り出してきて、それにisBookmarkedをつけてあげてboard.vue側でもブックマークの保存と削除を行えるようにしたいと考えております。
|
9
ソースの内容変更
title
CHANGED
File without changes
|
body
CHANGED
@@ -9,19 +9,27 @@
|
|
9
9
|
存在したら「削除」と条件分岐させて切替をしたいと考えております。
|
10
10
|
|
11
11
|
```ここに言語を入力
|
12
|
+
<img
|
12
|
-
|
13
|
+
src="../assets/ブックマーク保存.jpg"
|
14
|
+
alt="ブックマーク"
|
15
|
+
class="bookmark-icon"
|
16
|
+
@click="saveBookmark"
|
17
|
+
v-if="hasBookmark(list)"
|
18
|
+
/>
|
19
|
+
<img
|
13
|
-
|
20
|
+
src="../assets/ブックマーク未保存.jpg"
|
21
|
+
alt="ブックマーク"
|
22
|
+
class="bookmark-icon"
|
23
|
+
@click="deleteBookmark"
|
24
|
+
v-else
|
25
|
+
/>
|
14
26
|
```
|
15
27
|
|
16
|
-
そもそも上記のように並べてFirestoreに存在の有無を確認して表示を切り替えることができるのでしょうか。
|
17
|
-
|
18
28
|
分かる方いらっしゃいましたらお力添えを頂きたいです。
|
19
29
|
|
20
|
-
また、もし他に良いやり方があればご教示いただけると幸いです。
|
21
|
-
|
22
30
|
よろしくお願いいたします。
|
23
31
|
|
24
|
-
#
|
32
|
+
#内容変更
|
25
33
|
|
26
34
|
####bookmark.vue(親コンポーネント)
|
27
35
|
|
@@ -41,12 +49,7 @@
|
|
41
49
|
:per="12"
|
42
50
|
v-if="bookmarkList.length !== 0"
|
43
51
|
>
|
44
|
-
<List
|
45
|
-
|
52
|
+
<List v-for="(list) in paginated('paginate-bookmarkList')" :list="list" :key="list.id" />
|
46
|
-
:list="list"
|
47
|
-
:bookmark="currentUserBookmarkList"
|
48
|
-
:key="list.id"
|
49
|
-
/>
|
50
53
|
<!-- data内のcurrentUserBookmarkList:[]をbindしてpropsでデータを渡す -->
|
51
54
|
</paginate>
|
52
55
|
<div v-else class="nothing flex">ブックマークされた投稿はありません</div>
|
@@ -107,23 +110,29 @@
|
|
107
110
|
//ログイン中ユーザーがブックマークしたリスト
|
108
111
|
firebase.auth().onAuthStateChanged(user => {
|
109
112
|
const uid = user.uid;
|
110
|
-
|
111
113
|
firebase
|
112
114
|
.firestore()
|
113
115
|
.collection("users")
|
114
116
|
.doc(uid)
|
115
117
|
.collection("bookmarks")
|
116
|
-
.orderBy("time", "desc")
|
117
118
|
.get()
|
118
119
|
.then(snapshot => {
|
119
120
|
snapshot.forEach(doc => {
|
120
|
-
this.currentUserBookmarkList.push(doc.
|
121
|
+
this.currentUserBookmarkList.push(doc.postId);
|
121
|
-
console.log(this.currentUserBookmarkList);
|
122
122
|
});
|
123
123
|
});
|
124
|
+
firebase
|
125
|
+
.firestore()
|
126
|
+
.collection("posts")
|
127
|
+
.get()
|
128
|
+
.then(snapshot => {
|
129
|
+
snapshot.forEach(doc => {
|
130
|
+
if (this.currentUserBookmarkList.includes(doc.id)) {
|
131
|
+
this.bookmarkList.push({ ...doc.data(), isBookmarked: true });
|
132
|
+
}
|
133
|
+
});
|
134
|
+
});
|
124
135
|
});
|
125
|
-
}
|
126
|
-
};
|
127
136
|
```
|
128
137
|
|
129
138
|
####list.vue(子コンポーネント)
|
@@ -188,23 +197,8 @@
|
|
188
197
|
index: {
|
189
198
|
type: Number
|
190
199
|
},
|
191
|
-
bookmark: {
|
192
|
-
type: Array
|
193
|
-
}
|
194
200
|
},
|
195
201
|
|
196
|
-
created() {
|
197
|
-
firebase
|
198
|
-
.firestore()
|
199
|
-
.collection("users")
|
200
|
-
.get()
|
201
|
-
.then(snapshot => {
|
202
|
-
snapshot.forEach(doc => {
|
203
|
-
this.userDatas.push(JSON.parse(JSON.stringify(doc.data())));
|
204
|
-
});
|
205
|
-
});
|
206
|
-
},
|
207
|
-
|
208
202
|
methods: {
|
209
203
|
|
210
204
|
~ 省略 ~
|
@@ -214,7 +208,7 @@
|
|
214
208
|
return this.bookmark.some(value => value.id === book.id);
|
215
209
|
},
|
216
210
|
|
217
|
-
|
211
|
+
saveBookmark() {
|
218
212
|
const id = firebase
|
219
213
|
.firestore()
|
220
214
|
.collection("users")
|
@@ -228,11 +222,12 @@
|
|
228
222
|
.doc(this.$route.params.uid)
|
229
223
|
.collection("bookmarks")
|
230
224
|
.doc(id)
|
231
|
-
.set(
|
225
|
+
.set(
|
232
|
-
|
226
|
+
{
|
233
|
-
|
227
|
+
postId: this.list.id,
|
234
|
-
|
228
|
+
time: firebase.firestore.FieldValue.serverTimestamp()
|
235
|
-
|
229
|
+
}
|
230
|
+
)
|
236
231
|
.then(() => {
|
237
232
|
this.$swal("ブックマークに追加しました。", {
|
238
233
|
icon: "success"
|
@@ -268,50 +263,22 @@
|
|
268
263
|
});
|
269
264
|
});
|
270
265
|
},
|
271
|
-
}
|
272
|
-
};
|
273
|
-
</script>
|
274
266
|
```
|
275
267
|
|
276
|
-
#
|
268
|
+
#追記 「Firestoreのデータ構造を変更しました。」が、わからない点がいくつかある状況です。。
|
277
269
|
|
278
|
-
|
270
|
+
⑴ブックマーク表示について、ブックマーク保存(savebookmark)する際に、投稿(list)のidをサブコレクションのbookmarksへ「postId」としてデータを保存してあげて、そのブックマークされたidである「postId」と投稿のidである「list.id」が一致されたものをブックマーク一覧に表示させるようにする。
|
279
271
|
|
280
|
-

|
281
273
|
|
282
|
-
|
274
|
+
現在Firestoreに「postId」は保存できているので「postId」と「list.id」が一致した情報を取得して表示させたいのですが、現状「postId」と「time」のみしか表示されていなく、上手くいかない状況です・・
|
283
275
|
|
284
|
-
|
276
|
+
⑵listの中にisBookmarkedとしてブックマークされている投稿かどうかが判定できる情報を一緒に渡してあげ、listコンポーネント側で、isBookmarkedがtrue,かfalseかで表示を変えてあげようと考えておりますが、こちらにつきましても実装したいのですがわからず行き詰まっている状況です・・
|
285
|
-
const uid = user.uid;
|
286
277
|
|
287
|
-
firebase
|
288
|
-
.firestore()
|
289
|
-
.collection("users")
|
290
|
-
.doc(uid)
|
291
|
-
.collection("bookmarks")
|
292
|
-
.orderBy("time", "desc")
|
293
|
-
.get()
|
294
|
-
.then(snapshot => {
|
295
|
-
snapshot.forEach(doc => {
|
296
|
-
|
278
|
+
⑶board.vueコンポーネントでも同様に、ログインしているユーザーのブックマーク一覧から、それに紐づいたpostIdを持つ投稿を取り出してきて、それにisBookmarkedをつけてあげてboard.vue側でもブックマークの保存と削除を行えるようにしたいと考えております。
|
297
|
-
console.log(this.currentUserBookmarkList);
|
298
|
-
});
|
299
|
-
});
|
300
|
-
});
|
301
|
-
}
|
302
|
-
```
|
303
279
|
|
304
|
-
|
280
|
+
上記データ構造から少し複雑であると指摘がありましたので変更しております・・・が、分からず行き詰まってしまっている状況です。。
|
305
281
|
|
306
|
-
|
282
|
+
ご教示頂けると幸いです。。
|
307
283
|
|
308
|
-
```ここに言語を入力
|
309
|
-
hasBookmark(book) {
|
310
|
-
// ブックマークリスト内にbook idがあればtrue それ以外はfalse
|
311
|
-
return this.bookmark.some(value => value.id === book.id);
|
312
|
-
},
|
313
|
-
```
|
314
|
-
|
315
|
-
原因分かる方いらっしゃいましたらお力添えを頂きたいです。
|
316
|
-
|
317
284
|
よろしくお願いいたします。
|
8
エラーコードにつきましては解決した為、修正
title
CHANGED
File without changes
|
body
CHANGED
@@ -47,8 +47,8 @@
|
|
47
47
|
:bookmark="currentUserBookmarkList"
|
48
48
|
:key="list.id"
|
49
49
|
/>
|
50
|
+
<!-- data内のcurrentUserBookmarkList:[]をbindしてpropsでデータを渡す -->
|
50
51
|
</paginate>
|
51
|
-
|
52
52
|
<div v-else class="nothing flex">ブックマークされた投稿はありません</div>
|
53
53
|
<paginate-links
|
54
54
|
for="paginate-bookmarkList"
|
@@ -62,7 +62,6 @@
|
|
62
62
|
</div>
|
63
63
|
</div>
|
64
64
|
</template>
|
65
|
-
|
66
65
|
```
|
67
66
|
|
68
67
|
```
|
@@ -81,7 +80,7 @@
|
|
81
80
|
List
|
82
81
|
},
|
83
82
|
|
84
|
-
|
83
|
+
created() {
|
85
84
|
firebase
|
86
85
|
.firestore()
|
87
86
|
.collection("users")
|
@@ -91,6 +90,7 @@
|
|
91
90
|
this.profileData = snapshot.data();
|
92
91
|
});
|
93
92
|
|
93
|
+
//各ユーザー(ページ内のユーザー)がブックマークしたリスト
|
94
94
|
firebase
|
95
95
|
.firestore()
|
96
96
|
.collection("users")
|
@@ -104,22 +104,24 @@
|
|
104
104
|
});
|
105
105
|
});
|
106
106
|
|
107
|
+
//ログイン中ユーザーがブックマークしたリスト
|
107
|
-
|
108
|
+
firebase.auth().onAuthStateChanged(user => {
|
108
|
-
|
109
|
+
const uid = user.uid;
|
109
110
|
|
110
|
-
|
111
|
+
firebase
|
111
|
-
|
112
|
+
.firestore()
|
112
|
-
|
113
|
+
.collection("users")
|
113
|
-
|
114
|
+
.doc(uid)
|
114
|
-
|
115
|
+
.collection("bookmarks")
|
115
|
-
|
116
|
+
.orderBy("time", "desc")
|
116
|
-
|
117
|
+
.get()
|
117
|
-
|
118
|
+
.then(snapshot => {
|
118
|
-
|
119
|
+
snapshot.forEach(doc => {
|
119
|
-
|
120
|
+
this.currentUserBookmarkList.push(doc.data());
|
120
|
-
|
121
|
+
console.log(this.currentUserBookmarkList);
|
122
|
+
});
|
121
123
|
});
|
122
|
-
|
124
|
+
});
|
123
125
|
}
|
124
126
|
};
|
125
127
|
```
|
@@ -154,14 +156,14 @@
|
|
154
156
|
alt="ブックマーク"
|
155
157
|
class="bookmark-icon"
|
156
158
|
@click="saveBookmark"
|
157
|
-
|
159
|
+
v-if="hasBookmark(list)"
|
158
160
|
/>
|
159
161
|
<img
|
160
162
|
src="../assets/ブックマーク未保存.jpg"
|
161
163
|
alt="ブックマーク"
|
162
164
|
class="bookmark-icon"
|
163
165
|
@click="deleteBookmark"
|
164
|
-
|
166
|
+
v-else
|
165
167
|
/>
|
166
168
|
<p class="post-time">{{ list.time.toDate().toLocaleString() }}</p>
|
167
169
|
</div>
|
@@ -213,15 +215,13 @@
|
|
213
215
|
},
|
214
216
|
|
215
217
|
saveBookmark() {
|
216
|
-
const
|
218
|
+
const id = firebase
|
217
219
|
.firestore()
|
218
220
|
.collection("users")
|
219
221
|
.doc(this.$route.params.uid)
|
220
222
|
.collection("bookmarks")
|
221
|
-
.doc();
|
223
|
+
.doc().id;
|
222
224
|
|
223
|
-
const id = ref.id;
|
224
|
-
|
225
225
|
firebase
|
226
226
|
.firestore()
|
227
227
|
.collection("users")
|
@@ -273,79 +273,32 @@
|
|
273
273
|
</script>
|
274
274
|
```
|
275
275
|
|
276
|
-
#
|
276
|
+
#bookmark.idを取得できない
|
277
277
|
|
278
|
-

|
279
|
-
|
280
|
-
```ここに言語を入力
|
281
|
-
created hook: "TypeError: Cannot read property 'uid' of null"
|
282
|
-
```
|
283
|
-
作成されたフック: "TypeError:nullのプロパティ 'uid'を読み取れません"とエラーが出てしまい、bookmark.vueへページ遷移した場合、上記画像のように「this.currentUserBookmarkList」内のデータが取得できておりますが、リロードするとデータが反映されなくなってしまいます。
|
284
|
-
|
285
|
-
原因は以下「currentUser.uid」を取得しているのですが、リロードしてしまうと「currentUser.uid」が取得する前にcreated()内を処理してしまうのか「currentUser.uid」を取得できないようです。
|
286
|
-
|
287
|
-
```ここに言語を入力
|
288
|
-
const currentUser = firebase.auth().currentUser;
|
289
|
-
const uid = currentUser.uid;
|
290
|
-
```
|
291
|
-
|
292
|
-
####試したこと
|
293
|
-
|
294
|
-
created()内で宣言しているのが原因かと思い、mounted()内で宣言しユーザー認証される前にuidを参照してしまっているようなので「firebase.auth().onAuthStateChanged」内でコードを記述し試してみましたが以下のエラーが出ます・・
|
295
|
-
|
296
|
-
```ここに言語を入力
|
297
|
-
Uncaught (in promise) TypeError: Cannot read property 'push' of undefined
|
298
|
-
```
|
299
|
-
Uncaught(in promise)TypeError:undefinedのプロパティ 'push'を読み取ることができません
|
300
|
-
|
301
|
-
```ここに言語を入力
|
302
|
-
mounted() {
|
303
|
-
firebase.auth().onAuthStateChanged(function(currentUser) {
|
304
|
-
if (currentUser) {
|
305
|
-
const currentUser = firebase.auth().currentUser;
|
306
|
-
const uid = currentUser.uid;
|
307
|
-
|
308
|
-
firebase
|
309
|
-
.firestore()
|
310
|
-
.collection("users")
|
311
|
-
.doc(uid)
|
312
|
-
.collection("bookmarks")
|
313
|
-
.orderBy("time", "desc")
|
314
|
-
.get()
|
315
|
-
.then(snapshot => {
|
316
|
-
snapshot.forEach(doc => {
|
317
|
-
this.currentUserBookmarkList.push(doc.data());
|
318
|
-
// console.log(this.currentUserBookmarkList);
|
319
|
-
});
|
320
|
-
});
|
321
|
-
}
|
322
|
-
});
|
323
|
-
}
|
324
|
-
```
|
325
|
-
|
326
|
-
#⑵bookmark.idを取得できない
|
327
|
-
|
328
278
|
以下画像の青で囲っているようにbookmarkのidは取得できているので、子コンポーネントであるlist.vueにてpropsで親より受けた「bookmark」を使って{{bookmark.id}}としてもbookmarkのidが取得できません・・・
|
329
279
|
|
330
280
|

|
331
281
|
|
332
282
|
```ここに言語を入力
|
333
|
-
const currentUser = firebase.auth().currentUser;
|
334
|
-
const uid = currentUser.uid;
|
335
283
|
|
284
|
+
firebase.auth().onAuthStateChanged(user => {
|
285
|
+
const uid = user.uid;
|
286
|
+
|
336
|
-
|
287
|
+
firebase
|
337
|
-
|
288
|
+
.firestore()
|
338
|
-
|
289
|
+
.collection("users")
|
339
|
-
|
290
|
+
.doc(uid)
|
340
|
-
|
291
|
+
.collection("bookmarks")
|
341
|
-
|
292
|
+
.orderBy("time", "desc")
|
342
|
-
|
293
|
+
.get()
|
343
|
-
|
294
|
+
.then(snapshot => {
|
344
|
-
|
295
|
+
snapshot.forEach(doc => {
|
345
|
-
|
296
|
+
this.currentUserBookmarkList.push(doc.data());
|
346
|
-
|
297
|
+
console.log(this.currentUserBookmarkList);
|
298
|
+
});
|
347
299
|
});
|
348
|
-
|
300
|
+
});
|
301
|
+
}
|
349
302
|
```
|
350
303
|
|
351
304
|
---
|
7
内容修正
title
CHANGED
File without changes
|
body
CHANGED
@@ -348,6 +348,8 @@
|
|
348
348
|
});
|
349
349
|
```
|
350
350
|
|
351
|
+
---
|
352
|
+
|
351
353
|
以下より「book.id」は取得できていることを確認できているので、後「bookmark.id」を取得できれば本件実装できるかと思われますが行き詰まってしまいました・・
|
352
354
|
|
353
355
|
```ここに言語を入力
|
6
再度追記1追加
title
CHANGED
File without changes
|
body
CHANGED
@@ -23,7 +23,7 @@
|
|
23
23
|
|
24
24
|
#追記1
|
25
25
|
|
26
|
-
####bookmark.vue
|
26
|
+
####bookmark.vue(親コンポーネント)
|
27
27
|
|
28
28
|
```ここに言語を入力
|
29
29
|
<template>
|
@@ -124,7 +124,7 @@
|
|
124
124
|
};
|
125
125
|
```
|
126
126
|
|
127
|
-
####list.vue
|
127
|
+
####list.vue(子コンポーネント)
|
128
128
|
|
129
129
|
```ここに言語を入力
|
130
130
|
<template>
|
@@ -282,7 +282,7 @@
|
|
282
282
|
```
|
283
283
|
作成されたフック: "TypeError:nullのプロパティ 'uid'を読み取れません"とエラーが出てしまい、bookmark.vueへページ遷移した場合、上記画像のように「this.currentUserBookmarkList」内のデータが取得できておりますが、リロードするとデータが反映されなくなってしまいます。
|
284
284
|
|
285
|
-
原因は以下「currentUser.uid」を取得しているのですが、リロードしてしまうと「currentUser.uid」が取得できないようです。
|
285
|
+
原因は以下「currentUser.uid」を取得しているのですが、リロードしてしまうと「currentUser.uid」が取得する前にcreated()内を処理してしまうのか「currentUser.uid」を取得できないようです。
|
286
286
|
|
287
287
|
```ここに言語を入力
|
288
288
|
const currentUser = firebase.auth().currentUser;
|
5
内容修正
title
CHANGED
File without changes
|
body
CHANGED
@@ -23,41 +23,9 @@
|
|
23
23
|
|
24
24
|
#追記1
|
25
25
|
|
26
|
+
####bookmark.vue
|
26
27
|
|
27
28
|
```ここに言語を入力
|
28
|
-
vue.runtime.esm.js?2b0e:619 [Vue warn]: Missing required prop: "bookmarkList"
|
29
|
-
|
30
|
-
found in
|
31
|
-
|
32
|
-
---> <List>
|
33
|
-
<Paginate>
|
34
|
-
<Anonymous>
|
35
|
-
<App> at src/App.vue
|
36
|
-
<Root>
|
37
|
-
```
|
38
|
-
|
39
|
-

|
40
|
-
|
41
|
-
#追記2
|
42
|
-
|
43
|
-
色々調べておりましたら親から子へデータをpropsで渡す際に
|
44
|
-
|
45
|
-
```
|
46
|
-
<List v-for="(list) in paginated('paginate-bookmarkList')" :list="list" :bookmarkList="bookmarklist" :key="list.id"/>
|
47
|
-
```
|
48
|
-
|
49
|
-
としておりましたが、子で受ける際はキャメルケースでは「undefined」となるようなので以下のようにしました。
|
50
|
-
|
51
|
-
```
|
52
|
-
<List v-for="(list) in paginated('paginate-bookmarkList')" :list="list" :bookmark="bookmarklist" :key="list.id"/>
|
53
|
-
```
|
54
|
-
|
55
|
-
参考記事:[【Vue.js】propsで子コンポーネントにデータが渡らないのはHTMLの命名規則が原因だった](https://qiita.com/_Keitaro_/items/f77d2340f9390f028677)
|
56
|
-
|
57
|
-
|
58
|
-
#bookmark.vue
|
59
|
-
|
60
|
-
```
|
61
29
|
<template>
|
62
30
|
<div>
|
63
31
|
<Header />
|
@@ -70,16 +38,17 @@
|
|
70
38
|
class="paginate-pctb"
|
71
39
|
tag="ol"
|
72
40
|
:list="bookmarkList"
|
73
|
-
:per="
|
41
|
+
:per="12"
|
74
42
|
v-if="bookmarkList.length !== 0"
|
75
43
|
>
|
76
44
|
<List
|
77
45
|
v-for="(list) in paginated('paginate-bookmarkList')"
|
78
46
|
:list="list"
|
79
|
-
:bookmark="
|
47
|
+
:bookmark="currentUserBookmarkList"
|
80
48
|
:key="list.id"
|
81
49
|
/>
|
82
50
|
</paginate>
|
51
|
+
|
83
52
|
<div v-else class="nothing flex">ブックマークされた投稿はありません</div>
|
84
53
|
<paginate-links
|
85
54
|
for="paginate-bookmarkList"
|
@@ -88,30 +57,74 @@
|
|
88
57
|
class="pagination paginate-pctb flex"
|
89
58
|
:show-step-links="true"
|
90
59
|
:style="bookmarkList == '' ? 'display:none;' : 'display:flex;'"
|
91
|
-
></paginate-links>
|
60
|
+
></paginate-links>
|
92
61
|
</div>
|
93
62
|
</div>
|
94
63
|
</div>
|
95
64
|
</template>
|
65
|
+
|
96
66
|
```
|
97
67
|
|
98
68
|
```
|
99
69
|
export default {
|
100
70
|
data() {
|
101
|
-
return
|
71
|
+
return {
|
72
|
+
profileData: {},
|
102
73
|
paginate: ["paginate-bookmarkList"],
|
103
|
-
bookmarkList: []
|
74
|
+
bookmarkList: [],
|
75
|
+
currentUserBookmarkList: [],
|
76
|
+
uid: null
|
104
77
|
};
|
105
78
|
},
|
106
79
|
components: {
|
107
80
|
Header,
|
108
81
|
List
|
109
82
|
},
|
83
|
+
|
84
|
+
created() {
|
85
|
+
firebase
|
86
|
+
.firestore()
|
87
|
+
.collection("users")
|
88
|
+
.doc(this.$route.params.uid)
|
89
|
+
.get()
|
90
|
+
.then(snapshot => {
|
91
|
+
this.profileData = snapshot.data();
|
92
|
+
});
|
93
|
+
|
94
|
+
firebase
|
95
|
+
.firestore()
|
96
|
+
.collection("users")
|
97
|
+
.doc(this.$route.params.uid)
|
98
|
+
.collection("bookmarks")
|
99
|
+
.orderBy("time", "desc")
|
100
|
+
.get()
|
101
|
+
.then(snapshot => {
|
102
|
+
snapshot.forEach(doc => {
|
103
|
+
this.bookmarkList.push(doc.data());
|
104
|
+
});
|
105
|
+
});
|
106
|
+
|
107
|
+
const currentUser = firebase.auth().currentUser;
|
108
|
+
const uid = currentUser.uid;
|
109
|
+
|
110
|
+
firebase
|
111
|
+
.firestore()
|
112
|
+
.collection("users")
|
113
|
+
.doc(uid)
|
114
|
+
.collection("bookmarks")
|
115
|
+
.orderBy("time", "desc")
|
116
|
+
.get()
|
117
|
+
.then(snapshot => {
|
118
|
+
snapshot.forEach(doc => {
|
119
|
+
this.currentUserBookmarkList.push(doc.data());
|
120
|
+
// console.log(this.currentUserBookmarkList);
|
121
|
+
});
|
122
|
+
});
|
123
|
+
}
|
110
124
|
};
|
111
|
-
</script>
|
112
125
|
```
|
113
126
|
|
114
|
-
#list.vue
|
127
|
+
####list.vue
|
115
128
|
|
116
129
|
```ここに言語を入力
|
117
130
|
<template>
|
@@ -127,6 +140,7 @@
|
|
127
140
|
"
|
128
141
|
/>
|
129
142
|
<h3>{{ list.title }}</h3>
|
143
|
+
{{bookmark}}
|
130
144
|
</div>
|
131
145
|
</div>
|
132
146
|
<div class="face face2 flex">
|
@@ -140,12 +154,14 @@
|
|
140
154
|
alt="ブックマーク"
|
141
155
|
class="bookmark-icon"
|
142
156
|
@click="saveBookmark"
|
157
|
+
|
143
158
|
/>
|
144
159
|
<img
|
145
160
|
src="../assets/ブックマーク未保存.jpg"
|
146
161
|
alt="ブックマーク"
|
147
162
|
class="bookmark-icon"
|
148
163
|
@click="deleteBookmark"
|
164
|
+
|
149
165
|
/>
|
150
166
|
<p class="post-time">{{ list.time.toDate().toLocaleString() }}</p>
|
151
167
|
</div>
|
@@ -159,29 +175,42 @@
|
|
159
175
|
data() {
|
160
176
|
return {
|
161
177
|
bookmarkId: "",
|
178
|
+
userDatas: [],
|
162
179
|
preview: require("../assets/デフォルト画像.jpg")
|
163
180
|
};
|
164
181
|
},
|
165
182
|
props: {
|
166
183
|
list: {
|
167
|
-
type: Object
|
184
|
+
type: Object
|
168
|
-
required: true
|
169
185
|
},
|
170
186
|
index: {
|
171
187
|
type: Number
|
172
188
|
},
|
173
189
|
bookmark: {
|
174
|
-
type:
|
190
|
+
type: Array
|
175
|
-
required: true,
|
176
|
-
default:() => {}, //修正箇所
|
177
191
|
}
|
178
192
|
},
|
179
193
|
|
194
|
+
created() {
|
195
|
+
firebase
|
196
|
+
.firestore()
|
197
|
+
.collection("users")
|
198
|
+
.get()
|
199
|
+
.then(snapshot => {
|
200
|
+
snapshot.forEach(doc => {
|
201
|
+
this.userDatas.push(JSON.parse(JSON.stringify(doc.data())));
|
202
|
+
});
|
203
|
+
});
|
204
|
+
},
|
205
|
+
|
180
206
|
methods: {
|
181
207
|
|
208
|
+
~ 省略 ~
|
209
|
+
|
182
|
-
hasBookmark(book) {
|
210
|
+
hasBookmark(book) {
|
211
|
+
// ブックマークリスト内にbook idがあればtrue それ以外はfalse
|
183
212
|
return this.bookmark.some(value => value.id === book.id);
|
184
|
-
|
213
|
+
},
|
185
214
|
|
186
215
|
saveBookmark() {
|
187
216
|
const ref = firebase
|
@@ -238,11 +267,96 @@
|
|
238
267
|
icon: "error"
|
239
268
|
});
|
240
269
|
});
|
270
|
+
},
|
241
|
-
|
271
|
+
}
|
242
272
|
};
|
243
273
|
</script>
|
244
274
|
```
|
245
275
|
|
246
|
-
#エラーコード
|
276
|
+
####⑴エラーコード
|
247
277
|
|
278
|
+

|
279
|
+
|
280
|
+
```ここに言語を入力
|
281
|
+
created hook: "TypeError: Cannot read property 'uid' of null"
|
282
|
+
```
|
283
|
+
作成されたフック: "TypeError:nullのプロパティ 'uid'を読み取れません"とエラーが出てしまい、bookmark.vueへページ遷移した場合、上記画像のように「this.currentUserBookmarkList」内のデータが取得できておりますが、リロードするとデータが反映されなくなってしまいます。
|
284
|
+
|
285
|
+
原因は以下「currentUser.uid」を取得しているのですが、リロードしてしまうと「currentUser.uid」が取得できないようです。
|
286
|
+
|
287
|
+
```ここに言語を入力
|
288
|
+
const currentUser = firebase.auth().currentUser;
|
289
|
+
const uid = currentUser.uid;
|
290
|
+
```
|
291
|
+
|
292
|
+
####試したこと
|
293
|
+
|
294
|
+
created()内で宣言しているのが原因かと思い、mounted()内で宣言しユーザー認証される前にuidを参照してしまっているようなので「firebase.auth().onAuthStateChanged」内でコードを記述し試してみましたが以下のエラーが出ます・・
|
295
|
+
|
296
|
+
```ここに言語を入力
|
297
|
+
Uncaught (in promise) TypeError: Cannot read property 'push' of undefined
|
298
|
+
```
|
299
|
+
Uncaught(in promise)TypeError:undefinedのプロパティ 'push'を読み取ることができません
|
300
|
+
|
301
|
+
```ここに言語を入力
|
302
|
+
mounted() {
|
303
|
+
firebase.auth().onAuthStateChanged(function(currentUser) {
|
304
|
+
if (currentUser) {
|
305
|
+
const currentUser = firebase.auth().currentUser;
|
306
|
+
const uid = currentUser.uid;
|
307
|
+
|
308
|
+
firebase
|
309
|
+
.firestore()
|
310
|
+
.collection("users")
|
311
|
+
.doc(uid)
|
312
|
+
.collection("bookmarks")
|
313
|
+
.orderBy("time", "desc")
|
314
|
+
.get()
|
315
|
+
.then(snapshot => {
|
316
|
+
snapshot.forEach(doc => {
|
317
|
+
this.currentUserBookmarkList.push(doc.data());
|
318
|
+
// console.log(this.currentUserBookmarkList);
|
319
|
+
});
|
320
|
+
});
|
321
|
+
}
|
322
|
+
});
|
323
|
+
}
|
324
|
+
```
|
325
|
+
|
326
|
+
#⑵bookmark.idを取得できない
|
327
|
+
|
328
|
+
以下画像の青で囲っているようにbookmarkのidは取得できているので、子コンポーネントであるlist.vueにてpropsで親より受けた「bookmark」を使って{{bookmark.id}}としてもbookmarkのidが取得できません・・・
|
329
|
+
|
248
|
-

|
331
|
+
|
332
|
+
```ここに言語を入力
|
333
|
+
const currentUser = firebase.auth().currentUser;
|
334
|
+
const uid = currentUser.uid;
|
335
|
+
|
336
|
+
firebase
|
337
|
+
.firestore()
|
338
|
+
.collection("users")
|
339
|
+
.doc(uid)
|
340
|
+
.collection("bookmarks")
|
341
|
+
.orderBy("time", "desc")
|
342
|
+
.get()
|
343
|
+
.then(snapshot => {
|
344
|
+
snapshot.forEach(doc => {
|
345
|
+
this.currentUserBookmarkList.push(doc.data());
|
346
|
+
console.log(this.currentUserBookmarkList);
|
347
|
+
});
|
348
|
+
});
|
349
|
+
```
|
350
|
+
|
351
|
+
以下より「book.id」は取得できていることを確認できているので、後「bookmark.id」を取得できれば本件実装できるかと思われますが行き詰まってしまいました・・
|
352
|
+
|
353
|
+
```ここに言語を入力
|
354
|
+
hasBookmark(book) {
|
355
|
+
// ブックマークリスト内にbook idがあればtrue それ以外はfalse
|
356
|
+
return this.bookmark.some(value => value.id === book.id);
|
357
|
+
},
|
358
|
+
```
|
359
|
+
|
360
|
+
原因分かる方いらっしゃいましたらお力添えを頂きたいです。
|
361
|
+
|
362
|
+
よろしくお願いいたします。
|
4
内容変更、追記
title
CHANGED
File without changes
|
body
CHANGED
@@ -20,108 +20,44 @@
|
|
20
20
|
また、もし他に良いやり方があればご教示いただけると幸いです。
|
21
21
|
|
22
22
|
よろしくお願いいたします。
|
23
|
-
#list.vue
|
24
23
|
|
24
|
+
#追記1
|
25
|
+
|
26
|
+
|
25
27
|
```ここに言語を入力
|
28
|
+
vue.runtime.esm.js?2b0e:619 [Vue warn]: Missing required prop: "bookmarkList"
|
29
|
+
|
30
|
+
found in
|
31
|
+
|
32
|
+
---> <List>
|
26
|
-
<
|
33
|
+
<Paginate>
|
27
|
-
<div class="list">
|
28
|
-
<div class="face face1 flex">
|
29
|
-
<div class="content">
|
30
|
-
<img
|
31
|
-
class="profile-icon"
|
32
|
-
width="50"
|
33
|
-
height="50"
|
34
|
-
:src="
|
35
|
-
returnUserData() ? returnUserData().uploadedImage.fileUrl : preview
|
36
|
-
"
|
37
|
-
/>
|
38
|
-
<h3>{{ list.title }}</h3>
|
39
|
-
|
34
|
+
<Anonymous>
|
35
|
+
<App> at src/App.vue
|
40
|
-
|
36
|
+
<Root>
|
41
|
-
<div class="face face2 flex">
|
42
|
-
<div class="content flex">
|
43
|
-
<button class="hide-btn" @click="deletePost">×</button>
|
44
|
-
<p>{{ list.description }}</p>
|
45
|
-
<router-link :to="`/chat/${list.id}`" class="join-btn flex">ルームへ参加</router-link>
|
46
|
-
<!-- 「list.id」propsで親コンポーネントから取得したidを取得。-->
|
47
|
-
<img src="../assets/ブックマーク保存.jpg" alt="ブックマーク" class="bookmark-icon" @click="saveBookmark" />
|
48
|
-
<img
|
49
|
-
src="../assets/ブックマーク未保存.jpg"
|
50
|
-
alt="ブックマーク"
|
51
|
-
class="bookmark-icon"
|
52
|
-
@click="deleteBookmark"
|
53
|
-
/>
|
54
|
-
<p class="post-time">{{ list.time.toDate().toLocaleString() }}</p>
|
55
|
-
</div>
|
56
|
-
</div>
|
57
|
-
</div>
|
58
|
-
</template>
|
59
37
|
```
|
60
38
|
|
61
|
-
```ここに言語を入力
|
62
|
-
|
39
|
+

|
63
40
|
|
64
|
-
saveBookmark() {
|
65
|
-
const ref = firebase
|
66
|
-
.firestore()
|
67
|
-
.collection("users")
|
68
|
-
.doc(this.$route.params.uid)
|
69
|
-
.collection("bookmarks")
|
70
|
-
|
41
|
+
#追記2
|
71
42
|
|
72
|
-
|
43
|
+
色々調べておりましたら親から子へデータをpropsで渡す際に
|
73
44
|
|
74
|
-
firebase
|
75
|
-
.firestore()
|
76
|
-
.collection("users")
|
77
|
-
.doc(this.$route.params.uid)
|
78
|
-
.collection("bookmarks")
|
79
|
-
.doc(id)
|
80
|
-
.set({
|
81
|
-
bookmarkId: id,
|
82
|
-
...this.list,
|
83
|
-
time: firebase.firestore.FieldValue.serverTimestamp()
|
84
|
-
})
|
85
|
-
.then(() => {
|
86
|
-
this.$swal("ブックマークに追加しました。", {
|
87
|
-
icon: "success"
|
88
|
-
|
45
|
+
```
|
89
|
-
})
|
90
|
-
.catch(() => {
|
91
|
-
|
46
|
+
<List v-for="(list) in paginated('paginate-bookmarkList')" :list="list" :bookmarkList="bookmarklist" :key="list.id"/>
|
92
|
-
icon: "error"
|
93
|
-
|
47
|
+
```
|
94
|
-
});
|
95
|
-
},
|
96
48
|
|
97
|
-
deleteBookmark() {
|
98
|
-
firebase
|
99
|
-
.firestore()
|
100
|
-
.collection("users")
|
101
|
-
.doc(this.$route.params.uid)
|
102
|
-
.collection("bookmarks")
|
103
|
-
.doc(this.list.bookmarkId)
|
104
|
-
.delete()
|
105
|
-
.then(() => {
|
106
|
-
this.$swal("ブックマークを取り消ししました。", {
|
107
|
-
icon: "success"
|
108
|
-
});
|
109
|
-
this.$router.go({
|
110
|
-
|
49
|
+
としておりましたが、子で受ける際はキャメルケースでは「undefined」となるようなので以下のようにしました。
|
111
|
-
|
50
|
+
|
112
|
-
});
|
113
|
-
})
|
114
|
-
.catch(() => {
|
115
|
-
this.$swal("ブックマークを取り消し出来ません。", {
|
116
|
-
icon: "error"
|
117
|
-
});
|
118
|
-
});
|
119
|
-
},
|
120
51
|
```
|
52
|
+
<List v-for="(list) in paginated('paginate-bookmarkList')" :list="list" :bookmark="bookmarklist" :key="list.id"/>
|
53
|
+
```
|
121
54
|
|
55
|
+
参考記事:[【Vue.js】propsで子コンポーネントにデータが渡らないのはHTMLの命名規則が原因だった](https://qiita.com/_Keitaro_/items/f77d2340f9390f028677)
|
56
|
+
|
57
|
+
|
122
58
|
#bookmark.vue
|
123
59
|
|
124
|
-
```
|
60
|
+
```
|
125
61
|
<template>
|
126
62
|
<div>
|
127
63
|
<Header />
|
@@ -129,7 +65,6 @@
|
|
129
65
|
<h3 class="bookmarkList-title flex">{{ profileData.name }} さんのブックマーク一覧</h3>
|
130
66
|
<hr class="separate" />
|
131
67
|
<div class="bookmarkList-posts">
|
132
|
-
<!-- PC・タブレット用ページネーション -->
|
133
68
|
<paginate
|
134
69
|
name="paginate-bookmarkList"
|
135
70
|
class="paginate-pctb"
|
@@ -138,9 +73,13 @@
|
|
138
73
|
:per="3"
|
139
74
|
v-if="bookmarkList.length !== 0"
|
140
75
|
>
|
76
|
+
<List
|
141
|
-
|
77
|
+
v-for="(list) in paginated('paginate-bookmarkList')"
|
78
|
+
:list="list"
|
79
|
+
:bookmark="bookmarklist"
|
80
|
+
:key="list.id"
|
81
|
+
/>
|
142
82
|
</paginate>
|
143
|
-
|
144
83
|
<div v-else class="nothing flex">ブックマークされた投稿はありません</div>
|
145
84
|
<paginate-links
|
146
85
|
for="paginate-bookmarkList"
|
@@ -149,7 +88,7 @@
|
|
149
88
|
class="pagination paginate-pctb flex"
|
150
89
|
:show-step-links="true"
|
151
90
|
:style="bookmarkList == '' ? 'display:none;' : 'display:flex;'"
|
152
|
-
></paginate-links>
|
91
|
+
></paginate-links>
|
153
92
|
</div>
|
154
93
|
</div>
|
155
94
|
</div>
|
@@ -157,18 +96,9 @@
|
|
157
96
|
```
|
158
97
|
|
159
98
|
```
|
160
|
-
<script>
|
161
|
-
import firebase from "firebase";
|
162
|
-
import Header from "@/components/header.vue";
|
163
|
-
import List from "@/components/list.vue";
|
164
|
-
import Vue from "vue";
|
165
|
-
import VuePaginate from "vue-paginate";
|
166
|
-
Vue.use(VuePaginate);
|
167
|
-
|
168
99
|
export default {
|
169
100
|
data() {
|
170
|
-
return
|
101
|
+
return
|
171
|
-
profileData: {},
|
172
102
|
paginate: ["paginate-bookmarkList"],
|
173
103
|
bookmarkList: []
|
174
104
|
};
|
@@ -177,77 +107,13 @@
|
|
177
107
|
Header,
|
178
108
|
List
|
179
109
|
},
|
180
|
-
|
181
|
-
created() {
|
182
|
-
firebase
|
183
|
-
.firestore()
|
184
|
-
.collection("users")
|
185
|
-
.doc(this.$route.params.uid)
|
186
|
-
.get()
|
187
|
-
.then(snapshot => {
|
188
|
-
this.profileData = snapshot.data();
|
189
|
-
});
|
190
|
-
|
191
|
-
firebase
|
192
|
-
.firestore()
|
193
|
-
.collection("users")
|
194
|
-
.doc(this.$route.params.uid)
|
195
|
-
.collection("bookmarks")
|
196
|
-
.orderBy("time", "desc")
|
197
|
-
.get()
|
198
|
-
.then(snapshot => {
|
199
|
-
snapshot.forEach(doc => {
|
200
|
-
this.bookmarkList.push(doc.data());
|
201
|
-
});
|
202
|
-
});
|
203
|
-
}
|
204
110
|
};
|
205
111
|
</script>
|
206
112
|
```
|
207
113
|
|
208
|
-
#
|
114
|
+
#list.vue
|
209
115
|
|
210
|
-
####bookmark.vue
|
211
|
-
|
212
116
|
```ここに言語を入力
|
213
|
-
<div class="bookmarkList-posts">
|
214
|
-
<!-- PC・タブレット用ページネーション -->
|
215
|
-
<paginate
|
216
|
-
name="paginate-bookmarkList"
|
217
|
-
class="paginate-pctb"
|
218
|
-
tag="ol"
|
219
|
-
:list="bookmarkList"
|
220
|
-
:per="3"
|
221
|
-
v-if="bookmarkList.length !== 0"
|
222
|
-
>
|
223
|
-
<List
|
224
|
-
v-for="(list) in paginated('paginate-bookmarkList')"
|
225
|
-
:list="list"
|
226
|
-
:bookmarkList="bookmarkList"
|
227
|
-
:key="list.id"
|
228
|
-
/>
|
229
|
-
</paginate>
|
230
|
-
```
|
231
|
-
|
232
|
-
```ここに言語を入力
|
233
|
-
|
234
|
-
export default {
|
235
|
-
data() {
|
236
|
-
return {
|
237
|
-
profileData: {},
|
238
|
-
paginate: ["paginate-bookmarkList"],
|
239
|
-
bookmarkList: []
|
240
|
-
};
|
241
|
-
},
|
242
|
-
components: {
|
243
|
-
Header,
|
244
|
-
List
|
245
|
-
},
|
246
|
-
```
|
247
|
-
|
248
|
-
####list.vue
|
249
|
-
|
250
|
-
```ここに言語を入力
|
251
117
|
<template>
|
252
118
|
<div class="list">
|
253
119
|
<div class="face face1 flex">
|
@@ -261,7 +127,6 @@
|
|
261
127
|
"
|
262
128
|
/>
|
263
129
|
<h3>{{ list.title }}</h3>
|
264
|
-
{{bookmarkList}}
|
265
130
|
</div>
|
266
131
|
</div>
|
267
132
|
<div class="face face2 flex">
|
@@ -294,7 +159,6 @@
|
|
294
159
|
data() {
|
295
160
|
return {
|
296
161
|
bookmarkId: "",
|
297
|
-
userDatas: [],
|
298
162
|
preview: require("../assets/デフォルト画像.jpg")
|
299
163
|
};
|
300
164
|
},
|
@@ -306,23 +170,79 @@
|
|
306
170
|
index: {
|
307
171
|
type: Number
|
308
172
|
},
|
309
|
-
|
173
|
+
bookmark: {
|
310
|
-
type:
|
174
|
+
type: Object,
|
311
|
-
required: true
|
175
|
+
required: true,
|
176
|
+
default:() => {}, //修正箇所
|
312
177
|
}
|
313
178
|
},
|
314
|
-
```
|
315
179
|
|
316
|
-
|
180
|
+
methods: {
|
317
|
-
vue.runtime.esm.js?2b0e:619 [Vue warn]: Missing required prop: "bookmarkList"
|
318
181
|
|
319
|
-
|
182
|
+
hasBookmark(book) { //追加
|
183
|
+
return this.bookmark.some(value => value.id === book.id);
|
184
|
+
},
|
320
185
|
|
186
|
+
saveBookmark() {
|
187
|
+
const ref = firebase
|
188
|
+
.firestore()
|
189
|
+
.collection("users")
|
190
|
+
.doc(this.$route.params.uid)
|
191
|
+
.collection("bookmarks")
|
192
|
+
.doc();
|
193
|
+
|
321
|
-
|
194
|
+
const id = ref.id;
|
195
|
+
|
196
|
+
firebase
|
197
|
+
.firestore()
|
198
|
+
.collection("users")
|
199
|
+
.doc(this.$route.params.uid)
|
200
|
+
.collection("bookmarks")
|
201
|
+
.doc(id)
|
202
|
+
.set({
|
203
|
+
bookmarkId: id,
|
204
|
+
...this.list,
|
205
|
+
time: firebase.firestore.FieldValue.serverTimestamp()
|
206
|
+
})
|
322
|
-
|
207
|
+
.then(() => {
|
208
|
+
this.$swal("ブックマークに追加しました。", {
|
209
|
+
icon: "success"
|
210
|
+
});
|
211
|
+
})
|
212
|
+
.catch(() => {
|
213
|
+
this.$swal("ブックマークを追加出来ません。", {
|
214
|
+
icon: "error"
|
215
|
+
});
|
216
|
+
});
|
217
|
+
},
|
218
|
+
|
219
|
+
deleteBookmark() {
|
220
|
+
firebase
|
221
|
+
.firestore()
|
222
|
+
.collection("users")
|
223
|
+
.doc(this.$route.params.uid)
|
224
|
+
.collection("bookmarks")
|
225
|
+
.doc(this.list.bookmarkId)
|
226
|
+
.delete()
|
227
|
+
.then(() => {
|
228
|
+
this.$swal("ブックマークを取り消ししました。", {
|
229
|
+
icon: "success"
|
230
|
+
});
|
231
|
+
this.$router.go({
|
232
|
+
path: `/bookmark/${this.$route.params.uid}`,
|
233
|
+
force: true
|
234
|
+
});
|
235
|
+
})
|
236
|
+
.catch(() => {
|
237
|
+
this.$swal("ブックマークを取り消し出来ません。", {
|
238
|
+
icon: "error"
|
239
|
+
});
|
240
|
+
});
|
241
|
+
}
|
242
|
+
};
|
323
|
-
|
243
|
+
</script>
|
324
|
-
<App> at src/App.vue
|
325
|
-
<Root>
|
326
244
|
```
|
327
245
|
|
246
|
+
#エラーコード
|
247
|
+
|
328
|
-

|
3
画像追加
title
CHANGED
File without changes
|
body
CHANGED
@@ -323,4 +323,6 @@
|
|
323
323
|
<Anonymous>
|
324
324
|
<App> at src/App.vue
|
325
325
|
<Root>
|
326
|
-
```
|
326
|
+
```
|
327
|
+
|
328
|
+

|
2
追記1追加
title
CHANGED
File without changes
|
body
CHANGED
@@ -203,4 +203,124 @@
|
|
203
203
|
}
|
204
204
|
};
|
205
205
|
</script>
|
206
|
+
```
|
207
|
+
|
208
|
+
#追記1
|
209
|
+
|
210
|
+
####bookmark.vue
|
211
|
+
|
212
|
+
```ここに言語を入力
|
213
|
+
<div class="bookmarkList-posts">
|
214
|
+
<!-- PC・タブレット用ページネーション -->
|
215
|
+
<paginate
|
216
|
+
name="paginate-bookmarkList"
|
217
|
+
class="paginate-pctb"
|
218
|
+
tag="ol"
|
219
|
+
:list="bookmarkList"
|
220
|
+
:per="3"
|
221
|
+
v-if="bookmarkList.length !== 0"
|
222
|
+
>
|
223
|
+
<List
|
224
|
+
v-for="(list) in paginated('paginate-bookmarkList')"
|
225
|
+
:list="list"
|
226
|
+
:bookmarkList="bookmarkList"
|
227
|
+
:key="list.id"
|
228
|
+
/>
|
229
|
+
</paginate>
|
230
|
+
```
|
231
|
+
|
232
|
+
```ここに言語を入力
|
233
|
+
|
234
|
+
export default {
|
235
|
+
data() {
|
236
|
+
return {
|
237
|
+
profileData: {},
|
238
|
+
paginate: ["paginate-bookmarkList"],
|
239
|
+
bookmarkList: []
|
240
|
+
};
|
241
|
+
},
|
242
|
+
components: {
|
243
|
+
Header,
|
244
|
+
List
|
245
|
+
},
|
246
|
+
```
|
247
|
+
|
248
|
+
####list.vue
|
249
|
+
|
250
|
+
```ここに言語を入力
|
251
|
+
<template>
|
252
|
+
<div class="list">
|
253
|
+
<div class="face face1 flex">
|
254
|
+
<div class="content">
|
255
|
+
<img
|
256
|
+
class="profile-icon"
|
257
|
+
width="50"
|
258
|
+
height="50"
|
259
|
+
:src="
|
260
|
+
returnUserData() ? returnUserData().uploadedImage.fileUrl : preview
|
261
|
+
"
|
262
|
+
/>
|
263
|
+
<h3>{{ list.title }}</h3>
|
264
|
+
{{bookmarkList}}
|
265
|
+
</div>
|
266
|
+
</div>
|
267
|
+
<div class="face face2 flex">
|
268
|
+
<div class="content flex">
|
269
|
+
<button class="hide-btn" @click="deletePost">×</button>
|
270
|
+
<p>{{ list.description }}</p>
|
271
|
+
<router-link :to="`/chat/${list.id}`" class="join-btn flex">ルームへ参加</router-link>
|
272
|
+
<!-- 「list.id」propsで親コンポーネントから取得したidを取得。-->
|
273
|
+
<img
|
274
|
+
src="../assets/ブックマーク保存.jpg"
|
275
|
+
alt="ブックマーク"
|
276
|
+
class="bookmark-icon"
|
277
|
+
@click="saveBookmark"
|
278
|
+
/>
|
279
|
+
<img
|
280
|
+
src="../assets/ブックマーク未保存.jpg"
|
281
|
+
alt="ブックマーク"
|
282
|
+
class="bookmark-icon"
|
283
|
+
@click="deleteBookmark"
|
284
|
+
/>
|
285
|
+
<p class="post-time">{{ list.time.toDate().toLocaleString() }}</p>
|
286
|
+
</div>
|
287
|
+
</div>
|
288
|
+
</div>
|
289
|
+
</template>
|
290
|
+
```
|
291
|
+
|
292
|
+
```
|
293
|
+
export default {
|
294
|
+
data() {
|
295
|
+
return {
|
296
|
+
bookmarkId: "",
|
297
|
+
userDatas: [],
|
298
|
+
preview: require("../assets/デフォルト画像.jpg")
|
299
|
+
};
|
300
|
+
},
|
301
|
+
props: {
|
302
|
+
list: {
|
303
|
+
type: Object,
|
304
|
+
required: true
|
305
|
+
},
|
306
|
+
index: {
|
307
|
+
type: Number
|
308
|
+
},
|
309
|
+
bookmarkList: {
|
310
|
+
type: Array,
|
311
|
+
required: true
|
312
|
+
}
|
313
|
+
},
|
314
|
+
```
|
315
|
+
|
316
|
+
```ここに言語を入力
|
317
|
+
vue.runtime.esm.js?2b0e:619 [Vue warn]: Missing required prop: "bookmarkList"
|
318
|
+
|
319
|
+
found in
|
320
|
+
|
321
|
+
---> <List>
|
322
|
+
<Paginate>
|
323
|
+
<Anonymous>
|
324
|
+
<App> at src/App.vue
|
325
|
+
<Root>
|
206
326
|
```
|
1
内容変更
title
CHANGED
File without changes
|
body
CHANGED
@@ -20,6 +20,7 @@
|
|
20
20
|
また、もし他に良いやり方があればご教示いただけると幸いです。
|
21
21
|
|
22
22
|
よろしくお願いいたします。
|
23
|
+
#list.vue
|
23
24
|
|
24
25
|
```ここに言語を入力
|
25
26
|
<template>
|
@@ -116,4 +117,90 @@
|
|
116
117
|
});
|
117
118
|
});
|
118
119
|
},
|
120
|
+
```
|
121
|
+
|
122
|
+
#bookmark.vue
|
123
|
+
|
124
|
+
```ここに言語を入力
|
125
|
+
<template>
|
126
|
+
<div>
|
127
|
+
<Header />
|
128
|
+
<div class="bookmarkList flex">
|
129
|
+
<h3 class="bookmarkList-title flex">{{ profileData.name }} さんのブックマーク一覧</h3>
|
130
|
+
<hr class="separate" />
|
131
|
+
<div class="bookmarkList-posts">
|
132
|
+
<!-- PC・タブレット用ページネーション -->
|
133
|
+
<paginate
|
134
|
+
name="paginate-bookmarkList"
|
135
|
+
class="paginate-pctb"
|
136
|
+
tag="ol"
|
137
|
+
:list="bookmarkList"
|
138
|
+
:per="3"
|
139
|
+
v-if="bookmarkList.length !== 0"
|
140
|
+
>
|
141
|
+
<List v-for="(list) in paginated('paginate-bookmarkList')" :list="list" :key="list.id" />
|
142
|
+
</paginate>
|
143
|
+
|
144
|
+
<div v-else class="nothing flex">ブックマークされた投稿はありません</div>
|
145
|
+
<paginate-links
|
146
|
+
for="paginate-bookmarkList"
|
147
|
+
name="paginate-bookmarkList"
|
148
|
+
:async="true"
|
149
|
+
class="pagination paginate-pctb flex"
|
150
|
+
:show-step-links="true"
|
151
|
+
:style="bookmarkList == '' ? 'display:none;' : 'display:flex;'"
|
152
|
+
></paginate-links>
|
153
|
+
</div>
|
154
|
+
</div>
|
155
|
+
</div>
|
156
|
+
</template>
|
157
|
+
```
|
158
|
+
|
159
|
+
```
|
160
|
+
<script>
|
161
|
+
import firebase from "firebase";
|
162
|
+
import Header from "@/components/header.vue";
|
163
|
+
import List from "@/components/list.vue";
|
164
|
+
import Vue from "vue";
|
165
|
+
import VuePaginate from "vue-paginate";
|
166
|
+
Vue.use(VuePaginate);
|
167
|
+
|
168
|
+
export default {
|
169
|
+
data() {
|
170
|
+
return {
|
171
|
+
profileData: {},
|
172
|
+
paginate: ["paginate-bookmarkList"],
|
173
|
+
bookmarkList: []
|
174
|
+
};
|
175
|
+
},
|
176
|
+
components: {
|
177
|
+
Header,
|
178
|
+
List
|
179
|
+
},
|
180
|
+
|
181
|
+
created() {
|
182
|
+
firebase
|
183
|
+
.firestore()
|
184
|
+
.collection("users")
|
185
|
+
.doc(this.$route.params.uid)
|
186
|
+
.get()
|
187
|
+
.then(snapshot => {
|
188
|
+
this.profileData = snapshot.data();
|
189
|
+
});
|
190
|
+
|
191
|
+
firebase
|
192
|
+
.firestore()
|
193
|
+
.collection("users")
|
194
|
+
.doc(this.$route.params.uid)
|
195
|
+
.collection("bookmarks")
|
196
|
+
.orderBy("time", "desc")
|
197
|
+
.get()
|
198
|
+
.then(snapshot => {
|
199
|
+
snapshot.forEach(doc => {
|
200
|
+
this.bookmarkList.push(doc.data());
|
201
|
+
});
|
202
|
+
});
|
203
|
+
}
|
204
|
+
};
|
205
|
+
</script>
|
119
206
|
```
|