飲食店の予約システムをvue.cliにて実装中です。店舗一覧ページにてユーザーが検索フォームに値を入力した際、検索条件が店舗データと合うものだけを表示したいと思っております(indexOfを使用しております)。
検索フォームには①エリアで検索(東京・大阪・福岡) ②ジャンルで検索(寿司・焼肉・居酒屋・イタリアン・ラーメン) ③検索キーワードから検索 の3点から検索可能です。①、②はselectタグ、③はinputタグを使用中です。
*現状
③のinputタグから店名を入力すると反映されますが、①②でエリアやジャンルを選択しても反映されません。
(店舗データはテストで入れてるだけですので5つ程度しか入っておりません)
*試したこと
select>optionタグ内のvalueの値とscript内のdata()の値を同じにしてみましたが反映されませんでした。
ご教授頂けますと幸いです。
vue
1 2<template> 3 <div class="home"> 4 <div class="flex"> 5 <div class="header left"> 6 <commonHeader /> 7 </div> 8 <div class="search-container right"> 9 <div class="flex"> 10 <select name="shopsArea" id="" v-model="searchArea"> 11 <option value="">エリアで検索</option> 12 <option value="東京">東京</option> 13 <option value="大阪">大阪</option> 14 <option value="福岡">福岡</option> 15 </select> 16 <select name="shopsGenre" id="" v-model="searchGenre"> 17 <option value="">ジャンルで検索</option> 18 <option value="sushi">寿司</option> 19 <option value="yakiniku">焼肉</option> 20 <option value="izakaya">居酒屋</option> 21 <option value="italian">イタリアン</option> 22 <option value="ra-men">ラーメン</option> 23 </select> 24 <input type="text" v-model="searchWords" placeholder="検索"> 25 </div> 26 </div> 27 </div> 28 <div class="shops" id="shop-flex"> 29 <div class="shop" v-for="shop in filteredShops" :key="shop.id"> 30 <img :src="shop.url"> 31 <div class="shop-info"> 32 <p class="shop-name">{{ shop.name }}</p> 33 <div class="area-genre"> 34 <span class="shop-area">#{{ shop.area }}</span> 35 <span class="shop-genre">#{{ shop.genre }}</span> 36 </div> 37 <div class="flex"> 38 <button @click="shopDetail(shop.id)">詳しく見る</button> 39 <div class="LikesIcon" @click.stop="toggleHeart(100)"> 40 <i class="fa-heart LikesIcon-fa-heart" :class="{ heart: isActive , fas: isActive ,far: !isActive }"></i> 41 </div> 42 </div> 43 </div> 44 </div> 45 </div> 46 </div> 47</template> 48 49<script> 50import commonHeader from '../components/commonHeader'; 51export default { 52 data() { 53 return { 54 searchArea: '', 55 searchGenre: '', 56 searchWords: '', 57 isActive: false, 58 shops: [ 59 { 60 id: 1, 61 name: '仙人', 62 area: '東京', 63 genre: '寿司', 64 url: 'https://coachtech-matter.s3-ap-northeast-1.amazonaws.com/image/sushi.jpg' 65 }, 66 { 67 id: 2, 68 name: '仙人', 69 area: '大阪', 70 genre: '焼肉', 71 url: 'https://coachtech-matter.s3-ap-northeast-1.amazonaws.com/image/sushi.jpg' 72 }, 73 { 74 id: 3, 75 name: '仙人', 76 area: '福岡', 77 genre: 'イタリアン', 78 url: 'https://coachtech-matter.s3-ap-northeast-1.amazonaws.com/image/sushi.jpg' 79 }, 80 { 81 id: 4, 82 name: '仙人', 83 area: '東京', 84 genre: '寿司', 85 url: 'https://coachtech-matter.s3-ap-northeast-1.amazonaws.com/image/sushi.jpg' 86 }, 87 { 88 id: 5, 89 name: '仙人', 90 area: '大阪', 91 genre: '寿司', 92 url: 'https://coachtech-matter.s3-ap-northeast-1.amazonaws.com/image/sushi.jpg' 93 }, 94 ], 95 }; 96 }, 97 components: { 98 commonHeader 99 }, 100 methods: { 101 toggleHeart() { 102 if (!this.isActive) { 103 this.isActive = true; 104 } else { 105 this.isActive = false; 106 } 107 }, 108 shopDetail(shop_id) { 109 this.$router.push({path: '/shopdetail/'+ shop_id, params:{shop_id:shop_id}}); 110 } 111 }, 112 computed: { 113 filteredShops() { 114 const shopsArray = []; 115 for (const i in this.shops) { 116 const shop = this.shops[i]; 117 if (shop.area.indexOf(this.searchArea) !== -1 || 118 shop.genre.indexOf(this.searchGenre) !== -1 || 119 shop.name.indexOf(this.searchWords) !== -1) { 120 shopsArray.push(shop); 121 } 122 } 123 return shopsArray; 124 } 125 } 126}; 127</script>
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/06/01 11:58
2021/06/01 12:14
2021/06/02 14:31
2021/06/02 23:54