質問編集履歴

3

内容訂正

2021/06/24 14:30

投稿

TMTN
TMTN

スコア53

test CHANGED
File without changes
test CHANGED
@@ -1,10 +1,12 @@
1
- ブックマーク機能を作成たのですが、画面上リアルタイムで「ブックマーク保存」と「ブックマーク未保存」を切り替えたいです。
1
+ ブックマーク機能を実装ており、画面上リアルタイムで「ブックマーク保存」と「ブックマーク未保存」を切り替えたいです。
2
2
 
3
3
 
4
4
 
5
5
  現状、手動でリロードしないとリアルタイムで画面は切り替わっていない状況です。
6
6
 
7
- Firestoreでは画面上で保存・削除ともに動作はしているのですが、リアルタイムで動作を確認できるようにしたいです。
7
+ Firestoreでは画面上で保存・削除ともに動作はしているのですが、
8
+
9
+ 手動でリロードせずともリアルタイムで動作を確認できるようにしたいです。
8
10
 
9
11
 
10
12
 
@@ -16,11 +18,85 @@
16
18
 
17
19
 
18
20
 
21
+ ```
22
+
23
+ <img src="../assets/ブックマーク保存.jpg" alt="ブックマーク" class="bookmark-icon" @click="deleteBookmark" v-if="isBookmarked = true"/>
24
+
25
+ <img src="../assets/ブックマーク未保存.jpg" alt="ブックマーク" class="bookmark-icon" @click="saveBookmark" v-else />
26
+
27
+ ```
28
+
29
+
30
+
31
+
32
+
33
+ 「saveBookmark」したときに、this.isBookmarked=trueにして、v-if, v-elseでthis.isBookmarkedによって、表示するアイコン変えられるようにbookmarkを追加したときに、dataを変更すればいいのかと思い以下のようにしましたが、全ての投稿がtrueになってしまっております・・
34
+
35
+
36
+
37
+
38
+
39
+ 分かる方いらっしゃいましたらお力添えを頂きたいです。
40
+
41
+
42
+
43
+ よろしくお願いいたします。
44
+
45
+
46
+
47
+
48
+
49
+ #実際のコード
50
+
51
+
52
+
19
- ```ここに言語を入力
53
+ ```html
54
+
20
-
55
+ <template>
56
+
57
+ <div class="list">
58
+
59
+ <div class="face face1 flex">
60
+
61
+ <div class="content">
62
+
21
- <img
63
+ <img
22
-
64
+
23
- :src="isBookmark"
65
+ class="profile-icon"
66
+
67
+ width="50"
68
+
69
+ height="50"
70
+
71
+ :src="
72
+
73
+ returnUserData() ? returnUserData().uploadedImage.fileUrl : preview
74
+
75
+ "
76
+
77
+ />
78
+
79
+ <h3>{{ list.title }}</h3>
80
+
81
+ </div>
82
+
83
+ </div>
84
+
85
+ <div class="face face2 flex">
86
+
87
+ <div class="content flex">
88
+
89
+ <button class="hide-btn" @click="deletePost">×</button>
90
+
91
+ <p>{{ list.description }}</p>
92
+
93
+ <router-link :to="`/chat/${list.id}`" class="join-btn flex">ルームへ参加</router-link>
94
+
95
+ <!-- 「list.id」propsで親コンポーネントから取得したidを取得。-->
96
+
97
+ <img
98
+
99
+ src="../assets/ブックマーク保存.jpg"
24
100
 
25
101
  alt="ブックマーク"
26
102
 
@@ -28,13 +104,13 @@
28
104
 
29
105
  @click="deleteBookmark"
30
106
 
31
- v-if="list.isBookmarked"
107
+ v-if="isBookmarked = true"
32
108
 
33
109
  />
34
110
 
35
111
  <img
36
112
 
37
- :src="isBookmarked"
113
+ src="../assets/ブックマーク未保存.jpg"
38
114
 
