質問するログイン新規登録

質問編集履歴

11

内容について分かりにくかった為、整理し修正させて頂きました。

2021/06/20 06:04

投稿

TMTN
TMTN

スコア53

title CHANGED
@@ -1,1 +1,1 @@
1
- 【Vue × Firestore】Firestoreのサコレションにデタが存在しいなかった場合「保存」、存在したら「削除」と条件分岐させたい
1
+ 【Vue × Firestore】ブク機能にて「保存」「削除」と条件に応じて切り替えたい
body CHANGED
@@ -1,69 +1,16 @@
1
- #Firestoreのサコレションにデタが存在しいなかった場合「保存」、存在したら「削除」と条件分岐させたい
1
+ #ブク機能にて「保存」「削除」と条件に応じて切り替えたい
2
2
 
3
- 現状list.vueにて以下のように左下のボタンを用意して、
4
- それぞれsaveBookmark()とdeleteBookmark()を作成し、並べている状態です。
3
+ 現状list.vueにて以下のように左下のボタンを用意して、それぞれsaveBookmark()とdeleteBookmark()を作成し、並べている状態です。
5
4
 
6
5
  ![イメージ説明](e0bc51874fa1f600d52c66db96027994.png)
7
6
 
8
- Firestoreサブコレクションにデタが存在していなかった場合「保存」、
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
- <List v-for="(list) in paginated('paginate-bookmarkList')" :list="list" :key="list.id" />
12
+ <List v-for="(list) in paginated('paginate-bookmarkList')" :list="list" :key="list.id" />
52
- <!-- data内にあるbookmarkList配列から、v-forディレクティブを使って1つずつ要素を取り出し描画。 -->
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
- #追記 Firestoreのデータ構造を変更しました。が、わからない点がいくつかある状況です。。
224
+ #追記 内容整理
278
225
 
226
+ ####⑴bookmark.vueにてブックマークされた一覧を表示する際について。
279
- ブックマーク表示について、ブックマーク保存(savebookmark)する際、投稿(list)のidをサブコレクションのbookmarksへ「postId」としてデータを保存してあげて、そのブックマークされたidである「postId」と投稿のidである「list.id」が一致されたものをブックマーク一覧に表示させています。
227
+ ブックマーク保存(savebookmark)する際、投稿(list)のidをサブコレクションのbookmarksへ「postId」としてデータを保存してあげて、
228
+ そのブックマークされた際に取得した「postId」と投稿時に取得する「id」が一致されたものをブックマーク一覧に表示させています。
280
229
 
230
+ ◆投稿時に取得する「id」
281
- ![イメージ説明](9ee0181a687deb820e6711a1b3f137e4.png)
231
+ ![イメージ説明](ccfba015b2223bc75c2e0baa1020a848.png)
232
+ ◆ブックマークされた際に取得した「postId」
233
+ ![イメージ説明](484ed44e7f65e7bc574f63861d5f6d11.png)
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
- ⑵list中にisBookmarkedとしてブックマークされている投稿かどうかが判定できる情報一緒に渡てあげ、listコンポネント側で、isBookmarkedがtrue,かfalseかで表示を変えあげようと考えておりますがこちらにつきまても実装したいですがわからず行き詰まっている状況です・・
295
+ ユーザーのブックマークを閲覧た際にはそのユザーのブックマーク一覧を表示て、1枚のみを表示したいです
347
296
 
348
- ⑶board.vueコンポーネントでも同様に、ログンしているユザーのブックマーク一覧から、それに紐づいたpostIdを持つ投稿を取り出してきて、それにisBookmarkedをつけてあげてboard.vue側でもブックマークの保存と削除を行えるようにしたいと考えております。
297
+ ![ジ説明](9ee0181a687deb820e6711a1b3f137e4.png)
349
298
 
350
- 上記データ構造から少し複雑であると指摘がありましたので変更しております・・・が、分からず行き詰まってしまっている状況です。。
351
299
 
300
+ #⑵投稿の中にisBookmarkedとしてブックマークされている投稿かどうかが判定したい。
301
+
302
+ ※以下赤で囲っている箇所参照
303
+
304
+ ![イメージ説明](9ee0181a687deb820e6711a1b3f137e4.png)
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

内容変更

2021/06/20 06:04

投稿

TMTN
TMTN

