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

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

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

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

Nuxt.js

Nuxt.jsは、ユニバーサルなSPAが開発可能なVue.jsベースのフレームワーク。UIの描画サポートに特化しており、SSRにおけるサーバーサイドとクライアントサイドのUIレンダリングなどさまざまな機能を持ちます。

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

JavaScript

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

Q&A

0回答

1565閲覧

Nuxt.jsでFilterで絞り込みした後にSortしたい

F_Yohei

総合スコア14

Vue.js

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

Nuxt.js

Nuxt.jsは、ユニバーサルなSPAが開発可能なVue.jsベースのフレームワーク。UIの描画サポートに特化しており、SSRにおけるサーバーサイドとクライアントサイドのUIレンダリングなどさまざまな機能を持ちます。

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

JavaScript

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

0グッド

0クリップ

投稿2021/04/09 12:45

前提・実現したいこと

個人的にNuxt.jsでアプリの開発をしています。

発生している問題

起きている現象は以下の通りです。
①絞り込み検索をした後に価格の安い順に並び替えすると同じ値の物が追加で表示されてしまう。
例)
ぶどうだけで絞り込みすると

ぶどう 2房 200円
ぶどう 1房 100円

という結果が表示される。この後に安い順で並べ替えすると

ぶどう 1房 100円
ぶどう 2房 200円
ぶどう 2房 200円
ぶどう 1房 100円

というようにSortする前の値が追加で一緒に表示されてしまう。

該当のソースコード

※問題のある部分だけ抜粋して掲載

HTML

1//商品一覧 2     <ul class="list_header"> 3 <li v-for="(product, index) in products" :key="index"> 4 <div>{{ product }}</div> 5 </li> 6 </ul> 7 8//カテゴリ検索 9 <ul> 10 <li v-for="(fruit, index) in fruits" :key="index" @click="filter($event)">{{ fruit }}</li> 11 </ul> 12 13//並び替え 14 <ul class="list_sort"> 15 <li @click="sortCheap">料金が安い順</li> 16 <li @click="sortExpensive">料金が高い順</li> 17 </ul>

javascript

1export default { 2 data: function() { 3 return { 4 }; 5 }, 6 computed: { 7 products() { 8 return this.$store.getters.getProducts; 9 }, 10 fruits() { 11 return this.$store.getters.getFruits; 12 }, 13 vegetables() { 14 return this.$store.getters.getVegetables; 15 } 16 }, 17 methods: { 18 // 価格が安い順に並び替え 19 sortCheap() { 20 const product = this.products; 21 const test = product.sort(function(a, b) { 22 if (a.price < b.price) return -1; 23 if (a.price > b.price) return 1; 24 return 0; 25 }); 26 }, 27 // 価格が高い順に並び替え 28 sortExpensive() { 29 const product = this.products; 30 product.sort(function(a, b) { 31 if (a.price < b.price) return 1; 32 if (a.price > b.price) return -1; 33 return 0; 34 }); 35 }, 36 //フィルター 37 filter(event) { 38 const value = event.target.innerHTML; 39 this.$store.dispatch("filter", value); 40 }, 41}

javascript

1import Vuex from "vuex"; 2 3const createStore = () => { 4 return new Vuex.Store({ 5 state: function() { 6 return { 7 products: [ 8 {user: '太郎', shop:'東京野菜市場', price: 100, name: 'トマト', quantity: 1, unit: '個', date: '2021年4月1日 午前11時30分'}, 9 {user: '花子', shop:'巣鴨野菜市場', price: 50, name: 'なす', quantity: 2, unit: '個', date: '2021年4月2日 午後12時30分'}, 10 {user: '一郎', shop:'新宿野菜市場', price: 30, name: 'りんご', quantity: 3, unit: '個', date: '2021年4月3日 午後13時30分'}, 11 {user: '二郎', shop:'杉並区野菜市場', price: 200, name: 'きゅうり', quantity: 2, unit: '個', date: '2021年4月4日 午後14時30分'}, 12 ], 13 fruits: [ 14 'すべて', 15 'りんご', 16 'いちご', 17 'ぶどう', 18 ], 19 vegetables: [ 20 'すべて', 21 'きゅうり', 22 'キャベツ', 23 ], 24 filterWord: {name: 'すべて'}, 25 filters: [] 26 } 27 }, 28 getters: { 29 getProducts: function(state) { 30 if(state.filterWord.name === 'すべて') { 31 return state.products; 32 } else { 33 const result = state.products.filter(function(value) { 34 return value.name === state.filterWord.name; 35 }); 36 result.forEach(product => { 37 state.filters.push(product); 38 }) 39 return state.filters; 40 } 41 }, 42 getFruits: function(state) { 43 return state.fruits; 44 }, 45 getVegetables: function(state) { 46 return state.vegetables; 47 } 48 }, 49 mutations: { 50 filter(state, value) { 51 state.filterWord.name = value; 52 } 53 }, 54 actions: { 55 filter({ commit }, value) { 56 commit('filter', value); 57 } 58 } 59 }) 60} 61 62export default createStore;

試したこと

↓Storeのindex.jsの自分で試してみた修正前と修正後のコードです。

javascript

1 //修正前 2 getters: { 3 getProducts: function(state) { 4 if(state.filterWord.name === 'すべて') { 5 return state.products; 6 } else { 7 return state.products.filter(function(value) { 8 return value.name === state.filterWord.name; 9 }); 10 } 11 }, 12} 13※修正前のコードだとフィルターはされるものの、返ってきた配列が恐らくcomputedの監視下に無い為、安い順に並び替えされない。 14それを解決すべく修正後のコードになりましたが今回のような問題に発展しました。 15 16 17//修正後 18 getters: { 19 getProducts: function(state) { 20 if(state.filterWord.name === 'すべて') { 21 return state.products; 22 } else { 23 const result = state.products.filter(function(value) { 24 return value.name === state.filterWord.name; 25 }); 26 result.forEach(product => { 27 state.filters.push(product); 28 }) 29 return state.filters; 30 } 31 }, 32}

何かいい方法があればご教授いただければと思い質問させていただきました????‍♂️
よろしくお願い致します。

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

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

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

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

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

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問