39
115
  alt="ブックマーク"
40
116
 
@@ -46,440 +122,186 @@
46
122
 
47
123
  />
48
124
 
125
+ <p class="post-time">{{ $dayjs(list.time.toDate()).format('YYYY/MM/DD HH:mm') }}</p>
126
+
127
+ </div>
128
+
129
+ </div>
130
+
131
+ </div>
132
+
133
+ </template>
134
+
49
135
  ```
50
136
 
51
137
 
52
138
 
53
- 分かる方いらっしゃいましたらお力添えを頂きたいです。
54
-
55
-
56
-
57
- よろしくお願いいたします。
58
-
59
-
60
-
61
-
62
-
63
- #実際のコード
64
-
65
-
66
-
67
- ```html
68
-
69
- <template>
70
-
71
- <div class="list">
72
-
73
- <div class="face face1 flex">
74
-
75
- <div class="content">
76
-
77
- <img
78
-
79
- class="profile-icon"
80
-
81
- width="50"
82
-
83
- height="50"
84
-
85
- :src="
86
-
87
- returnUserData() ? returnUserData().uploadedImage.fileUrl : preview
88
-
89
- "
90
-
91
- />
92
-
93
- <h3>{{ list.title }}</h3>
94
-
95
- </div>
96
-
97
- </div>
98
-
99
- <div class="face face2 flex">
100
-
101
- <div class="content flex">
102
-
103
- <button class="hide-btn" @click="deletePost">×</button>
104
-
105
- <p>{{ list.description }}</p>
106
-
107
- <router-link :to="`/chat/${list.id}`" class="join-btn flex">ルームへ参加</router-link>
108
-
109
- <!-- 「list.id」propsで親コンポーネントから取得したidを取得。-->
110
-
111
- <img
112
-
113
- :src="isBookmark"
114
-
115
- alt="ブックマーク"
116
-
117
- class="bookmark-icon"
118
-
119
- @click="deleteBookmark"
120
-
121
- v-if="list.isBookmarked"
122
-
123
- />
124
-
125
- <img
126
-
127
- :src="isBookmarked"
128
-
129
- alt="ブックマーク"
130
-
131
- class="bookmark-icon"
132
-
133
- @click="saveBookmark"
134
-
135
- v-else
136
-
137
- />
138
-
139
- <p class="post-time">{{ $dayjs(list.time.toDate()).format('YYYY/MM/DD HH:mm') }}</p>
140
-
141
- </div>
142
-
143
- </div>
144
-
145
- </div>
146
-
147
- </template>
139
+
140
+
141
+ ```js
142
+
143
+
144
+
145
+ data() {
146
+
147
+ return {
148
+
149
+ bookmark: require(),
150
+
151
+ isBookmarked: false,
152
+
153
+ userDatas: [],
154
+
155
+ preview: require("../assets/デフォルト画像.jpg")
156
+
157
+ };
158
+
159
+ },
160
+
161
+ props: {
162
+
163
+ list: {
164
+
165
+ type: Object
166
+
167
+ //親コンポーネント(board.vue)のlist[Object型]をpropsで渡している。
168
+
169
+ },
170
+
171
+ index: {
172
+
173
+ type: Number
174
+
175
+ //親コンポーネント(board.vue)のindex[Number型]をpropsで渡している。
176
+
177
+ }
178
+
179
+ },
180
+
181
+
182
+
183
+  ~ 省略 ~
184
+
185
+
186
+
187
+ saveBookmark() {
188
+
189
+ const id = firebase
190
+
191
+ .firestore()
192
+
193
+ .collection("users")
194
+
195
+ .doc(this.$route.params.uid)
196
+
197
+ .collection("bookmarks")
198
+
199
+ .doc().id;
200
+
201
+
202
+
203
+ firebase
204
+
205
+ .firestore()
206
+
207
+ .collection("users") //「users」コレクションを参照
208
+
209
+ .doc(this.$route.params.uid) //対象ページのユーザーを参照
210
+
211
+ .collection("bookmarks") //「bookmarks」サブコレクションを参照
212
+
213
+ .doc(id) //自動生成されたドキュメントIDを参照
214
+
215
+ .set({
216
+
217
+ postId: this.list.id, //「postId」に投稿データである「this.list.id」を代入。
218
+
219
+ time: firebase.firestore.FieldValue.serverTimestamp()
220
+
221
+ })
222
+
223
+ .then(() => {
224
+
225
+ this.$swal("ブックマークに追加しました。", {
226
+
227
+ icon: "success"
228
+
229
+ });
230
+
231
+ this.isBookmarked = true;
232
+
233
+ })
234
+
235
+ .catch(() => {
236
+
237
+ this.$swal("ブックマークを追加出来ません。", {
238
+
239
+ icon: "error"
240
+
241
+ });
242
+
243
+ });
244
+
245
+ },
246
+
247
+
248
+
249
+ deleteBookmark() {
250
+
251
+ firebase
252
+
253
+ .firestore()
254
+
255
+ .collection("users")
256
+
257
+ .doc(this.$route.params.uid)
258
+
259
+ .collection("bookmarks")
260
+
261
+ .where("postId", "==", this.list.id)
262
+
263
+ //postIdをフィルタリングして投稿idであるthis.list.idと合致するもののみを参照
264
+
265
+ .get()
266
+
267
+ .then(snapshot => {
268
+
269
+ snapshot.forEach(doc => {
270
+
271
+ //forEachで全てのドキュメントに対して
272
+
273
+ doc.ref //ドキュメントの数だけrefを参照して
274
+
275
+ .delete() //削除を実行
276
+
277
+ .then(() => {
278
+
279
+ this.$swal("ブックマークを取り消ししました。", {
280
+
281
+ icon: "success"
282
+
283
+ });
284
+
285
+ this.isBookmarked = false;
286
+
287
+ })
288
+
289
+ .catch(() => {
290
+
291
+ this.$swal("ブックマークを取り消し出来ません。", {
292
+
293
+ icon: "error"
294
+
295
+ });
296
+
297
+ });
298
+
299
+ });
300
+
301
+ });
302
+
303
+ },
304
+
305
+ </script>
148
306
 
149
307
  ```
