質問編集履歴

3

chrome 拡張機能の gif を載せました。

2021/09/26 09:44

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -148,6 +148,8 @@
148
148
 
149
149
  【コードを追加】
150
150
 
151
+ 既定の文字数を超えているのでCSSは必要な個所以外は省略しています。
152
+
151
153
  ```
152
154
 
153
155
  <template>
@@ -374,326 +376,146 @@
374
376
 
375
377
  <style scoped>
376
378
 
377
- input[type="text"] {
378
-
379
- box-sizing: border-box;
379
+ .child-wrapper{
380
-
380
+
381
- width: 100%;
381
+ display: table;
382
-
382
+
383
- font-size: 16px;
383
+ justify-content: center;
384
-
385
- transform: scale(calc(14 / 16));
386
384
 
387
385
  }
388
386
 
389
- .accordion-container{
387
+ .string{
390
-
388
+
391
- text-align: center;
389
+ display: table-cell;
392
-
390
+
393
- width:0px;
391
+ width: 200px;
394
-
395
- position:fixed;
392
+
396
-
397
- top:50px;
398
-
399
- bottom: 50px;
393
+ color: dimgray;
400
-
401
- right:0px;
402
-
403
- transform:translate(0%, 0%);
404
394
 
405
395
  }
406
396
 
397
+ .toggle{
398
+
399
+ display: table-cell;
400
+
401
+ background-image: url(./../assets/toggle.png);
402
+
407
- .accordion-container.on{
403
+ background-color: #020e7a;
408
-
409
- text-align: center;
404
+
410
-
411
- width:300px;
405
+ width: 50px;
412
-
413
- position:fixed;
406
+
414
-
415
- top:50px;
416
-
417
- bottom: 50px;
407
+ height: 24px;
418
-
419
- left:0px;
408
+
420
-
421
- transform:translate(0%, 0%);
409
+ background-position: 0px 0px;
422
410
 
423
411
  }
424
412
 
425
- .parent-accordion-header {
413
+ .toggle.on{
426
-
427
- transform:translateX(0px);
414
+
428
-
429
- transition:opacity 1s,transform 0.2s;
430
-
431
- background-color: #020e7a;
415
+ background-position: 0px -24px;
432
-
433
- color: white;
434
-
435
- text-align: center;
436
-
437
- height:30px;
438
-
439
- width:300px;
440
-
441
- position:relative;
442
-
443
- bottom:0;
444
-
445
- left:0px;
446
-
447
- box-shadow: 0 0 1px black;
448
416
 
449
417
  }
450
418
 
451
- .parent-accordion-header.on {
452
-
453
- transform:translateX(-100%);
454
-
455
- }
456
-
457
- .parent-header-content{
458
-
459
- position: relative;
460
-
461
- top: 5px;
462
-
463
- user-select: none;
464
-
465
- }
466
-
467
- .parent-header-close {
468
-
469
- text-align: right;
470
-
471
- }
472
-
473
- .close {
474
-
475
- background-color: #020e7a;
476
-
477
- position: absolute;
478
-
479
- top: 0px;
480
-
481
- right: 0px;
482
-
483
- padding-top: 3px;
484
-
485
- margin: 0 10px;
486
-
487
- text-align: center;
488
-
489
- width: 10px;
490
-
491
- }
492
-
493
- .parent-accordion{
494
-
495
- transform:translateX(0px);
496
-
497
- transition:opacity 1s,transform 0.2s;
498
-
499
- padding: 0px 0px 10px 0px;
500
-
501
- background-color: white;
502
-
503
- text-align: center;
504
-
505
- width:300px;
506
-
507
- position:fixed;
508
-
509
- top:30px;
510
-
511
- left:0px;
512
-
513
- bottom: 0px;
514
-
515
- box-shadow: 0 0 2px black;
516
-
517
- overflow-y: scroll;
518
-
519
- }
520
-
521
- .parent-accordion.on{
522
-
523
- transform:translateX(-100%);
524
-
525
- }
526
-
527
- .child-accordion-container{
528
-
529
- background-color: white;
530
-
531
- text-align: center;
532
-
533
- width:90%;
534
-
535
- margin: auto;
536
-
537
- box-shadow: 0 0 2px black;
538
-
539
- }
540
-
541
- .child-accordion-header {
542
-
543
- background-color: #020e7a;
544
-
545
- color: white;
546
-
547
- margin: 10px 0px 0px 0px;
548
-
549
- height:30px;
550
-
551
- position:relative;
552
-
553
- }
554
-
555
- .child-accordion{
556
-
557
- padding: 5px;
558
-
559
- }
560
-
561
- .child-header-content{
562
-
563
- position: relative;
564
-
565
- top: 5px;
566
-
567
- user-select: none;
568
-
569
- }
570
-
571
- .child-content{
572
-
573
- margin: auto;
574
-
575
- text-align: center;
576
-
577
- height: 30px;
578
-
579
- position: relative;
580
-
581
- top:5px;
582
-
583
- }
584
-
585
- .search-container{
586
-
587
- display: flex;
588
-
589
- justify-content: center;
590
-
591
- }
592
-
593
- .search-place{
594
-
595
- margin: 0px 0px 5px 25px;
596
-
597
- width: 200px;
598
-
599
- outline:none;
600
-
601
- border: none;
602
-
603
- }
604
-
605
- .search-place-button{
606
-
607
- background-color: white;
608
-
609
- margin: 0px 0px 5px 0px;
610
-
611
- right: 0px;
612
-
613
- position: relative;
614
-
615
- right: 0px;
616
-
617
- width: 50px;
618
-
619
- text-align: center;
620
-
621
- height: 25px;
622
-
623
- border: none;
624
-
625
- outline:none;
626
-
627
- }
628
-
629
- .remove-search-place{
630
-
631
- color: dimgray;
632
-
633
- background-color: white;
634
-
635
- position: relative;
636
-
637
- right: 0px;
638
-
639
- width: 50px;
640
-
641
- text-align: center;
642
-
643
- height: 25px;
644
-
645
- border: none;
646
-
647
- outline:none;
648
-
649
- }
650
-
651
- .icon{
652
-
653
- width: 45%;
654
-
655
- }
656
-
657
- .child-wrapper{
658
-
659
- display: table;
660
-
661
- justify-content: center;
662
-
663
- }
664
-
665
- .string{
666
-
667
- display: table-cell;
668
-
669
- width: 200px;
670
-
671
- color: dimgray;
672
-
673
- }
674
-
675
- .toggle{
676
-
677
- display: table-cell;
678
-
679
- background-image: url(./../assets/toggle.png);
680
-
681
- background-color: #020e7a;
682
-
683
- width: 50px;
684
-
685
- height: 24px;
686
-
687
- background-position: 0px 0px;
688
-
689
- }
690
-
691
- .toggle.on{
692
-
693
- background-position: 0px -24px;
694
-
695
- }
696
-
697
419
  </style>
698
420
 
699
421
  ```
