質問編集履歴

8

修正

2021/06/07 11:32

投稿

TMTN
TMTN

スコア53

test CHANGED
File without changes
test CHANGED
@@ -571,3 +571,11 @@
571
571
 
572
572
 
573
573
  ![イメージ説明](0cddfb5aeded74fb8fd82fe26c09e944.png)
574
+
575
+
576
+
577
+ ###「t」を削除後
578
+
579
+
580
+
581
+ ![イメージ説明](c55fa2516d4e2850561176b65074245e.png)

7

追記4追加

2021/06/07 11:32

投稿

TMTN
TMTN

スコア53

test CHANGED
File without changes
test CHANGED
@@ -551,3 +551,23 @@
551
551
 
552
552
 
553
553
  ![イメージ説明](2bc6f32ea0d3934ba668bf06eb66f14b.png)
554
+
555
+
556
+
557
+ #追記4
558
+
559
+
560
+
561
+ ###検索前
562
+
563
+
564
+
565
+ ![イメージ説明](0710b574e28cf58c88b16f39789329fb.png)
566
+
567
+
568
+
569
+ ###検索後
570
+
571
+
572
+
573
+ ![イメージ説明](0cddfb5aeded74fb8fd82fe26c09e944.png)

6

追記3追加

2021/06/07 11:28

投稿

TMTN
TMTN

スコア53

test CHANGED
File without changes
test CHANGED
@@ -543,3 +543,11 @@
543
543
  青色括弧につきましては、 filteredPostDataをdata()内で初期化してくださいとのことでしたので、
544
544
 
545
545
  data()内で filteredPostData: []と初期化しました。
546
+
547
+
548
+
549
+ #追記3
550
+
551
+
552
+
553
+ ![イメージ説明](2bc6f32ea0d3934ba668bf06eb66f14b.png)

5

追記2追加

2021/06/07 11:01

投稿

TMTN
TMTN

スコア53

test CHANGED
File without changes
test CHANGED
@@ -239,3 +239,307 @@
239
239
 
240
240
 
241
241
  ![イメージ説明](94b35374a4fefecf891b36eecffdc5cc.png)