スコア53

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内のcurrentUserBookmarkList:[]bindしpropsでデータ渡す -->
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 paginate-pctb flex"
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
- currentUserBookmarkList: [],
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.currentUserBookmarkList.push(doc.postId);
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.currentUserBookmarkList.includes(doc.id)) {
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
- this.bookmarkList.push({ ...doc.data(), isBookmarked: true });
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.bookmarkId)
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
- ![イメージ説明](5deed5ea424d43ac2bc2730b0ad763ef.png)
281
+ ![イメージ説明](9ee0181a687deb820e6711a1b3f137e4.png)
273
282
 
274
- 現在Firestoreに「postId」は保存ているので「postId」と「list.id」が致した情報を取得して表示させたいが、現状「postId」「time」みしか表示されていなく、上手くいかない状況で・・
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

ソースの内容変更

2021/06/19 12:02

投稿

TMTN
TMTN

スコア53

title CHANGED
File without changes
body CHANGED
@@ -9,19 +9,27 @@
9
9
  存在したら「削除」と条件分岐させて切替をしたいと考えております。
10
10
 
11
11
  ```ここに言語を入力
12
+ <img
12
- <img src="../assets/ブックマーク保存.jpg" alt="ブックマーク" class="bookmark-icon" @click="saveBookmark" />
13
+ src="../assets/ブックマーク保存.jpg"
14
+ alt="ブックマーク"
15
+ class="bookmark-icon"
16
+ @click="saveBookmark"
17
+ v-if="hasBookmark(list)"
18
+ />
19
+ <img
13
- <img src="../assets/ブックマーク未保存.jpg" alt="ブックマーク" class="bookmark-icon" @click="deleteBookmark"/>
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
- #追記1
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
- v-for="(list) in paginated('paginate-bookmarkList')"
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.data());
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
- saveBookmark() {
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
- bookmarkId: id,
226
+ {
233
- ...this.list,
227
+ postId: this.list.id,
234
- time: firebase.firestore.FieldValue.serverTimestamp()
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
- #bookmark.id取得できない
268
+ #追記 「Firestoreのデータ構造変更しました。」が、わからない点がいくつかある状況です。。
277
269
 
278
- 以下画像の青で囲っているようbookmarkのidは取得できているので、子コンネントでるlist.vueにpropsで親より受けた「bookmarkを使って{{bookmark.id}}してもbookmarkのidが取得きまん・・・
270
+ ⑴ブックマーク表示につて、ブックマーク保存(savebookmark)す、投稿(list)のidをサブレクショのbookmarksへ「postId」としてデタを保存して、そのブックマークされidであるpostId」と投稿のidである「list.id」が一致されたものをブックマーク一覧に表示さるようにする。
279
271
 
280
- ![イメージ説明](069bd490b3d7384d0056a4ad1038ad46.png)
272
+ ![イメージ説明](5deed5ea424d43ac2bc2730b0ad763ef.png)
281
273
 
282
- ```ここ言語入力
274
+ 現在Firestore「postId」は保存できているので「postId」と「list.id」が一致した情報取得して表示させたいのですが、現状「postId」と「time」のみしか表示されていなく、上手くいかない状況です・・
283
275
 