422
+
423
+
424
+
425
+ 上記のコードだと下記の挙動を取ります。
426
+
427
+ ・chrome の拡張機能で vue を確認するとすべての値に変化がありません。
428
+
429
+ ・しかしAPI自体は想定するレスポンスを返しているので tags[] の中身は正常に更新されているようです。
430
+
431
+ ![イメージ説明](eaef9779e041353f8ec26676e058f3fa.gif)
432
+
433
+
434
+
435
+
436
+
437
+ 下記のようなコードを追加して、toggle を変更したときに必ず変わる値を HTML にバインドすると、正常に動作します。今回の場合はアクティブのタグトグルをカウントしてみます。
438
+
439
+ 【追加コード】
440
+
441
+ HTMLに値をバインドする。
442
+
443
+ ```javascript
444
+
445
+ ...
446
+
447
+ <div class="child-header-content">タグ検索({{ isActiveTagToggleCount }})</div>
448
+
449
+ ...
450
+
451
+ ```
452
+
453
+
454
+
455
+ isActiveTagToggleCount プロパティを追加。
456
+
457
+ ```
458
+
459
+ ...
460
+
461
+ data() {
462
+
463
+ return {
464
+
465
+ tags: [],
466
+
467
+ isOpenSearchMenu: false,
468
+
469
+ isOpenSearchAccordion: true,
470
+
471
+ isOpenTagAccordion: true,
472
+
473
+ filterParams: {},
474
+
475
+ error: null,
476
+
477
+ searchText: null,
478
+
479
+ isActiveTagToggleCount: 0,
480
+
481
+ }
482
+
483
+ },
484
+
485
+ ...
486
+
487
+ ```
488
+
489
+
490
+
491
+ トグルを変更したらカウントの増減を行う。
492
+
493
+ ```
494
+
495
+ ...
496
+
497
+ changeTagToggle: function(i) {
498
+
499
+ this.tags[i]["is_active"] = !this.tags[i]["is_active"]
500
+
501
+ if(this.tags[i]["is_active"]) {
502
+
503
+ this.isActiveTagToggleCount += 1;
504
+
505
+ }else{
506
+
507
+ this.isActiveTagToggleCount -= 1;
508
+
509
+ }
510
+
511
+ this.resetPoint()
512
+
513
+ },
514
+
515
+ ...
516
+
517
+ ```
518
+
519
+ 上記の通りに修正すると下記の通りに chrome の拡張機能上でも値が書き換わるのが確認できます。
520
+
521
+ ![イメージ説明](473cca61cd2dfbfe4bb9b23392d99c35.gif)

