Vue.js + Wordpress REST API

Wordpress REST에서 JSON을 읽고 목록을 출력 할 때까지가 비교적 바삭하게 걸었기 때문에 통째로 붙여넣기.
ajax는 axios 이용.

html/css/js 통째로 코드


<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <title>Vue + WP-Rest</title>
  <style>
  .fade-enter-active, .fade-leave-active {
    transition: opacity .5s;
  }
  .fade-enter, .fade-leave-to{
    opacity: 0;
  }
  </style>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/axios/0.16.1/axios.js"></script>
  <script src="https://unpkg.com/[email protected]/dist/vue.js"></script>
</head>
<body>
  <div id="app">
    <posts></posts>
  </div>
  <script>
    Vue.component('posts', {
      data: function(){
        return {
          page: null,
          posts: [],  // placeholder、リアクティブにするために必須とのこと。
        }
      },

      // watchだけで済ませてるのでマウント後でpage変更している。
      mounted: function(){
        this.page = 1;
      },

      // 非同期など複雑になってくる場合computedよりwatchの方が向いてるケースがあるとのこと。
      watch: {
        page: function(newpage){
          var _component = this;  // スマートじゃないやつ
          // axios利用
          axios.get(
            'http://exsample.com/wp-json/wp/v2/posts?page=' + _component.page,
            {sending: false}
          )
          .then(function(response){
            // 普通に$setすると追加せず全記事が置き換わる。
            _component.posts = _component.posts.concat(response.data);
            return this;
          });
        }
      },
      methods: {
        // リンククリックの処理
        onclick: function(e){
          console.log(e.title.rendered)
        },

        // 追加ローディングボタンクリック時の処理、page数を増やすだけ。
        // 全てロード仕切った場合はpageは増えるがpostsが増えないので
        // watchが動かず特にエラーもなく何も起きないがdisabled処理など別途必要。
        loadMore: function(){
          this.page++;
        }
      },
      // 追加時フェードさせるためにtransition-groupとcss用意
      template: [
        '<div>',
          '<transition-group name="fade" tag="ul">',
            '<li v-for="post in posts" v-bind:key="post.title.rendered">',
              '<a :href="post.slug" @click.prevent="onclick(post)">{{post.title.rendered}}</a>',
            '</li>',
          '</transition-group>',
          '<button @click="loadMore">load more</button>',
        '</div>'
      ].join('\n')
    });

    var vm = new Vue({
      el: '#app',
    })
  </script>
</body>
</html>

라는 상태로 심플해졌습니다.

표시 결과



좋은 웹페이지 즐겨찾기