284
- firebase.auth().onAuthStateChanged(user => {
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
- this.currentUserBookmarkList.push(doc.data());
278
+ ⑶board.vueコンポーネントでも同様に、ログインしているユーザーのブックマーク一覧から、それに紐づいたpostIdを持つ投稿を取り出してきて、それにisBookmarkedをつけてあげてboard.vue側でもブックマークの保存と削除を行えるようにしたいと考えております。
297
- console.log(this.currentUserBookmarkList);
298
- });
299
- });
300
- });
301
- }
302
- ```
303
279
 
304
- ---
280
+ 上記データ構造から少し複雑であると指摘がありましたので変更しております・・・が、分からず行き詰まってしまっている状況です。。
305
281
 
306
- 以下より「book.id」は取得できていを確認できてるの、後「bookmark.id」を取得できれば本件実装できるかと思われまが行き詰まってしまいました・・
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

エラーコードにつきましては解決した為、修正

2021/06/18 15:57

投稿

TMTN
TMTN

スコア53

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
- created() {
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
- const currentUser = firebase.auth().currentUser;
108
+ firebase.auth().onAuthStateChanged(user => {
108
- const uid = currentUser.uid;
109
+ const uid = user.uid;
109
110
 
110
- firebase
111
+ firebase
111
- .firestore()
112
+ .firestore()
112
- .collection("users")
113
+ .collection("users")
113
- .doc(uid)
114
+ .doc(uid)
114
- .collection("bookmarks")
115
+ .collection("bookmarks")
115
- .orderBy("time", "desc")
116
+ .orderBy("time", "desc")
116
- .get()
117
+ .get()
117
- .then(snapshot => {
118
+ .then(snapshot => {
118
- snapshot.forEach(doc => {
119
+ snapshot.forEach(doc => {
119
- this.currentUserBookmarkList.push(doc.data());
120
+ this.currentUserBookmarkList.push(doc.data());
120
- // console.log(this.currentUserBookmarkList);
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 ref = firebase
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
- ![イメージ説明](416198e63f8c3757043c1b2f95417b98.png)
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
  ![イメージ説明](069bd490b3d7384d0056a4ad1038ad46.png)
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
- firebase
287
+ firebase
337
- .firestore()
288
+ .firestore()
338
- .collection("users")
289
+ .collection("users")
339
- .doc(uid)
290
+ .doc(uid)
340
- .collection("bookmarks")
291
+ .collection("bookmarks")
341
- .orderBy("time", "desc")
292
+ .orderBy("time", "desc")
342
- .get()
293
+ .get()
343
- .then(snapshot => {
294
+ .then(snapshot => {
344
- snapshot.forEach(doc => {
295
+ snapshot.forEach(doc => {
345
- this.currentUserBookmarkList.push(doc.data());
296
+ this.currentUserBookmarkList.push(doc.data());
346
- console.log(this.currentUserBookmarkList);
297
+ console.log(this.currentUserBookmarkList);
298
+ });
347
299
  });
348
- });
300
+ });
301
+ }
349
302
  ```
350
303
 
351
304
  ---

7

内容修正

2021/06/16 14:59

投稿

TMTN
TMTN

スコア53

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追加

2021/06/15 13:53

投稿

TMTN
TMTN

スコア53

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

内容修正

2021/06/15 13:52

投稿

TMTN
TMTN

スコア53

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
- ![イメージ説明](a164b27c60e2cc3f9190f602e96f03c3.png)
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="3"
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="bookmarklist"
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: Object,
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
+ ![イメージ説明](416198e63f8c3757043c1b2f95417b98.png)
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
- ![イメージ説明](5eabcd50d1c607032f4ceceb15b88466.png)
330
+ ![イメージ説明](069bd490b3d7384d0056a4ad1038ad46.png)
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

内容変更、追記

2021/06/15 13:45

投稿

TMTN
TMTN

スコア53

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
- <template>
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
- </div>
34
+ <Anonymous>
35
+ <App> at src/App.vue
40
- </div>
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
- methods: {
39
+ ![イメージ説明](a164b27c60e2cc3f9190f602e96f03c3.png)
63
40
 
64
- saveBookmark() {
65
- const ref = firebase
66
- .firestore()
67
- .collection("users")
68
- .doc(this.$route.params.uid)
69
- .collection("bookmarks")
70
- .doc();
41
+ #追記2
71
42
 
72
- const id = ref.id;
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
- this.$swal("ブックマークを追加出来ません。", {
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
- path: `/bookmark/${this.$route.params.uid}`,
49
+ としておりましたが、子で受ける際はキャメルケースでは「undefined」となるようなので以下のようにしました。
111
- force: true
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
- <List v-for="(list) in paginated('paginate-bookmarkList')" :list="list" :key="list.id" />
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
- #追記1
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
- bookmarkList: {
173
+ bookmark: {
310
- type: Array,
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
- found in
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
- ---> <List>
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
- <Paginate>
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
- <Anonymous>
243
+ </script>
324
- <App> at src/App.vue
325
- <Root>
326
244
  ```
327
245
 
246
+ #エラーコード
247
+
328
- ![イメージ説明](a164b27c60e2cc3f9190f602e96f03c3.png)
248
+ ![イメージ説明](5eabcd50d1c607032f4ceceb15b88466.png)

3

画像追加

2021/06/10 23:07

投稿

TMTN
TMTN

スコア53

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
+ ![イメージ説明](a164b27c60e2cc3f9190f602e96f03c3.png)

2

追記1追加

2021/06/10 16:13

投稿

TMTN
TMTN

スコア53

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

内容変更

2021/06/10 16:08

投稿

TMTN
TMTN

スコア53

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
  ```