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

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

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

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

Vuex

Vuexは、Vue.js アプリケーションのための状態管理ライブラリです。アプリケーション内で使用するコンポーネントのための集中データストアを提供。コンポーネント同士でデータをやり取りし、処理のフローを一貫させたり、データの見通しを良くすることができます。

Vue CLI

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

Q&A

解決済

2回答

2597閲覧

Vuex+axiosで取得したデータに検索フィルターをかけたい

marion

総合スコア18

Vue.js

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

Vuex

Vuexは、Vue.js アプリケーションのための状態管理ライブラリです。アプリケーション内で使用するコンポーネントのための集中データストアを提供。コンポーネント同士でデータをやり取りし、処理のフローを一貫させたり、データの見通しを良くすることができます。

Vue CLI

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

0グッド

0クリップ

投稿2019/08/22 08:39

Vuex初学者です。よろしくお願いします。
Vuex+axiosで取得した本の一覧にフィルターをかけたいです。(リアルタイム検索)
vue-cli3を使用しています。

〜現状〜
・表示させるのはidとname
・1つのinputでフリーワード(idでもnameでも)検索させたい
・表示するだけならうまくいく
・vuex+axiosを使ってデータ取得しなければ検索がうまくいく

store.js

export default new Vuex.Store({ state: { books: [], }, actions: { loadBooks ({ commit }) { axios .get(URL_BASE) .then(r => r.data) .then(books => { commit('SET_BOOKS', books) }) } }, mutations: { SET_BOOKS (state, books) { state.books = books } } })

App.vue

<template lang="pug"> .home .search-wrap // 検索 input( type="text" v-model="searchQuery" placeholder="検索" ) .result-wrap // noresultの場合 div(v-show="books.length==0") span 結果はありません // 結果の表示 ul li(v-for="book in books") span {{ book.id }} span {{ book.name }} </div> </template> <script> import { mapState } from 'vuex' export default { name: 'home', components: { Btn }, data () { return { searchQuery: '' } }, // データの表示 mounted () { this.$store.dispatch('loadBooks') }, computed: { ...mapState([ 'books' ]), // 検索フィルター books() { return this.books.filter( book => { return this.searchQuery.toLowerCase() .split(/\s+/) .map( q => book.id.toLowerCase().indexOf(q) > -1 || book.name.toLowerCase().indexOf(q) > -1 ) .every( result => result === true ) }) } } } </script>

このようにすると以下のエラーが出ます。

"RangeError: Maximum call stack size exceeded"

表示した後で検索というのが良くない?
store.jsで最初からフィルターをつける必要がある?

など考えたのですが、よく分からず質問させていただきました。

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

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

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

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

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

guest

回答2

0

v-forでデータを回しているものに対してフィルターをかけるのではなく、フィルター内でデータを見るイメージで

v-for="data in filter"
filter() { return this.books.filter( data => { return this.searchQuery.toLowerCase() .split(/\s+/) .map( q => data.id.toLowerCase().indexOf(q) > -1 || data.name.toLowerCase().indexOf(q) > -1 ) .every( result => result === true ) }) }

としてあげたらできました。

投稿2019/08/29 07:38

marion

総合スコア18

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

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

0

ベストアンサー

computed に記載している books メソッドが自己参照していることがエラーの原因です。

...mapState(['books']) で展開した books を参照する意図だと思うのですが、名前が重複してしまっているため後に自分で記述している books() { ...

javascript

1return this.books ...

で参照され、結果循環参照となりスタックオーバーフローが発生しています。

何か別の名前にしてください。

投稿2019/08/22 10:34

R.Mizukami

総合スコア1086

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

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

marion

2019/08/31 18:23

名前を変更したらできました、ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問