トグルスイッチを配列から作成しています。
不要だと思われるプロパティがあるのですがそれを削除するとなぜか動きません。
それがなぜ必要なのか、また不要そうなプロパティを削除しもっときれいに書く方法があればご教授頂きたいです。
下記「?」がついているコードが不要かと思われるコードで 3 箇所あります。
html
1<div class="child-content" v-for="(tag, i) in tags" :key="tag.id"> 2 <div class="child-wrapper"> 3 <div class="string">{{ tag.name }}</div> 4 <div v-bind:class="{on: tagToggle}"></div> <!-- ? --> 5 <div class="toggle" v-bind:class="{on: tag.is_active}" v-on:click="changeTagToggle(i)"></div> 6 </div> 7</div>
javascript
1... 2data() { 3 return { 4 ... 5 tags: [], 6 tagToggle: true, //? 7 ... 8 } 9}, 10... 11 12... 13changeTagToggle: function(i) { 14 this.tagToggle = !this.tagToggle //? 15 this.tags[i]["is_active"] = !this.tags[i]["is_active"] 16 this.resetPoint() 17}, 18... 19 20... 21.toggle{ 22 display: table-cell; 23 background-image: url(./../assets/toggle.png); 24 background-color: #020e7a; 25 width: 50px; 26 height: 24px; 27 background-position: 0px 0px; 28} 29.toggle.on{ 30 background-position: 0px -24px; 31} 32... 33
tags [] の中身は下記のような配列です。
json
1[ 2 { 3 id: 1, 4 is_active: true, 5 name: "hoge" 6 }, 7 { 8 id: 2, 9 is_active: true, 10 name: "fuga" 11 } 12 ... 13]
配列内の「is_active」の属性値を変えてスイッチの見た目を切り替えています。
なぜ「tagToggl」プロパティを切り替える必要があるのかどなたかご教授頂ければ幸いです。
以上よろしくお願いいたします。
【コードを追加】
既定の文字数を超えているのでCSSは必要な個所以外は省略しています。
<template> <div class="accordion-container"> <div class="parent-accordion-header" v-bind:class="{on: isOpenSearchMenu}"> <div class="parent-header-content" v-on:click="searchMenu">検索メニュー</div> <div class="parent-header-close"> <div class="close"> <div v-on:click="searchMenu">x</div> </div> </div> </div> <div class="parent-accordion" v-bind:class="{on: isOpenSearchMenu}"> <div class="child-accordion-container"> <div class="child-accordion-header" v-on:click="isOpenSearchAccordion =! isOpenSearchAccordion"> <div class="child-header-content">地名検索</div> </div> <div class="child-accordion" v-if="isOpenSearchAccordion"> <div class="child-content"> <div class="search-container"> <button class="search-place-button" v-on:click="searchPlace"><img class="icon" src="@/assets/search.png"></button> <input type="text" id="search-text" class="search-place" placeholder="地名か住所から検索" v-model="searchText" v-on:keyup.enter.exact="searchPlace"> <button class="remove-search-place" v-if="searchText" v-on:click="removeSearchText()">x</button> </div> </div> </div> </div> <div class="child-accordion-container"> <div class="child-accordion-header" v-on:click="isOpenTagAccordion =! isOpenTagAccordion"> <div class="child-header-content">タグ検索</div> </div> <div class="child-accordion" v-if="isOpenTagAccordion"> <div class="child-content" v-for="(tag, i) in tags" :key="tag.id"> <div class="child-wrapper"> <div class="string">{{ tag.name }}</div> <div class="toggle" v-bind:class="{on: tag.is_active}" v-on:click="changeTagToggle(i)"></div> </div> </div> </div> </div> </div> </div> </template> <script> export default { name: 'searchMenu', components: { }, data() { return { tags: [], isOpenSearchMenu: false, isOpenSearchAccordion: true, isOpenTagAccordion: true, filterParams: {}, error: null, searchText: null, } }, mounted (){ this.fetchTags() }, methods: { searchMenu: function() { this.isOpenSearchMenu = !this.isOpenSearchMenu; }, closeSearchMenu: function(){ this.isOpenSearchMenu = false; }, searchPlace: function(){ this.$emit("search-place") }, fetchTags: async function (){ await this.axios.get( '/map/api/tags/' ).then( (response) => { this.tags = response.data.tags; for(let i = 0; i < this.tags.length; i++){ this.tags[i]["is_active"] = false; } console.log(this.tags) } ).catch( (error) => { this.$toasted.error("データの取得に失敗しました。"); console.log(error) } ) }, removeSearchText: function(){ this.searchText = null; }, changeTagToggle: function(i) { this.$set(this.tags[i], "is_active", !this.tags[i]["is_active"]); this.resetPoint() }, resetPoint(){ /** * ?[タグ名]=true の形式でフィルタとなるパラメータを作成しポイントを作成し直す。 */ this.filterParams = {}; for (let i = 0; i < this.tags.length; i++) { if (this.tags[i]["is_active"]) { let parameter = this.tags[i].name this.filterParams[parameter] = true; } } this.$emit('reset-points', this.filterParams) } } } </script> <style scoped> .child-wrapper{ display: table; justify-content: center; } .string{ display: table-cell; width: 200px; color: dimgray; } .toggle{ display: table-cell; background-image: url(./../assets/toggle.png); background-color: #020e7a; width: 50px; height: 24px; background-position: 0px 0px; } .toggle.on{ background-position: 0px -24px; } </style>
上記のコードだと下記の挙動を取ります。
・chrome の拡張機能で vue を確認するとすべての値に変化がありません。
・しかしAPI自体は想定するレスポンスを返しているので tags[] の中身は正常に更新されているようです。
下記のようなコードを追加して、toggle を変更したときに必ず変わる値を HTML にバインドすると、正常に動作します。今回の場合はアクティブのタグトグルをカウントしてみます。
【追加コード】
HTMLに値をバインドする。
javascript
1... 2<div class="child-header-content">タグ検索({{ isActiveTagToggleCount }})</div> 3...
isActiveTagToggleCount プロパティを追加。
... data() { return { tags: [], isOpenSearchMenu: false, isOpenSearchAccordion: true, isOpenTagAccordion: true, filterParams: {}, error: null, searchText: null, isActiveTagToggleCount: 0, } }, ...
トグルを変更したらカウントの増減を行う。
... changeTagToggle: function(i) { this.tags[i]["is_active"] = !this.tags[i]["is_active"] if(this.tags[i]["is_active"]) { this.isActiveTagToggleCount += 1; }else{ this.isActiveTagToggleCount -= 1; } this.resetPoint() }, ...
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2021/09/26 06:01
退会済みユーザー
2021/09/26 09:21 編集
2021/09/27 02:14
退会済みユーザー
2021/09/27 04:16