質問編集履歴

6

コンソールエラーの少なかったコードに修正

2017/08/19 18:34

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -416,50 +416,58 @@
416
416
 
417
417
  name: 'detail',
418
418
 
419
+ data() {
420
+
421
+ return {
422
+
423
+ question: null
424
+
425
+ }
426
+
427
+ },
428
+
419
429
  mounted() {
420
430
 
421
431
  this.getQuestion(this.q_id).then(question => this.question = question);
422
432
 
423
433
  },
424
434
 
425
- watch: {
426
-
427
- 'route'(to, from){
435
+ beforeRouteUpdate(to, from ,next) {
428
-
436
+
429
- this.getQuestion(to.params.q_id).then(question => this.question = question);
437
+ this.getQuestion(to.params.q_id).then(question => this.question = question);
438
+
439
+ next();
440
+
441
+ },
442
+
443
+ methods: {
444
+
445
+ getQuestion(q_id) {
446
+
447
+ return axios.get("http://localhost:3000/question/", {
448
+
449
+ params: {
450
+
451
+ q_id: this.$route.params.q_id
452
+
453
+ }
454
+
455
+ })
456
+
457
+ .then(function (response) {
458
+
459
+ question = response.data
460
+
461
+ })
462
+
463
+ .then(function (error) {
464
+
465
+ console.log("http request denied");
466
+
467
+ });
430
468
 
431
469
  }
432
470
 
433
- },
434
-
435
- methods: {
436
-
437
- getQuestion(q_id) {
438
-
439
- return axios.get("http://localhost:3000/question/{q_id}", {
440
-
441
- params: {
442
-
443
- q_id: this.$route.params.q_id
444
-
445
- }
446
-
447
- })
448
-
449
- .then(function (response) {
450
-
451
- question = response.data
452
-
453
- })
454
-
455
- .then(function (error) {
456
-
457
- console.log(error);
458
-
459
- });
460
-
461
- }
462
-
463
471
  }
464
472
 
465
473
  }
@@ -468,6 +476,22 @@
468
476
 
469
477
  ```
470
478
 
479
+ ※まだ使い方をよく理解してはいませんが、beforeRouteUpdateがwatchと同じような働きをするとのことなので、参考にしたサイトに習ってそのまま取り入れています。
480
+
481
+
482
+
483
+ 一応上記のコードを実行するとコンソールに
484
+
485
+ > GET http://localhost:3000/question/?q_id=h28s002 404 (Not Found)
486
+
487
+
488
+
489
+ と表示されるので、「惜しいのかな?」とも考えています。
490
+
491
+ Axiosのドキュメントを参考にしたparamsの指定では、APIのURLと違ってしまうので、この点を上手く修正すれば、とりあえずAPIを上手く発火できそうな気がします。(もっとシンプルな方法がある気がしてならないけど…)
492
+
493
+
494
+
471
495
 
472
496
 
473
497
  コードからもわかるとおり混乱中です。修正を続けていますが、具体的な修正案などがあればありがたいです。「**リストから取得したq_idを、詳細情報取得用のAPIに組み込んで、その内容を表示する**」ということがしたいです。

5

最新状況の更新

2017/08/19 18:34

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -363,3 +363,113 @@
363
363
  </script>
364
364
 
365
365
  ```
366
+
367
+
368
+
369
+ ###詳細ページの編集中、リストから受け取ったq_idが組み込めず…
370
+
371
+ this.$route.params.q_idという便利なアクセス手法があるとのこと。
372
+
373
+ これを利用してAPIの{q_id}に値を組み込めば簡単に行くのではないかと思ったものの、苦戦しています。Vue Devtoolを見る限り、詳細ページは確かにリストからq_idのパラメータを受け取っているものの、活用することがなかなかできません。
374
+
375
+
376
+
377
+ 少し理解が追いついていない現状ですが、現在のコードは下記のようになっています。
378
+
379
+
380
+
381
+ (詳細用ページ)
382
+
383
+ ```javascript
384
+
385
+ <template>
386
+
387
+ <div class="detail">
388
+
389
+ <div v-if="question != null">
390
+
391
+ <h2>{{ question.q_body }}</h2>
392
+
393
+ </div>
394
+
395
+
396
+
397
+ <div v-else>
398
+
399
+ <p>No Page.</p>
400
+
401
+ </div>
402
+
403
+ </div>
404
+
405
+ </template>
406
+
407
+
408
+
409
+ <script>
410
+
411
+ import axios from 'axios';
412
+
413
+
414
+
415
+ export default {
416
+
417
+ name: 'detail',
418
+
419
+ mounted() {
420
+
421
+ this.getQuestion(this.q_id).then(question => this.question = question);
422
+
423
+ },
424
+
425
+ watch: {
426
+
427
+ 'route'(to, from){
428
+
429
+ this.getQuestion(to.params.q_id).then(question => this.question = question);
430
+
431
+ }
432
+
433
+ },
434
+
435
+ methods: {
436
+
437
+ getQuestion(q_id) {
438
+
439
+ return axios.get("http://localhost:3000/question/{q_id}", {
440
+
441
+ params: {
442
+
443
+ q_id: this.$route.params.q_id
444
+
445
+ }
446
+
447
+ })
448
+
449
+ .then(function (response) {
450
+
451
+ question = response.data
452
+
453
+ })
454
+
455
+ .then(function (error) {
456
+
457
+ console.log(error);
458
+
459
+ });
460
+
461
+ }
462
+
463
+ }
464
+
465
+ }
466
+
467
+ </script>
468
+
469
+ ```
470
+
471
+
472
+
473
+ コードからもわかるとおり混乱中です。修正を続けていますが、具体的な修正案などがあればありがたいです。「**リストから取得したq_idを、詳細情報取得用のAPIに組み込んで、その内容を表示する**」ということがしたいです。
474
+
475
+ よろしくお願いします。

4

本文の部分修正

2017/08/19 18:22

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -280,7 +280,7 @@
280
280
 
281
281
  ```
282
282
 
283
- 詳細用API(/question/{q_id})発火方法
283
+ ###ページ遷移と同時に詳細用API(/question/{q_id})発火したい
284
284
 
285
285
  アドバイスによりページ遷移が完了しましたが、現状では詳細情報を取得するためのAPI(http://localhost:3000/question/{q_id})が未発火なので、遷移先のページが空白のままです。
286
286
 

3

ページ遷移の完了と、詳細用API発火のための質問の追加

2017/08/18 17:52

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -221,3 +221,145 @@
221
221
 
222
222
 
223
223
  有用そうなソースも歓迎です。
224
+
225
+
226
+
227
+ ###[2017/08/19追記 ページ遷移できました]
228
+
229
+ aro10さんの指摘に沿って次のように修正し、ページを遷移させることができました。
230
+
231
+
232
+
233
+ Vue-RouterのPath設定に誤りがありました。
234
+
235
+ > (修正前) { path: '/question/:id', component: QuestionDetail, name: 'detail'}
236
+
237
+ (修正後) { path: '/question/**:q_id**', component: QuestionDetail, name: 'detail'}
238
+
239
+
240
+
241
+
242
+
243
+ 上記のようなルート定義を作成したうえで、QuestionList.vueのrouter-link部分を下記のように修正したところ、無事ページ遷移させることができました。
244
+
245
+ ```javascript
246
+
247
+ <template>
248
+
249
+ <div class="list">
250
+
251
+ <h1>QuestionList page.</h1>
252
+
253
+ <div v-for="question in questions" v-bind:question="question.question">
254
+
255
+ <router-link :to="{ name: 'detail', params: {q_id: question.q_id}}">
256
+
257
+ <h2>{{ question.q_title }}</h2>
258
+
259
+ </router-link>
260
+
261
+ </div>
262
+
263
+ </div>
264
+
265
+ </template>
266
+
267
+
268
+
269
+ <script>
270
+
271
+ export default {
272
+
273
+ name: 'QuestionList',
274
+
275
+ props: ['questions']
276
+
277
+ }
278
+
279
+ </script>
280
+
281
+ ```
282
+
283
+ 詳細用API(/question/{q_id})の発火方法
284
+
285
+ アドバイスによりページ遷移が完了しましたが、現状では詳細情報を取得するためのAPI(http://localhost:3000/question/{q_id})が未発火なので、遷移先のページが空白のままです。
286
+
287
+
288
+
289
+ RootInstanceのcreated()で2012年の問題群を取得したように、ページ遷移したと同時にq_idを上記APIの{q_id}に代入して個別問題を取得したいと考えているのですが、どのような方法が考えられるでしょうか。動作こそしないものの、現在のDetailのコードなども早めに追記しようと思います。
290
+
291
+
292
+
293
+ ※動作しないので参考にしないでください。
294
+
295
+ とりあえず詳細データのq_bodyを表示させたいと考えています。現状は詳細情報が取得されておらず、questionが空の状態なので、<div v-else>が実行されて、ページに「No Page.」と表示だけされています。
296
+
297
+ ```javascript
298
+
299
+ <template>
300
+
301
+ <div class="detail">
302
+
303
+ <div v-if="question != null">
304
+
305
+ <h2>{{ this.question.q_body }}</h2>
306
+
307
+ </div>
308
+
309
+
310
+
311
+ <div v-else>
312
+
313
+ <p>No Page.</p>
314
+
315
+ </div>
316
+
317
+ </div>
318
+
319
+ </template>
320
+
321
+
322
+
323
+ <script>
324
+
325
+
326
+
327
+ export default {
328
+
329
+ name: 'detail',
330
+
331
+ props: ['questions'],
332
+
333
+ created() {
334
+
335
+ axios.get('http://localhost:3000/question/{q_id}', {
336
+
337
+ params: {
338
+
339
+ q_id: question.question.q_id
340
+
341
+ }
342
+
343
+ })
344
+
345
+ .then(function(response) {
346
+
347
+ console.log(response);
348
+
349
+ this.question = response.data
350
+
351
+ })
352
+
353
+ .catch(function(response) {
354
+
355
+ console.log(error)
356
+
357
+ });
358
+
359
+ }
360
+
361
+ }
362
+
363
+ </script>
364
+
365
+ ```

2

タイトルに「Vuejs」を追加、本文の一部を修正

2017/08/18 17:50

投稿

退会済みユーザー
test CHANGED
@@ -1 +1 @@
1
- リストページのID要素を頼りに個別ページへ遷移させる方法
1
+ [Vue.js]リストページのID要素を頼りに個別ページへ遷移させる方法
test CHANGED
@@ -94,7 +94,7 @@
94
94
 
95
95
 
96
96
 
97
- 実現したいのは、**リストのq_idを「http://localhost:3000/question/{q_id}」に当てはめて、リストページからそれぞれの個別ページに遷移させること**です。
97
+ 実現したいのは、**リストのq_idを詳細用の「http://localhost:3000/question/{q_id}」に当てはめて、リストページからそれぞれの個別ページに遷移させること**です。
98
98
 
99
99
 
100
100
 

1

タイトルの変更

2017/08/18 15:27

投稿

退会済みユーザー
test CHANGED
@@ -1 +1 @@
1
- リストページのIDを頼りに個別ページ遷移させる方法
1
+ リストページのID要素を頼りに個別ページ遷移させる方法
test CHANGED
File without changes