🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Vue.js

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

Vuex

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

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

Q&A

解決済

1回答

1712閲覧

【Vue】v-selectで選んだ値をstoreのactionの引数に渡したい

nomu_lui

総合スコア11

Vue.js

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

Vuex

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

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

0グッド

1クリップ

投稿2021/01/13 21:10

編集2021/01/14 10:27

前提・実現したいこと

フロントをVueで実装しており、「入力したキーワード」と「画面上で選んだジャンルの選択肢」の2つを、
storeactionの引数に渡したいです。
また、actionでRails側で設定したAPIを叩きたいです。

お手数ですが、修正箇所等、ご教示いただけますと幸いです。

発生している問題・エラーメッセージ

エラーは出ていませんが、下記のように検索すると、リクエストURLにgenreIdが空の状態となってしまっています。
現状のコードで、キーワードは「タオル」でちゃんと値を渡せており、「タオル」のみに該当するレスポンスが返ってきております。
イメージ説明

http://localhost:3000/api/v1/rakuten_searches/search?keyword=%E3%82%BF%E3%82%AA%E3%83%AB&genreId=

該当のソースコード

Vueのフォームを構成するコンポーネント

vue

1<template> 2 <div> 3 <b-field> 4 <input class="text" type="text" placeholder="キーワードを入力する" @change="CHANGE_KEYWORD($event.target.value)" /> 5 <v-select multiple label="name" :options="genreIds" @change="CHANGE_GENRE_ID(genreIds.genreId, $event)"></v-select> 6 <input class="submit" type="submit" value="検索" @click="SEARCH" /> 7 </b-field> 8 </div> 9</template> 10 11<script> 12import { mapActions } from 'vuex' 13import { CHANGE_KEYWORD, CHANGE_GENRE_ID, SEARCH } from '../../../store/mutation-types' 14export default { 15 name: 'RakutenApiCall', 16 data() { 17 return { 18 genreIds: [ 19 { genreId: 100433, name: 'ルームウェア' }, 20 { genreId: 562637, name: '家電' }, 21 { genreId: 510915, name: '洋酒' }, 22 { genreId: 100804, name: 'インテリア' }, 23 { genreId: 215783, name: '日用品雑貨' }, 24 { genreId: 558944, name: 'キッチン用品・食器' }, 25 { genreId: 100005, name: '花' }, 26 { genreId: 566732, name: 'カタログ' }, 27 { genreId: 553283, name: 'ギフト券・商品券' }, 28 ], 29 genreId: '' 30 } 31 }, 32 methods: { 33 ...mapActions([ 34 CHANGE_KEYWORD, SEARCH, CHANGE_GENRE_ID 35 ]) 36 } 37} 38</script> 39 40<style scope> 41 42</style> 43

store.js

javascript

1import Vue from 'vue' 2import Vuex from 'vuex' 3import axios from '../plugins/axios' 4import { 5 CHANGE_KEYWORD, 6 SEARCH, 7 CHANGE_GENRE_ID, 8} from './mutation-types' 9 10Vue.use(Vuex) 11 12const state = { 13 keyword: '', 14 genreId: '', 15 items: [] 16} 17 18const getters = { 19 items: state => state.items 20} 21 22const mutations = { 23 [CHANGE_KEYWORD] (state, keyword) { 24 state.keyword = keyword 25 }, 26 [CHANGE_GENRE_ID] (state, genreId) { 27 state.genreId = genreId 28 }, 29 [SEARCH] (state, items) { 30 state.items = items.data 31 } 32} 33 34function searchItem(keyword, genreId) { 35 return axios.get('/v1/rakuten_searches/search', { 36 params: { 37 keyword: keyword, 38 genreId: genreId, 39 } 40 }) 41} 42 43const actions = { 44 [CHANGE_KEYWORD] ({ commit }, keyword) { 45 commit(CHANGE_KEYWORD, keyword) 46 }, 47 48 [CHANGE_GENRE_ID] ({ commit }, genreId) { 49 commit(CHANGE_GENRE_ID, genreId) 50 }, 51 52 [SEARCH] ({ commit, state }) { 53 searchItem(state.keyword, state.genreId) 54 .then(data => { 55 commit(SEARCH, data) 56 }) 57 } 58} 59 60export default new Vuex.Store({ 61 namespaced: true, 62 state, 63 getters, 64 mutations, 65 actions 66}) 67

mutation-types.js

javascript

1export const CHANGE_KEYWORD = 'CHANGE_KEYWORD' 2export const CHANGE_GENRE_ID = 'CHANGE_GENRE_ID' 3export const SEARCH = 'SEARCH' 4

試したこと

searchItem(keyword, genreId)

[SEARCH] ({ commit, state }) { searchItem(state.keyword, state.genreId) .then(data => { commit(SEARCH, data) }) }

の2つの引数の書き方が間違っているかと予想しています。
配列を渡すためにsearchItem([{keyword}, {genreId}])としてみましたが、
これだと500番エラーが返ってきました。
イメージ説明

plasticgrammer様へのご返信

イメージ説明
上記のようにselectedには、Objectに値が入っていますが、下記のようにsearchの時点では格納されていないので、ここで上手く受け渡せていないということでしょうか?
イメージ説明

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

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

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

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

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

plasticgrammer

2021/01/14 02:41

@changeに記載している「genreIds.genreId」というコードで、引き渡しはうまく行っているのでしょうか? 自分で試していないのでなんとも言えませんが、このコードでよいのか気になりましたので確認まで。
nomu_lui

2021/01/14 10:31 編集

plasticgrammer様 上記に画像付きで追加いたしました。選択を選んで、検索ボタンを押した後の画像になります。 `search`のときのクリックイベントで何も格納されていなかったら、この時点の受け渡しが上手くいっていなく、そもそもstore内のメソッドまで値が行き渡ってないという理解で合っていますでしょうか?
plasticgrammer

2021/01/14 13:59

イベントハンドラで独自関数に引き渡している値なので、追加いただいたツール画面上では確認できないかと思います。 とりあえずコンソール出力などの手段で確認してみてください。
nomu_lui

2021/01/15 03:05

v-selectを使うと普通のselectを使った時と別の動きをするようでしたので、今回はシンプルにselectを使って実装しました。 ご対応いただきありがとうございました!
guest

回答1

0

自己解決

v-selectではなく、普通のselectとoptionを使って実装しました。

投稿2021/01/15 03:06

nomu_lui

総合スコア11

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問