前提・実現したいこと
フロントをVueで実装しており、「入力したキーワード」と「画面上で選んだジャンルの選択肢」の2つを、
store
のaction
の引数に渡したいです。
また、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
の時点では格納されていないので、ここで上手く受け渡せていないということでしょうか?
回答1件
あなたの回答
tips
プレビュー