150
-
151
-
152
-
153
-
154
-
155
- ```js
156
-
157
- export default {
158
-
159
- data() {
160
-
161
- return {
162
-
163
- isBookmark:require("../assets/ブックマーク保存.jpg"),
164
-
165
- isBookmarked:require("../assets/ブックマーク未保存.jpg"),
166
-
167
- bookmarkId: "",
168
-
169
- userDatas: [],
170
-
171
- preview: require("../assets/デフォルト画像.jpg")
172
-
173
- };
174
-
175
- },
176
-
177
- props: {
178
-
179
- list: {
180
-
181
- type: Object
182
-
183
- //親コンポーネント(board.vue)のlist[Object型]をpropsで渡している。
184
-
185
- },
186
-
187
- index: {
188
-
189
- type: Number
190
-
191
- //親コンポーネント(board.vue)のindex[Number型]をpropsで渡している。
192
-
193
- }
194
-
195
- },
196
-
197
-
198
-
199
-  ~ 省略 ~
200
-
201
-
202
-
203
- saveBookmark() {
204
-
205
- const id = firebase
206
-
207
- .firestore()
208
-
209
- .collection("users")
210
-
211
- .doc(this.$route.params.uid)
212
-
213
- .collection("bookmarks")
214
-
215
- .doc().id;
216
-
217
-
218
-
219
- firebase
220
-
221
- .firestore()
222
-
223
- .collection("users") //「users」コレクションを参照
224
-
225
- .doc(this.$route.params.uid) //対象ページのユーザーを参照
226
-
227
- .collection("bookmarks") //「bookmarks」サブコレクションを参照
228
-
229
- .doc(id) //自動生成されたドキュメントIDを参照
230
-
231
- .set({
232
-
233
- postId: this.list.id, //「postId」に投稿データである「this.list.id」を代入。
234
-
235
- time: firebase.firestore.FieldValue.serverTimestamp()
236
-
237
- })
238
-
239
- .then(() => {
240
-
241
- this.$swal("ブックマークに追加しました。", {
242
-
243
- icon: "success"
244
-
245
- });
246
-
247
- })
248
-
249
- .catch(() => {
250
-
251
- this.$swal("ブックマークを追加出来ません。", {
252
-
253
- icon: "error"
254
-
255
- });
256
-
257
- });
258
-
259
- },
260
-
261
-
262
-
263
- deleteBookmark() {
264
-
265
- firebase
266
-
267
- .firestore()
268
-
269
- .collection("users")
270
-
271
- .doc(this.$route.params.uid)
272
-
273
- .collection("bookmarks")
274
-
275
- .where("postId", "==", this.list.id)
276
-
277
- .get()
278
-
279
- .then(snapshot => {
280
-
281
- snapshot.forEach(doc => {
282
-
283
- doc.ref
284
-
285
- .delete()
286
-
287
- .then(() => {
288
-
289
- this.$swal("ブックマークを取り消ししました。", {
290
-
291
- icon: "success"
292
-
293
- });
294
-
295
- })
296
-
297
- .catch(() => {
298
-
299
- this.$swal("ブックマークを取り消し出来ません。", {
300
-
301
- icon: "error"
302
-
303
- });
304
-
305
- });
306
-
307
- });
308
-
309
- });
310
-
311
- },
312
-
313
- </script>
314
-
315
- ```
316
-
317
-
318
-
319
- #追記1
320
-
321
-
322
-
323
- 「saveBookmark」したときに、this.isBookmarked=trueにして、v-if, v-elseでthis.isBookmarkedによって、表示するアイコン変えられるようにbookmarkを追加したときに、dataを変更すればいいのかと思い以下のようにしましたが、全ての投稿がtrueになってしまっております・・
324
-
325
-
326
-
327
- ```
328
-
329
- <img :src="bookmark" alt="ブックマーク" class="bookmark-icon" @click="deleteBookmark" v-if="this.isBookmarked = true"/>
330
-
331
- <img :src="bookmarked" alt="ブックマーク" class="bookmark-icon" @click="saveBookmark" v-else />
332
-
333
- ```
334
-
335
-
336
-
337
- ```
338
-
339
- data() {
340
-
341
- return {
342
-
343
- bookmark: require("../assets/ブックマーク保存.jpg"),
344
-
345
- bookmarked: require("../assets/ブックマーク未保存.jpg"),
346
-
347
- isBookmarked: false,
348
-
349
- userDatas: [],
350
-
351
- preview: require("../assets/デフォルト画像.jpg")
352
-
353
- };
354
-
355
- },
356
-
357
- ```
358
-
359
-
360
-
361
- ```ここに言語を入力
362
-
363
- saveBookmark() {
364
-
365
- const id = firebase
366
-
367
- .firestore()
368
-
369
- .collection("users")
370
-
371
- .doc(this.$route.params.uid)
372
-
373
- .collection("bookmarks")
374
-
375
- .doc().id;
376
-
377
-
378
-
379
- firebase
380
-
381
- .firestore()
382
-
383
- .collection("users") //「users」コレクションを参照
384
-
385
- .doc(this.$route.params.uid) //対象ページのユーザーを参照
386
-
387
- .collection("bookmarks") //「bookmarks」サブコレクションを参照
388
-
389
- .doc(id) //自動生成されたドキュメントIDを参照
390
-
391
- .set({
392
-
393
- postId: this.list.id, //「postId」に投稿データである「this.list.id」を代入。
394
-
395
- time: firebase.firestore.FieldValue.serverTimestamp()
396
-
397
- })
398
-
399
- .then(() => {
400
-
401
- this.$swal("ブックマークに追加しました。", {
402
-
403
- icon: "success"
404
-
405
- });
406
-
407
- this.isBookmarked = true;
408
-
409
- })
410
-
411
- .catch(() => {
412
-
413
- this.$swal("ブックマークを追加出来ません。", {
414
-
415
- icon: "error"
416
-
417
- });
418
-
419
- });
420
-
421
- },
422
-
423
- ```
424
-
425
-
426
-
427
- ```
428
-
429
- deleteBookmark() {
430
-
431
- firebase
432
-
433
- .firestore()
434
-
435
- .collection("users")
436
-
437
- .doc(this.$route.params.uid)
438
-
439
- .collection("bookmarks")
440
-
441
- .where("postId", "==", this.list.id)
442
-
443
- //postIdをフィルタリングして投稿idであるthis.list.idと合致するもののみを参照
444
-
445
- .get()
446
-
447
- .then(snapshot => {
448
-
449
- snapshot.forEach(doc => {
450
-
451
- //forEachで全てのドキュメントに対して
452
-
453
- doc.ref //ドキュメントの数だけrefを参照して
454
-
455
- .delete() //削除を実行
456
-
457
- .then(() => {
458
-
459
- this.$swal("ブックマークを取り消ししました。", {
460
-
461
- icon: "success"
462
-
463
- });
464
-
465
- this.isBookmarked = false;
466
-
467
- })
468
-
469
- .catch(() => {
470
-
471
- this.$swal("ブックマークを取り消し出来ません。", {
472
-
473
- icon: "error"
474
-
475
- });
476
-
477
- });
478
-
479
- });
480
-
481
- });
482
-
483
- },
484
-
485
- ```

