質問編集履歴

3

使用コードを修正。

2021/06/20 12:32

投稿

kaji120
kaji120

スコア39

test CHANGED
@@ -1 +1 @@
1
- Vuexaxiosを使用した外部API通を行う
1
+ Vuexの値をtemplate内で使用するとエラー
test CHANGED
@@ -8,11 +8,13 @@
8
8
 
9
9
 
10
10
 
11
- ①クリック(getBook)される
11
+  クリック(getBook)されるとtemplate内のkeywordがVuexのkeywordに格納されて書籍情報を取得する
12
-
12
+
13
- ②axiosで取得したデータがstoreの配列(books)に格納される
13
+  axiosで取得した書籍情報がstoreの配列(books)に格納される
14
+
14
-
15
+ ③ store内の書籍情報ををtemplate内のbooks配列に格納する
16
+
15
- storeのbooks配列をpageの方利用する
17
+  template内のbooks配列をv-for取り出して表示する
16
18
 
17
19
 
18
20
 
@@ -28,14 +30,18 @@
28
30
 
29
31
 
30
32
 
33
+ **~/store/index.js**
34
+
31
35
  ```Vuex
32
36
 
37
+ const BASE_URL = 'https://www.googleapis.com/books/v1/volumes?q='
38
+
39
+
40
+
33
41
  export const state = () => ({
34
42
 
35
43
  books: [],
36
44
 
37
- url: 'https://www.googleapis.com/books/v1/volumes?q=',
38
-
39
45
  keyword: ''
40
46
 
41
47
  })
@@ -44,12 +50,16 @@
44
50
 
45
51
  export const mutations = {
46
52
 
47
- getBooks (state, keyword, res) {
53
+ getBooks (state, res) {
54
+
55
+ state.books = res.data.items
56
+
57
+ },
58
+
59
+ getKwyword (state, keyword) {
48
60
 
49
61
  state.keyword = keyword
50
62
 
51
- state.books = res
52
-
53
63
  }
54
64
 
55
65
 
@@ -62,184 +72,146 @@
62
72
 
63
73
  async getBookAction ({ commit }) {
64
74
 
75
+ await this.$axios.$get(BASE_URL + state.keyword + '&maxResults=15')
76
+
77
+ .then((res) => {
78
+
79
+ commit('getBooks', res)
80
+
81
+ })
82
+
83
+ }
84
+
85
+ }
86
+
87
+
88
+
89
+ ```
90
+
91
+ **~/page/search.vue**
92
+
93
+ ```Vue
94
+
95
+ <template>
96
+
97
+ <div class="teal lighten-1 background pa-10">
98
+
99
+ <v-container>
100
+
101
+ <v-card>
102
+
103
+ <v-card
104
+
105
+ v-for="book in books"
106
+
107
+ :key="book.id"
108
+
109
+ >
110
+
111
+ <div class="d-flex flex-row mb-3 pa-5">
112
+
113
+ <img :src="image(book)">
114
+
115
+ <div>
116
+
117
+ <v-card-title>{{ title(book) }}</v-card-title>
118
+
119
+ <v-card-subtitle>{{ authors(book) }}</v-card-subtitle>
120
+
121
+ </div>
122
+
123
+ </div>
124
+
125
+ </v-card>
126
+
127
+ </v-container>
128
+
129
+ </v-row>
130
+
131
+ </v-sheet>
132
+
133
+ </div>
134
+
135
+ </template>
136
+
137
+ <script>
138
+
139
+ import noImage from '~/assets/images/noImage.png'
140
+
141
+
142
+
65
- const payload = {
143
+ export default {
144
+
145
+ data () {
146
+
147
+ return {
148
+
149
+ keyword: '',
66
150
 
67
151
  books: [],
68
152
 
69
- keyword: state.keyword
70
-
71
153
  }
72
154
 
73
- await this.$axios.$get(state.url + payload.keyword + '&maxResults=15')
74
-
75
- .then((res) => {
76
-
77
- payload.books = res.data.items
78
-
79
- })
155
+ },
156
+
157
+
158
+
80
-
159
+ computed: {
160
+
161
+ getBooks () {
162
+
163
+ return this.$store.state.books
164
+
165
+ }
166
+
167
+ },
168
+
169
+
170
+
171
+ methods: {
172
+
173
+
174
+
175
+ get () {
176
+
81
- commit('getbooks', payload)
177
+ this.$store.commit('getKeyword', this.keyword)
178
+
179
+ this.$store.dispatch('getBookAction')
180
+
181
+ },
182
+
183
+
184
+
185
+ // APIリクエスト後の処理
186
+
187
+ setBooks (res) {
188
+
189
+ this.books = this.$state.books
190
+
191
+ },
192
+
193
+
194
+
195
+ // 取得した書籍データの設定
196
+
197
+ title: valu => valu.volumeInfo.title ? valu.volumeInfo.title : 'No title',
198
+
199
+ authors: valu => valu.volumeInfo.authors ? valu.volumeInfo.authors[0] : 'No authors',
200
+
201
+ image: valu => valu.volumeInfo.imageLinks ? valu.volumeInfo.imageLinks.thumbnail : noImage
82
202
 
83
203
  }
84
204
 
85
205
  }
86
206
 
207
+ </script>
208
+
87
209
 
88
210
 
89
211
  ```
