前提・実現したいこと
●使用しているフレームワーク
vue.js 2.5.x
axios
apiで吐き出されましたjsonのデータを算出プロパティを使って加工したいと思ってます。
ですが、createdのfor文で目的とするjson情報が取得できず、困っております。
下記にソースを示します。
該当のソースコード
html
1<!DOCTYPE html> 2<html lang="ja"> 3<head> 4 <meta charset="UTF-8"> 5 <title>Document</title> 6<link rel="stylesheet" href="/css/style.css"> 7<script src="https://unpkg.com/vue/dist/vue.js"></script> 8<script src="https://unpkg.com/axios/dist/axios.min.js"></script> 9</head> 10<body> 11 12<div id="wrapper"> 13 14 <!-- <p><input v-model="msg"></p> --> 15 <div class="contents"> 16 <transition name="fade" mode="out-in"> 17 <div class="page page--home"> 18 <h2>ここはホームです、一覧表示させます。{{ msg }}。<h2> 19 <ul> 20 <li v-for="post in posts"> 21 {{ kakou_pos[0] }} 22 {{post.title.rendered}} 23 <img :src="post._embedded['wp:featuredmedia'][0].media_details.sizes.thumbnail.source_url"> 24 </li> 25 </ul> 26 </div> 27 </transition> 28 </div><!--//contents --> 29</div><!--//wrapper --> 30 31</body> 32</html>
js
1var app = new Vue({ 2 el:'#wrapper', 3 data: { 4 msg:'メッセ', 5 kakou_posts:[], 6 posts: [] 7 }, 8 created: function(){ 9 this.getPosts(); 10 }, 11 methods: { 12 getPosts: function(){ 13 axios.get( 'http://example.com/wp-json/wp/v2/news/?_embed&per_page=7' ) 14 .then( response => { 15 this.posts = response.data; 16 } ) 17 .catch( error => { 18 window.alert( error ); 19 } ); 20 }, 21 }, 22 computed:{ 23 //console.log(posts.length()) 24 kakou_pos: function () { 25 for(var i = 0; i < this.posts.length; i++ ){ 26 return this.kakou_posts[i] = this.posts[i].date 27 } 28 } 29 } 30})
試したこと
for文をかいてjsonの配列情報を入れようと思いましたが、上手く行きませんでした。
{{ kakou_pos[0] }}の箇所がありますが、
やはり表示されません。
デバックモードを見たら配列に入っていない模様でした。
一番最初の「date」だけがセットされているだけ。なぜでしょうか???
最終的にやりたいこと
上記は吐き出しているjson情報(情報は一部)です。
配列からdate情報だけを受け取りまして、
date情報を出力しやすいように下記のように加工
var date = new Date(this.posts[i].date); yy = date.getFullYear(date); mm = date.getMonth() + 1; dd = date.getDate();
そしてkakou_posts:[]に格納する。
イテレート文で出力する。
htmlに出力する。出力場所は{{post.title.rendered}}後ろに出力したい
が目的とする状態です。
vue.jsとjavascriptに詳しい方がいらっしゃいましたらご教示お願い致します。
解決したソース
- computedのメソッドkakou_postsのreturn文の記述を修正しました。
- 補足説明として、getPostsは非同期処理でjson情報を取得します。取得完了後にdataのpostsに格納されます。
その後computedのkakou_postsがリアクティブ(この場合はpostsが空からjson情報がセットされたということ)を感知して、kakou_posが発動します。
javascript
1var app = new Vue({ 2 el:'#wrapper', 3 data() { 4 return { 5 msg: "メッセ", 6 posts: [] 7 }; 8 }, 9 created: function() { 10 this.getPosts(); 11 }, 12 methods: { 13 getPosts: function() { 14 axios 15 .get( 16 "https://cooperativehouse.jp/wp-json/wp/v2/news/?_embed&per_page=7" 17 ) 18 .then(response => { 19 this.posts = response.data; 20 }) 21 .catch(error => { 22 window.alert(error); 23 }); 24 } 25 }, 26 computed: { 27 //console.log(posts.length()) 28 kakou_posts: function() { 29 const kakou_posts = []; 30 for (var i = 0; i < this.posts.length; i++) { 31 let date = this.posts[i].date; 32 kakou_posts.push(date); 33 } 34 return kakou_posts; 35 } 36 } 37})
html
1<div id="wrapper"> 2 3 <div class="contents"> 4 <transition name="fade" mode="out-in"> 5 <div class="page page--home"> 6 <h2>ここはホームです、一覧表示させます。{{ msg }}。</h2> 7 <ul> 8 <li v-for="(post,index) in posts" :key="index"> 9 <h3><a :href="post.link" target="_blank">{{post.title.rendered}}</a></h3> 10 <p><time>{{ kakou_posts[index] }}</time></p> 11 <img :src="post._embedded['wp:featuredmedia'][0].media_details.sizes.thumbnail.source_url"> 12 <hr> 13 </li> 14 </ul> 15 </div> 16 </transition> 17 </div><!--//contents --> 18 19</div><!--//wrapper -->
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/02/22 06:31 編集
2018/02/22 06:50
2018/02/22 08:07
2018/02/23 04:23