242
+
243
+
244
+
245
+ #追記2
246
+
247
+ 以下のようにコードを書き替えましたので掲載させていただきます。
248
+
249
+
250
+
251
+ #board.vue(親コンポーネント)
252
+
253
+
254
+
255
+ ```html
256
+
257
+ <template>
258
+
259
+ <div>
260
+
261
+ <Header />
262
+
263
+ <Post v-model="searchWord" />
264
+
265
+ <div class="post">
266
+
267
+ <h2 id="top" class="post-tll neon">投稿一覧</h2>
268
+
269
+ <div class="post-inner">
270
+
271
+ <div class="post-items">
272
+
273
+ <paginate name="paginate-log" tag="ol" :list="filteredPostData" :per="12">
274
+
275
+ <List
276
+
277
+ v-for="(list, index) in paginated('paginate-log')"
278
+
279
+ :index="index"
280
+
281
+ :list="list"
282
+
283
+ :userDatas="userDatas"
284
+
285
+ :key="list.id"
286
+
287
+ />
288
+
289
+ </paginate>
290
+
291
+ <paginate-links
292
+
293
+ for="paginate-log"
294
+
295
+ class="pagination flex"
296
+
297
+ v-scroll-to="postTop"
298
+
299
+ :show-step-links="true"
300
+
301
+ ></paginate-links>
302
+
303
+ </div>
304
+
305
+ </div>
306
+
307
+ </div>
308
+
309
+ </div>
310
+
311
+ </template>
312
+
313
+ ```
314
+
315
+
316
+
317
+ ```js
318
+
319
+ export default {
320
+
321
+ data() {
322
+
323
+ return {
324
+
325
+ title: "",
326
+
327
+ contents: "",
328
+
329
+ image: "",
330
+
331
+ postData: [],
332
+
333
+ paginate: ["paginate-log"],
334
+
335
+ postTop: "#top",
336
+
337
+ userDatas: [],
338
+
339
+ searchWord: "",
340
+
341
+ filteredPostData: []
342
+
343
+ };
344
+
345
+ },
346
+
347
+ components: {
348
+
349
+ Header,
350
+
351
+ Post,
352
+
353
+ List
354
+
355
+ },
356
+
357
+ computed: {
358
+
359
+ filteredPostData(value) {
360
+
361
+ console.log(value);
362
+
363
+ if (value != "") {
364
+
365
+ return this.postData.filter(v => {
366
+
367
+ return ~v.genre.indexOf(this.searchWord);
368
+
369
+ });
370
+
371
+ } else {
372
+
373
+ return this.postData;
374
+
375
+ }
376
+
377
+ }
378
+
379
+ }
380
+
381
+ },
382
+
383
+ created() {
384
+
385
+ // "posts"コレクションの全ドキュメントを取得。
386
+
387
+ firebase
388
+
389
+ .firestore()
390
+
391
+ .collection("posts")
392
+
393
+ .orderBy("time", "desc")
394
+
395
+ .get()
396
+
397
+ .then(snapshot => {
398
+
399
+ //"posts"(参照先)のスナップショットを得る
400
+
401
+ snapshot.forEach(doc => {
402
+
403
+ //上記で得たデータをforEachでドキュメントの数だけ"doc"データに格納
404
+
405
+ this.postData.push({ ...doc.data(), id: doc.id });
406
+
407
+ //更にpostDataの空配列に格納した"doc"データを格納
408
+
409
+ });
410
+
411
+ });
412
+
413
+ };
414
+
415
+ </script>
416
+
417
+
418
+
419
+ ```
420
+
421
+
422
+
423
+ #post.vue(子コンポーネント)
424
+
425
+
426
+
427
+ ```html
428
+
429
+ <div class="search-inner flex">
430
+
431
+ <h2 class="search-tll neon flex">Cinemaryを検索する</h2>
432
+
433
+ <hr class="separate" />
434
+
435
+ <div class="search-main-contens flex">
436
+
437
+ <input
438
+
439
+ placeholder="例)アクション 恋愛 ミステリー SF ホラー ミュージカル etc.."
440
+
441
+ class="search-main-item"
442
+
443
+ type="search"
444
+
445
+ v-model="inputValue"
446
+
447
+ />
448
+
449
+ </div>
450
+
451
+ ```
452
+
453
+
454
+
455
+ ```js
456
+
457
+ export default {
458
+
459
+ data() {
460
+
461
+ return {
462
+
463
+
464
+
465
+ ~ 省略 ~
466
+
467
+
468
+
469
+ },
470
+
471
+ props: {
472
+
473
+ value: {
474
+
475
+ type: String,
476
+
477
+ required: true
478
+
479
+ }
480
+
481
+ },
482
+
483
+ computed: {
484
+
485
+ inputValue: {
486
+
487
+ get() {
488
+
489
+ return this.value;
490
+
491
+ },
492
+
493
+ set(value) {
494
+
495
+ this.$emit("input", value);
496
+
497
+ }
498
+
499
+ }
500
+
501
+ },
502
+
503
+ searchData(value) {
504
+
505
+ this.$emit("searchData", value);
506
+
507
+ }
508
+
509
+ }
510
+
511
+ };
512
+
513
+
514
+
515
+ ```
516
+
517
+
518
+
519
+ ![イメージ説明](4454160ec20fc79de9b26b2aab953194.png)
520
+
521
+
522
+
523
+ また、以下のようなエラーが出ておりまして調べてみましたが赤で囲った箇所のエラー内容で
524
+
525
+ objectとなっている原因が分からなかった為、エラー内容を追記いたします・・
526
+
527
+
528
+
529
+ ```ここに言語を入力
530
+
531
+ [Vue warn]: Method "computed" has type "object" in the component definition. Did you reference the function correctly?
532
+
533
+ ```
534
+
535
+ メソッド "computed" は、コンポーネント定義のタイプ "object" を持っています。関数を正しく参照しましたか?
536
+
537
+
538
+
539
+ ---
540
+
541
+
542
+
543
+ 青色括弧につきましては、 filteredPostDataをdata()内で初期化してくださいとのことでしたので、
544
+
545
+ data()内で filteredPostData: []と初期化しました。