2

追記1追加

2021/06/24 14:30

投稿

TMTN
TMTN

スコア53

test CHANGED
File without changes
test CHANGED
@@ -313,3 +313,173 @@
313
313
  </script>
314
314
 
315
315
  ```
316
+
317
+
318
+
319
+ #追記1
320
+
321
+
322
+
323
+ 「saveBookmark」したときに、this.isBookmarked=trueにして、v-if, v-elseでthis.isBookmarkedによって、表示するアイコン変えられるようにbookmarkを追加したときに、dataを変更すればいいのかと思い以下のようにしましたが、全ての投稿がtrueになってしまっております・・
324
+
325
+
326
+
327
+ ```
328
+
329
+ <img :src="bookmark" alt="ブックマーク" class="bookmark-icon" @click="deleteBookmark" v-if="this.isBookmarked = true"/>
330
+
331
+ <img :src="bookmarked" alt="ブックマーク" class="bookmark-icon" @click="saveBookmark" v-else />
332
+
333
+ ```
334
+
335
+
336
+
337
+ ```
338
+
339
+ data() {
340
+
341
+ return {
342
+
343
+ bookmark: require("../assets/ブックマーク保存.jpg"),
344
+
345
+ bookmarked: require("../assets/ブックマーク未保存.jpg"),
346
+
347
+ isBookmarked: false,
348
+
349
+ userDatas: [],
350
+
351
+ preview: require("../assets/デフォルト画像.jpg")
352
+
353
+ };
354
+
355
+ },
356
+
357
+ ```
358
+
359
+
360
+
361
+ ```ここに言語を入力
362
+
363
+ saveBookmark() {
364
+
365
+ const id = firebase
366
+
367
+ .firestore()
368
+
369
+ .collection("users")
370
+
371
+ .doc(this.$route.params.uid)
372
+
373
+ .collection("bookmarks")
374
+
375
+ .doc().id;
376
+
377
+
378
+
379
+ firebase
380
+
381
+ .firestore()
382
+
383
+ .collection("users") //「users」コレクションを参照
384
+
385
+ .doc(this.$route.params.uid) //対象ページのユーザーを参照
386
+
387
+ .collection("bookmarks") //「bookmarks」サブコレクションを参照
388
+
389
+ .doc(id) //自動生成されたドキュメントIDを参照
390
+
391
+ .set({
392
+
393
+ postId: this.list.id, //「postId」に投稿データである「this.list.id」を代入。
394
+
395
+ time: firebase.firestore.FieldValue.serverTimestamp()
396
+
397
+ })
398
+
399
+ .then(() => {
400
+
401
+ this.$swal("ブックマークに追加しました。", {
402
+
403
+ icon: "success"
404
+
405
+ });
406
+
407
+ this.isBookmarked = true;
408
+
409
+ })
410
+
411
+ .catch(() => {
412
+
413
+ this.$swal("ブックマークを追加出来ません。", {
414
+
415
+ icon: "error"
416
+
417
+ });
418
+
419
+ });
420
+
421
+ },
422
+
423
+ ```
424
+
425
+
426
+
427
+ ```
428
+
429
+ deleteBookmark() {
430
+
431
+ firebase
432
+
433
+ .firestore()
434
+
435
+ .collection("users")
436
+
437
+ .doc(this.$route.params.uid)
438
+
439
+ .collection("bookmarks")
440
+
441
+ .where("postId", "==", this.list.id)
442
+
443
+ //postIdをフィルタリングして投稿idであるthis.list.idと合致するもののみを参照
444
+
445
+ .get()
446
+
447
+ .then(snapshot => {
448
+
449
+ snapshot.forEach(doc => {
450
+
451
+ //forEachで全てのドキュメントに対して
452
+
453
+ doc.ref //ドキュメントの数だけrefを参照して
454
+
455
+ .delete() //削除を実行
456
+
457
+ .then(() => {
458
+
459
+ this.$swal("ブックマークを取り消ししました。", {
460
+
461
+ icon: "success"
462
+
463
+ });
464
+
465
+ this.isBookmarked = false;
466
+
467
+ })
468
+
469
+ .catch(() => {
470
+
471
+ this.$swal("ブックマークを取り消し出来ません。", {
472
+
473
+ icon: "error"
474
+
475
+ });
476
+
477
+ });
478
+
479
+ });
480
+
481
+ });
482
+
483
+ },
484
+
485
+ ```

1

内容変更

2021/06/23 06:21

投稿

TMTN
TMTN

スコア53

test CHANGED
File without changes
test CHANGED
@@ -20,7 +20,7 @@
20
20
 
21
21
  <img
22
22
 
23
- src="../assets/ブックマーク保存.jpg"
23
+ :src="isBookmark"
24
24
 
25
25
  alt="ブックマーク"
26
26
 
@@ -34,7 +34,7 @@
34
34
 
35
35
  <img
36
36
 
37
- src="../assets/ブックマーク未保存.jpg"
37
+ :src="isBookmarked"
38
38
 
39
39
  alt="ブックマーク"
40
40
 
@@ -110,7 +110,7 @@
110
110
 
111
111
  <img
112
112
 
113
- src="../assets/ブックマーク保存.jpg"
113
+ :src="isBookmark"
114
114
 
115
115
  alt="ブックマーク"
116
116
 
@@ -124,7 +124,7 @@
124
124
 
125
125
  <img
126
126
 
127
- src="../assets/ブックマーク未保存.jpg"
127
+ :src="isBookmarked"
128
128
 
129
129
  alt="ブックマーク"
130
130
 
@@ -160,6 +160,10 @@
160
160
 
161
161
  return {
162
162
 
163
+ isBookmark:require("../assets/ブックマーク保存.jpg"),
164
+
165
+ isBookmarked:require("../assets/ブックマーク未保存.jpg"),
166
+
163
167
  bookmarkId: "",
164
168
 
165
169
  userDatas: [],