2

コードをすべて記載いたしました。

2021/09/26 09:43

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -141,3 +141,559 @@
141
141
  なぜ「tagToggl」プロパティを切り替える必要があるのかどなたかご教授頂ければ幸いです。
142
142
 
143
143
  以上よろしくお願いいたします。
144
+
145
+
146
+
147
+
148
+
149
+ 【コードを追加】
150
+
151
+ ```
152
+
153
+ <template>
154
+
155
+ <div class="accordion-container">
156
+
157
+ <div class="parent-accordion-header" v-bind:class="{on: isOpenSearchMenu}">
158
+
159
+ <div class="parent-header-content" v-on:click="searchMenu">検索メニュー</div>
160
+
161
+ <div class="parent-header-close">
162
+
163
+ <div class="close">
164
+
165
+ <div v-on:click="searchMenu">x</div>
166
+
167
+ </div>
168
+
169
+ </div>
170
+
171
+ </div>
172
+
173
+ <div class="parent-accordion" v-bind:class="{on: isOpenSearchMenu}">
174
+
175
+ <div class="child-accordion-container">
176
+
177
+ <div class="child-accordion-header" v-on:click="isOpenSearchAccordion =! isOpenSearchAccordion">
178
+
179
+ <div class="child-header-content">地名検索</div>
180
+
181
+ </div>
182
+
183
+ <div class="child-accordion" v-if="isOpenSearchAccordion">
184
+
185
+ <div class="child-content">
186
+
187
+ <div class="search-container">
188
+
189
+ <button class="search-place-button" v-on:click="searchPlace"><img class="icon" src="@/assets/search.png"></button>
190
+
191
+ <input type="text" id="search-text" class="search-place" placeholder="地名か住所から検索" v-model="searchText" v-on:keyup.enter.exact="searchPlace">
192
+
193
+ <button class="remove-search-place" v-if="searchText" v-on:click="removeSearchText()">x</button>
194
+
195
+ </div>
196
+
197
+ </div>
198
+
199
+ </div>
200
+
201
+ </div>
202
+
203
+ <div class="child-accordion-container">
204
+
205
+ <div class="child-accordion-header" v-on:click="isOpenTagAccordion =! isOpenTagAccordion">
206
+
207
+ <div class="child-header-content">タグ検索</div>
208
+
209
+ </div>
210
+
211
+ <div class="child-accordion" v-if="isOpenTagAccordion">
212
+
213
+ <div class="child-content" v-for="(tag, i) in tags" :key="tag.id">
214
+
215
+ <div class="child-wrapper">
216
+
217
+ <div class="string">{{ tag.name }}</div>
218
+
219
+ <div class="toggle" v-bind:class="{on: tag.is_active}" v-on:click="changeTagToggle(i)"></div>
220
+
221
+ </div>
222
+
223
+ </div>
224
+
225
+ </div>
226
+
227
+ </div>
228
+
229
+ </div>
230
+
231
+ </div>
232
+
233
+ </template>
234
+
235
+ <script>
236
+
237
+ export default {
238
+
239
+ name: 'searchMenu',
240
+
241
+ components: {
242
+
243
+ },
244
+
245
+ data() {
246
+
247
+ return {
248
+
249
+ tags: [],
250
+
251
+ isOpenSearchMenu: false,
252
+
253
+ isOpenSearchAccordion: true,
254
+
255
+ isOpenTagAccordion: true,
256
+
257
+ filterParams: {},
258
+
259
+ error: null,
260
+
261
+ searchText: null,
262
+
263
+ }
264
+
265
+ },
266
+
267
+ mounted (){
268
+
269
+ this.fetchTags()
270
+
271
+ },
272
+
273
+ methods: {
274
+
275
+ searchMenu: function() {
276
+
277
+ this.isOpenSearchMenu = !this.isOpenSearchMenu;
278
+
279
+ },
280
+
281
+ closeSearchMenu: function(){
282
+
283
+ this.isOpenSearchMenu = false;
284
+
285
+ },
286
+
287
+ searchPlace: function(){
288
+
289
+ this.$emit("search-place")
290
+
291
+ },
292
+
293
+ fetchTags: async function (){
294
+
295
+ await this.axios.get(
296
+
297
+ '/map/api/tags/'
298
+
299
+ ).then(
300
+
301
+ (response) => {
302
+
303
+ this.tags = response.data.tags;
304
+
305
+ for(let i = 0; i < this.tags.length; i++){
306
+
307
+ this.tags[i]["is_active"] = false;
308
+
309
+ }
310
+
311
+ console.log(this.tags)
312
+
313
+ }
314
+
315
+ ).catch(
316
+
317
+ (error) => {
318
+
319
+ this.$toasted.error("データの取得に失敗しました。");
320
+
321
+ console.log(error)
322
+
323
+ }
324
+
325
+ )
326
+
327
+ },
328
+
329
+ removeSearchText: function(){
330
+
331
+ this.searchText = null;
332
+
333
+ },
334
+
335
+ changeTagToggle: function(i) {
336
+
337
+ this.$set(this.tags[i], "is_active", !this.tags[i]["is_active"]);
338
+
339
+ this.resetPoint()
340
+
341
+ },
342
+
343
+ resetPoint(){
344
+
345
+ /**
346
+
347
+ * ?[タグ名]=true の形式でフィルタとなるパラメータを作成しポイントを作成し直す。
348
+
349
+ */
350
+
351
+ this.filterParams = {};
352
+
353
+ for (let i = 0; i < this.tags.length; i++) {
354
+
355
+ if (this.tags[i]["is_active"]) {
356
+
357
+ let parameter = this.tags[i].name
358
+
359
+ this.filterParams[parameter] = true;
360
+
361
+ }
362
+
363
+ }
364
+
365
+ this.$emit('reset-points', this.filterParams)
366
+
367
+ }
368
+
369
+ }
370
+
371
+ }
372
+
373
+ </script>
374
+
375
+ <style scoped>
376
+
377
+ input[type="text"] {
378
+
379
+ box-sizing: border-box;
380
+
381
+ width: 100%;
382
+
383
+ font-size: 16px;
384
+
385
+ transform: scale(calc(14 / 16));
386
+
387
+ }
388
+
389
+ .accordion-container{
390
+
391
+ text-align: center;
392
+
393
+ width:0px;
394
+
395
+ position:fixed;
396
+
397
+ top:50px;
398
+
399
+ bottom: 50px;
400
+
401
+ right:0px;
402
+
403
+ transform:translate(0%, 0%);
404
+
405
+ }
406
+
407
+ .accordion-container.on{
408
+
409
+ text-align: center;
410
+
411
+ width:300px;
412
+
413
+ position:fixed;
414
+
415
+ top:50px;
416
+
417
+ bottom: 50px;
418
+
419
+ left:0px;
420
+
421
+ transform:translate(0%, 0%);
422
+
423
+ }
424
+
425
+ .parent-accordion-header {
426
+
427
+ transform:translateX(0px);
428
+
429
+ transition:opacity 1s,transform 0.2s;
430
+
431
+ background-color: #020e7a;
432
+
433
+ color: white;
434
+
435
+ text-align: center;
436
+
437
+ height:30px;
438
+
439
+ width:300px;
440
+
441
+ position:relative;
442
+
443
+ bottom:0;
444
+
445
+ left:0px;
446
+
447
+ box-shadow: 0 0 1px black;
448
+
449
+ }
450
+
451
+ .parent-accordion-header.on {
452
+
453
+ transform:translateX(-100%);
454
+
455
+ }
456
+
457
+ .parent-header-content{
458
+
459
+ position: relative;
460
+
461
+ top: 5px;
462
+
463
+ user-select: none;
464
+
465
+ }
466
+
467
+ .parent-header-close {
468
+
469
+ text-align: right;
470
+
471
+ }
472
+
473
+ .close {
474
+
475
+ background-color: #020e7a;
476
+
477
+ position: absolute;
478
+
479
+ top: 0px;
480
+
481
+ right: 0px;
482
+
483
+ padding-top: 3px;
484
+
485
+ margin: 0 10px;
486
+
487
+ text-align: center;
488
+
489
+ width: 10px;
490
+
491
+ }
492
+
493
+ .parent-accordion{
494
+
495
+ transform:translateX(0px);
496
+
497
+ transition:opacity 1s,transform 0.2s;
498
+
499
+ padding: 0px 0px 10px 0px;
500
+
501
+ background-color: white;
502
+
503
+ text-align: center;
504
+
505
+ width:300px;
506
+
507
+ position:fixed;
508
+
509
+ top:30px;
510
+
511
+ left:0px;
512
+
513
+ bottom: 0px;
514
+
515
+ box-shadow: 0 0 2px black;
516
+
517
+ overflow-y: scroll;
518
+
519
+ }
520
+
521
+ .parent-accordion.on{
522
+
523
+ transform:translateX(-100%);
524
+
525
+ }
526
+
527
+ .child-accordion-container{
528
+
529
+ background-color: white;
530
+
531
+ text-align: center;
532
+
533
+ width:90%;
534
+
535
+ margin: auto;
536
+
537
+ box-shadow: 0 0 2px black;
538
+
539
+ }
540
+
541
+ .child-accordion-header {
542
+
543
+ background-color: #020e7a;
544
+
545
+ color: white;
546
+
547
+ margin: 10px 0px 0px 0px;
548
+
549
+ height:30px;
550
+
551
+ position:relative;
552
+
553
+ }
554
+
555
+ .child-accordion{
556
+
557
+ padding: 5px;
558
+
559
+ }
560
+
561
+ .child-header-content{
562
+
563
+ position: relative;
564
+
565
+ top: 5px;
566
+
567
+ user-select: none;
568
+
569
+ }
570
+
571
+ .child-content{
572
+
573
+ margin: auto;
574
+
575
+ text-align: center;
576
+
577
+ height: 30px;
578
+
579
+ position: relative;
580
+
581
+ top:5px;
582
+
583
+ }
584
+
585
+ .search-container{
586
+
587
+ display: flex;
588
+
589
+ justify-content: center;
590
+
591
+ }
592
+
593
+ .search-place{
594
+
595
+ margin: 0px 0px 5px 25px;
596
+
597
+ width: 200px;
598
+
599
+ outline:none;
600
+
601
+ border: none;
602
+
603
+ }
604
+
605
+ .search-place-button{
606
+
607
+ background-color: white;
608
+
609
+ margin: 0px 0px 5px 0px;
610
+
611
+ right: 0px;
612
+
613
+ position: relative;
614
+
615
+ right: 0px;
616
+
617
+ width: 50px;
618
+
619
+ text-align: center;
620
+
621
+ height: 25px;
622
+
623
+ border: none;
624
+
625
+ outline:none;
626
+
627
+ }
628
+
629
+ .remove-search-place{
630
+
631
+ color: dimgray;
632
+
633
+ background-color: white;
634
+
635
+ position: relative;
636
+
637
+ right: 0px;
638
+
639
+ width: 50px;
640
+
641
+ text-align: center;
642
+
643
+ height: 25px;
644
+
645
+ border: none;
646
+
647
+ outline:none;
648
+
649
+ }
650
+
651
+ .icon{
652
+
653
+ width: 45%;
654
+
655
+ }
656
+
657
+ .child-wrapper{
658
+
659
+ display: table;
660
+
661
+ justify-content: center;
662
+
663
+ }
664
+
665
+ .string{
666
+
667
+ display: table-cell;
668
+
669
+ width: 200px;
670
+
671
+ color: dimgray;
672
+
673
+ }
674
+
675
+ .toggle{
676
+
677
+ display: table-cell;
678
+
679
+ background-image: url(./../assets/toggle.png);
680
+
681
+ background-color: #020e7a;
682
+
683
+ width: 50px;
684
+
685
+ height: 24px;
686
+
687
+ background-position: 0px 0px;
688
+
689
+ }
690
+
691
+ .toggle.on{
692
+
693
+ background-position: 0px -24px;
694
+
695
+ }
696
+
697
+ </style>
698
+
699
+ ```

1

id の記載ミスを修正

2021/09/26 09:17

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -110,7 +110,7 @@
110
110
 
111
111
  {
112
112
 
113
- id: 2,
113
+ id: 1,
114
114
 
115
115
  is_active: true,
116
116