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

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

詳細はこちら
Vue CLI

Vue CLIは、Vue.jsでアプリケーション開発を行うためのコマンドラインインタフェース(CLI)に基づいた開発ツールです。インタラクティブなプロジェクトの雛形や設定なしで使用できるプロトタイプの作成など、さまざまな機能が用意されています。

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

API

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

Q&A

2回答

984閲覧

Vue CLIでaxiosを使ってAPIから取得したJSONファイル内の特定の要素の表示、もしくは削除

kazu0905

総合スコア1

Vue CLI

Vue CLIは、Vue.jsでアプリケーション開発を行うためのコマンドラインインタフェース(CLI)に基づいた開発ツールです。インタラクティブなプロジェクトの雛形や設定なしで使用できるプロトタイプの作成など、さまざまな機能が用意されています。

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

API

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

0グッド

0クリップ

投稿2020/12/07 02:52

編集2020/12/08 03:13

Vue

1<template> 2 <div id="app"> 3 <button v-on:click="call_api()">表示する</button> 4 <div v-for="user in users" :key="user.id"> 5    <span><b>リスト:{{ user.list1 | moment }} </b></span> 6    </div> 7 </div> 8</template> 9 10<script> 11import axios from 'axios'; 12import moment from 'moment'; 13 14export default { 15 16 data() { 17 return { 18 users: [], 19 20 }; 21 }, 22 23 24 methods:{ 25 call_api: function() { 26 this.error_message = ""; 27 axios.get('https://api.****/json',{ 28 params:{ 29 ****: ****, 30 ****: ****, 31 date: ****, 32 } 33 }) 34 .then(response => (this.users = response.data)) 35 .catch(error => { 36 console.log(error) 37 this.errored = true; 38 this.error_message = error; 39 40 }) 41 42 } 43 }, 44 filters: { 45 moment: function (data) { 46 return moment.utc(data, 'hh:mm:ss a').local().format('LTS'); 47 } 48 } 49} 50</script>

JSON

1 { 2 "results": 3 { 4 "list1":"7:27:02 AM", 5 "list2":"5:05:55 PM", 6     "list3":"9:38:53", 7 "list4":"5:05:55 PM", 8 }, 9 "status":"OK" 10 } 11

###実現したいこと

リスト:{{ user.list1 }}

Vueインスタンスの要素を呼び出し時に、「リスト:"7:27:02 AM"」のみを表示させたい。

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

Vue CLIでaxiosを使ってAPIから取得したJSONファイル内の特定要素を表示する際に、

{{ user.list1 }}

Vueインスタンスの要素を呼び出したのですが、JSONファイル内の「"status":"OK"」が時刻として変換されて、アプリ上では「リスト:Invalid date」と表示されてしまいます。

この「"status":"OK"」、「リスト:Invalid date」という要素を削除する方法がわかりません。もしくは表示しないようにする方法がわかりません。

試したこと

調べてみると、配列の要素削除はsplice()を使うという記事がありましたが、イマイチ使い方がわからず、特定要素を削除できませんでした。

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

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

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

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

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

guest

回答2

0

Vue

1<template> 2 <div id="app"> 3 <button v-on:click="call_api()">表示する</button> 4 <div v-for="user of users" :key="user" class="user"> 5 </div> 6 <div>日の出時間:{{users.sunrise | moment}}</div> 7     8     9 </div> 10</template> 11 12<script> 13import axios from 'axios'; 14import moment from 'moment'; 15 16export default { 17 18 data() { 19 return { 20 users: [], 21 22 }; 23 }, 24 25 26 methods:{ 27 call_api: function() { 28 this.error_message = ""; 29 axios.get('https://api.****/json',{ 30 params:{ 31 ****: ****, 32 ****: ****, 33 date: ****, 34 } 35 }) 36 .then(response => (this.users = response.data.results)) 37 .catch(error => { 38 console.log(error) 39 this.errored = true; 40 this.error_message = error; 41 42 }) 43 44 } 45 }, 46 filters: { 47 moment: function (data) { 48 return moment.utc(data, 'hh:mm:ss a').local().format('LTS'); 49 } 50 } 51} 52</script>

JSON

1 2 { 3 "results": 4 { 5 "list1":"7:27:02 AM", 6 "list2":"5:05:55 PM", 7     "list3":"9:38:53", 8 "list4":"5:05:55 PM", 9 }, 10 "status":"OK" 11 } 12

コード的には多少変なところがありますが、これだとJSONファイルの「"status":"OK"」は表示されず、「result」の「"list1":"7:27:02 AM",」の時間のみが表示されました。

投稿2020/12/12 23:12

編集2020/12/12 23:14
kazu0905

総合スコア1

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

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

0

レスポンスをusersに代入している部分を変えれば行けそうです。

before

js

1.then(response => (this.users = response.data))

after

template

1<template> 2 <div id="app"> 3 <button v-on:click="call_api()">表示する</button> 4     <span><b>リスト:{{ user| moment }} </b></span> 5 </div> 6</template> 7export default { 8data() { 9 return { 10 user: null, 11 }; 12 }, 13} 14

js

1 2// api取得時に整形してthis.user入れます 3.then(response => { 4 const user = response.data.results.list1 5 this.user = user 6})

12/14追記

momentで与えられた時間をフォーマットする

filters: { moment: function (date) { const today = new Date()      const time = date.split(':');      const seconds = time[2].split(' ')[0] const timeObj = { years: today.getFullYear(), months: today.getMonth(), days: today.getDay(), hours: time[0], minutes: time[1], seconds: seconds } const formattedTime = moment(timeObj).format('YYYY/MM/DD HH:mm:ss') return formattedTime } }

投稿2020/12/12 04:42

編集2020/12/14 02:50
infratoweb

総合スコア48

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

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

kazu0905

2020/12/12 05:40

修正してみましたが「TypeError: response.data.map is not a function」というエラーが発生してしまいました。
infratoweb

2020/12/12 06:03

すみません、mapは配列に対してしか使えないので、apiの返り値がオブジェクトということですね。 回答を修正したので試してみてください
kazu0905

2020/12/12 23:03

修正し試してみましたが、今度はJSONファイルのデータが表示されず、「{{user | moment }}」で表示すると「Invalid date」と表示されます。
infratoweb

2020/12/14 02:46

それは、momentの問題ですね。 以下のコードに対して``7:27:02 AM``のデータが渡っており正しく変換できてないように見えます。 7:27:02 AMをmomentが読み取れる形に変換する必要があります。回答に追加しました ``` moment: function (data) { return moment.utc(data, 'hh:mm:ss a').local().format('LTS'); } ```
kazu0905

2020/12/15 02:48

「momentで与えられた時間をフォーマットする」を試してみましたが、デベロッパーツールで「TypeError: Cannot read property 'split' of null」と表示されてボタン要素などが表示されなくなってしまいました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問