質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Vue.js

Vue.jsは、Webアプリケーションのインターフェースを構築するためのオープンソースJavaScriptフレームワークです。

Vue CLI

Vue CLIは、Vue.jsでアプリケーション開発を行うためのコマンドラインインタフェース(CLI)に基づいた開発ツールです。インタラクティブなプロジェクトの雛形や設定なしで使用できるプロトタイプの作成など、さまざまな機能が用意されています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

1回答

1026閲覧

vue.cliにてリアルタイム検索を実装したい

abrt29

総合スコア12

Vue.js

Vue.jsは、Webアプリケーションのインターフェースを構築するためのオープンソースJavaScriptフレームワークです。

Vue CLI

Vue CLIは、Vue.jsでアプリケーション開発を行うためのコマンドラインインタフェース(CLI)に基づいた開発ツールです。インタラクティブなプロジェクトの雛形や設定なしで使用できるプロトタイプの作成など、さまざまな機能が用意されています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2021/05/31 21:56

飲食店の予約システムを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>

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

良いやり方ではないかもしれませんが、computedの再計算タイミングが、一度計算したものをキャッシュしてしまうので
methodsに入れることで解決できるかと思います。

投稿2021/05/31 22:44

m2l

総合スコア318

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

abrt29

2021/06/01 11:58

返事が遅くなり申し訳ございません。 試してみたのですが、実行できないどころかfor文で表示させた店舗一覧も消えてしまいました。 以下、追記です。 inputタグからだと表示できると思っておりましたが、今試したらうまくいきませんでした。
m2l

2021/06/01 12:14

説明不足で申し訳ございません。 @inputでmethodsを呼び出すところをお答えできておりませんでした。 コメントの中で恐縮ではございますが、下記をイメージしております。 --- <template> <div class="home"> <div class="flex"> <div class="header left"> <commonHeader /> </div> <div class="search-container right"> <div class="flex"> <select name="shopsArea" @input="filteredShops" id="" v-model="searchArea"> <option value="">エリアで検索</option> <option value="東京">東京</option> <option value="大阪">大阪</option> <option value="福岡">福岡</option> </select> <select name="shopsGenre" @input="filteredShops" id="" v-model="searchGenre"> <option value="">ジャンルで検索</option> <option value="sushi">寿司</option> <option value="yakiniku">焼肉</option> <option value="izakaya">居酒屋</option> <option value="italian">イタリアン</option> <option value="ra-men">ラーメン</option> </select> <input type="text" v-model="searchWords" @input="filteredShops" placeholder="検索"> </div> </div> </div> <div class="shops" id="shop-flex"> <div class="shop" v-for="shop in filteredShops" :key="shop.id"> <img :src="shop.url"> <div class="shop-info"> <p class="shop-name">{{ shop.name }}</p> <div class="area-genre"> <span class="shop-area">#{{ shop.area }}</span> <span class="shop-genre">#{{ shop.genre }}</span> </div> <div class="flex"> <button @click="shopDetail(shop.id)">詳しく見る</button> <div class="LikesIcon" @click.stop="toggleHeart(100)"> <i class="fa-heart LikesIcon-fa-heart" :class="{ heart: isActive , fas: isActive ,far: !isActive }"></i> </div> </div> </div> </div> </div> </div> </template> <script> import commonHeader from '../components/commonHeader'; export default { data() { return { searchArea: '', searchGenre: '', searchWords: '', isActive: false, shops: [ { id: 1, name: '仙人', area: '東京', genre: '寿司', url: 'https://coachtech-matter.s3-ap-northeast-1.amazonaws.com/image/sushi.jpg' }, { id: 2, name: '仙人', area: '大阪', genre: '焼肉', url: 'https://coachtech-matter.s3-ap-northeast-1.amazonaws.com/image/sushi.jpg' }, { id: 3, name: '仙人', area: '福岡', genre: 'イタリアン', url: 'https://coachtech-matter.s3-ap-northeast-1.amazonaws.com/image/sushi.jpg' }, { id: 4, name: '仙人', area: '東京', genre: '寿司', url: 'https://coachtech-matter.s3-ap-northeast-1.amazonaws.com/image/sushi.jpg' }, { id: 5, name: '仙人', area: '大阪', genre: '寿司', url: 'https://coachtech-matter.s3-ap-northeast-1.amazonaws.com/image/sushi.jpg' }, ], }; }, components: { commonHeader }, methods: { toggleHeart() { if (!this.isActive) { this.isActive = true; } else { this.isActive = false; } }, shopDetail(shop_id) { this.$router.push({path: '/shopdetail/'+ shop_id, params:{shop_id:shop_id}}); }, filteredShops() { // forループでも大丈夫です const shopsArray = this.shops.filter( v => v.area.indexOf(this.searchArea) !== -1 || v.genre.indexOf(this.searchGenre) !== -1 || v.name.indexOf(this.searchWords) !== -1 ); return filteredShops; } }, }; </script> ---
abrt29

2021/06/02 14:31

m2lさん。 ご教授いただいていたのに今気づきました。申し訳ございません。 私なりに調べてif文の中身を||ではなく&&という風に条件を変えて実装したところ無事解決に至りました! inputを使用したり等は初めて知れたので試行錯誤しながら精進したいと思います! ご教授いただきありがとうございました!
m2l

2021/06/02 23:54

上手い回答ができず、申し訳ございませんでした。 解決できて、良かったです!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問