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

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

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

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

JavaScript

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

Q&A

解決済

1回答

3009閲覧

state変更前のデータを取得したい。

退会済みユーザー

退会済みユーザー

総合スコア0

Vue.js

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

JavaScript

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

1グッド

1クリップ

投稿2017/11/24 08:28

編集2017/11/24 09:06

vue、vuexの質問です。

同じデータを2回、表示用データと検索用データとして入力しています。(store.jsのitemsとITEMS)
同じデータを2回入力せずに、1回の入力、1つのデータ(store.jsのitemsのみ)で

  • 検索窓に入力された時は、入力文字が含まれている全てのデータを返す
  • 検索窓が空の時は、全てのデータを返す

を実現するにはどうすればいいでしょうか?

環境

  • vue-cli
  • webpack
  • "pug": "^2.0.0-rc.4",
  • "pug-loader": "^2.3.0",
  • "vue": "^2.4.4",
  • "vuex": "^3.0.1"

構成

- src - assets - components - ItemCheckbox.vue - vuex - actions.js - getters.js - mutation_types.js - mutations.js - store.js - App.vue - main.js

##実装
mutations.js

lang

1import * as types from './mutation_types' 2 3export default { 4 [types.FILTER_ITEMS](state, data){ 5   /*state.items= state.items.fiter~ だと連続で検索できない*/ 6 state.items = state.ITEMS.filter(function(item){ 7 return item.name.indexOf(data.name) > -1 8 },this) 9 } 10}

store.js

lang

1import Vue from 'vue' 2import Vuex from 'vuex' 3import getters from './getters' 4import actions from './actions' 5import mutations from './mutations' 6 7Vue.use(Vuex) 8 9const state = { 10/* ここのデータをitemsのみにしたい*/ 11 items: [{"id":1,"name":"item1"}, 12 {"id":2,"name":"sample"}, 13 {"id":3,"name":"texttext"}], 14 ITEMS: [{"id":1,"name":"item1"}, 15 {"id":2,"name":"sample"}, 16 {"id":3,"name":"texttext"}] 17} 18 19export default new Vuex.Store({ 20 state, mutations, getters, actions 21})

ItemCheckbox.vue

lang

1<template lang="pug"> 2.form 3 input(type="search", @input="onInput({ name: $event.target.value })") 4 .form-checkbox(v-for="item in items", :key="item.id") 5 label 6 input(type="checkbox", :value="item.id", name="group[item_ids][]") 7 span.custom-control-description {{item.name}} 8</template> 9<script> 10 import { mapActions } from 'vuex' 11 export default{ 12 props: ['items', 'name'], 13 methods: mapActions({ 14 onInput: 'filterItems' 15 }) 16 } 17</script>
po3rin👍を押しています

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

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

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

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

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

karamarimo

2017/11/24 08:57

「検索用データ(ITEMS)を保持しておくにはどうすればいいか」というご質問ですが、すでにできていませんか?
退会済みユーザー

退会済みユーザー

2017/11/24 09:09

修正依頼ありがとうございます。質問文を修正いたしました。 現在同じデータを2回入力しているので、1つのデータで表示、検索の両方を行うにはどうしたらいいのかを伺いたいです。
guest

回答1

0

ベストアンサー

特に必要ないのであれば、フィルターした結果をstateに格納するのではなく、フィルターする関数をgetterとして用意し、コンポーネントからそれを使用すればいいです。

inputの値もv-modelで変数とバインドすれば、computedと組み合わせてdeclarativeに検索結果を表示できます。

CodeSandbox Demo

getter

lang

1 getters: { 2 filterItems: ({ items }) => (query) => { 3 return items.filter(item => item.name.indexOf(query) > -1) 4 } 5 } 6

component template

lang

1<input type="text" v-model="query"> 2 3<li v-for="item in displayedItems">{{item.name}}</li>

component script

lang

1 data() { 2 return { 3 query: "" 4 } 5 }, 6 computed: { 7 ...mapGetters(['filterItems']), 8 ...mapState(['items']), 9 displayedItems() { 10 if (this.query) { 11 return this.filterItems(this.query) 12 } 13 return this.items 14 } 15 }

参考
Getters - Vuex

投稿2017/11/24 13:25

karamarimo

総合スコア2551

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

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

退会済みユーザー

退会済みユーザー

2017/11/26 03:35

解答ありがとうございます! データはstoreにまとめておく, データをいじるのであればmutationでやらなければいけないと思い込んでいました. 共通で必要なデータであればstoreへ,そうでなければコンポーネントに置いておく. ソート,フィルターなど.データそのものを変更しない場合はgetter,値の変更などデータの変更であればmutationで行えばいいんですね. サンプルコードありがとうございます! ...演算子や,mapStateがあることを知り,勉強になりました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問