90
212
 
91
213
 
92
214
 
93
- ```Vue
94
-
95
- <template>
96
-
97
- <v-main>
98
-
99
- <v-row justify="center">
100
-
101
- <div style="width: 700px;">
102
-
103
- <v-text-field
104
-
105
- v-model="keyword"
106
-
107
- type="text"
108
-
109
- label="本を探す"
110
-
111
- outlined
112
-
113
- />
114
-
115
- </div>
116
-
117
- <v-dialog
118
-
119
- v-model="dialog"
120
-
121
- max-width="650px"
122
-
123
- >
124
-
125
- <template #activator="{ on, attrs }">
126
-
127
- <v-btn
128
-
129
- v-bind="attrs"
130
-
131
- :loading="dialog"
132
-
133
- icon
134
-
135
- x-large
136
-
137
- class="pa-2 ma-2"
138
-
139
- v-on="on"
140
-
141
- @click="getBooks"
142
-
143
- >
144
-
145
- <v-icon x-large>
146
-
147
- mdi-magnify
148
-
149
- </v-icon>
150
-
151
- </v-btn>
152
-
153
- </template>
154
-
155
- <v-container>
156
-
157
- <v-card>
158
-
159
- <v-card
160
-
161
- class="mx-auto"
162
-
163
- max-width="600px"
164
-
165
- >
166
-
167
- </v-card>
168
-
169
- </v-container>
170
-
171
- </v-dialog>
172
-
173
- </v-row>
174
-
175
- <v-divider class="ma-7" />
176
-
177
-
178
-
179
- //Vuexで取得した書籍情報を表示する
180
-
181
- <p>{{ books }}</p>
182
-
183
- </v-row>
184
-
185
- </template>
186
-
187
- </v-card>
188
-
189
- </v-main>
190
-
191
- </template>
192
-
193
- <script>
194
-
195
- import { mapState } from 'Vuex'
196
-
197
-
198
-
199
- export default {
200
-
201
- data () {
202
-
203
- return {
204
-
205
- keyword: '',
206
-
207
- }
208
-
209
- },
210
-
211
- computed: {
212
-
213
- ...mapState({ keyword: state => state.keyword }),
214
-
215
- books () {
216
-
217
- return this.$store.state.books
218
-
219
- }
220
-
221
- },
222
-
223
-
224
-
225
- methods: {
226
-
227
- getBooks () {
228
-
229
- this.$store.commit('getBooks ', this.keyword)
230
-
231
- this.$store.dispatch('getBookAction')
232
-
233
- },
234
-
235
- }
236
-
237
- }
238
-
239
- ```
240
-
241
-
242
-
243
215
  ### 補足情報(FW/ツールのバージョンなど)
244
216
 
245
217
 

2

内容の変更

2021/06/20 12:32

投稿

kaji120
kaji120

スコア39

test CHANGED
File without changes
test CHANGED
@@ -4,7 +4,19 @@
4
4
 
5
5
  GoogleBooksAPIから書籍情報を取得してpage内で表示させていましたが、書籍情報を使い回したいと考えVuexを使用することにしました。
6
6
 
7
+ 私のイメージでは
8
+
9
+
10
+
11
+ ①クリック(getBook)される
12
+
7
- 私のイメージではクリック(getBook)されるとaxiosで取得したデータが配列(books)に格納されて、配列を繰り返し処理で表示すイメージなのですが、うまく表示させることができず困っています。お力をお貸し頂けないでしょうか。
13
+ axiosで取得したデータがstoreの配列(books)に格納される
14
+
15
+ ③storeのbooks配列をpageの方で利用する
16
+
17
+
18
+
19
+ なのですが、エラーがでてうまくいきません。
8
20
 
9
21
 
10
22
 

1

誤字を修正

2021/06/19 02:50

投稿

kaji120
kaji120

スコア39

test CHANGED
File without changes
test CHANGED
@@ -146,16 +146,10 @@
146
146
 
147
147
  <v-card
148
148
 
149
- v-for="book in books"
150
-
151
- :key="book.id"
152
-
153
149
  class="mx-auto"
154
150
 
155
151
  max-width="600px"
156
152
 
157
- @click="select(book)"
158
-
159
153
  >
160
154
 
161
155
  </v-card>