4

追記1

2021/06/07 02:48

投稿

TMTN
TMTN

スコア53

test CHANGED
File without changes
test CHANGED
@@ -217,3 +217,25 @@
217
217
  },
218
218
 
219
219
  ```
220
+
221
+
222
+
223
+ #追記1
224
+
225
+
226
+
227
+ 以下はコードになります。
228
+
229
+
230
+
231
+ ![イメージ説明](060d2a11b35a7a8e932f6c01d58d6f5c.png)
232
+
233
+
234
+
235
+ 実際にタイプした時の画面になります。
236
+
237
+ 入力したタイミングでリアルタイムで表示が切り替われば理想です。。
238
+
239
+
240
+
241
+ ![イメージ説明](94b35374a4fefecf891b36eecffdc5cc.png)

3

内容変更

2021/06/06 06:12

投稿

TMTN
TMTN

スコア53

test CHANGED
File without changes
test CHANGED
@@ -34,7 +34,17 @@
34
34
 
35
35
  入力フォームで入力された値はpost.vue(子コンポーネント)より取得はできているので
36
36
 
37
- あとは条件で絞って表示させるのですが、どのように条件を絞ってあげたらいいのか分からない状況です。
37
+ あとは以下を行って表示させると思うのですが、どのように条件を絞ってあげたらいいのか分からない状況です。
38
+
39
+
40
+
41
+ - valueを引数に渡しているので、valueをもとにデータを絞る
42
+
43
+ - Firestore内のフィールド「genre」でデータを絞る
44
+
45
+ - postData内を一度クリアしてあげて再pushしてあげる
46
+
47
+
38
48
 
39
49
 
40
50
 
@@ -178,7 +188,7 @@
178
188
 
179
189
  methods: {
180
190
 
181
- search() {
191
+ search(value) {
182
192
 
183
193
  firebase
184
194
 

2

内容変更

2021/06/05 16:00

投稿

TMTN
TMTN

スコア53

test CHANGED
File without changes
test CHANGED
@@ -2,17 +2,21 @@
2
2
 
3
3
 
4
4
 
5
- 、post.vue(子コンポーネント)にてinputタグで検索窓を作成し、
5
+ 、post.vue(子コンポーネント)にてinputタグで入力フォームを作成し、
6
-
6
+
7
- そこで入力された値を$emitでboard.vue(親コンポーネント)に渡しています。
7
+ そこで入力された値を$emitでboard.vue(親コンポーネント)に渡しています。(値を取得できていることは確認済)
8
+
9
+
10
+
8
-
11
+ ![イメージ説明](03ba777fc4cc8ad0342800dfe4bd55e5.png)
12
+
13
+
14
+
9
-
15
+ 通常投稿一覧に投稿されたpostを「時間(降順)」で表示させておりますが、
10
-
16
+
11
- そのデータをもとに「ジャンル」という値で絞って再表示させたいです。
17
+ post.vue(子コンポーネント)から受けたデータをもとに「ジャンル」という値で絞って再表示させたいです。
12
-
13
-
14
-
18
+
15
- Firestoreのpostsコレクションのデータにはそれぞれgenreというフィールドに値は取得しております。
19
+ Firestoreのpostsコレクションのデータにはそれぞれgenreというフィールドに値は取得しております。
16
20
 
17
21
 
18
22
 
@@ -28,7 +32,7 @@
28
32
 
29
33
 
30
34
 
31
- 検索窓で入力された値はpost.vue(子コンポーネント)より取得はできているので
35
+ 入力フォームで入力された値はpost.vue(子コンポーネント)より取得はできているので
32
36
 
33
37
  あとは条件で絞って表示させるのですが、どのように条件を絞ってあげたらいいのか分からない状況です。
34
38
 

1

内容変更

2021/06/05 15:54

投稿

TMTN
TMTN

スコア53

test CHANGED
File without changes
test CHANGED
@@ -182,6 +182,8 @@
182
182
 
183
183
  .collection("posts")
184
184
 
185
+ .orderBy("genre")
186
+
185
187
  .orderBy("time", "desc")
186
188
 
187
189
  .get()