WordPress + Nuxt.js でポートフォリオサイトを作る その2

WordPressサイト(http://works.yuheijotaki.com/)の REST API と Nuxt.js でポートフォリオサイトを作成する。その2

f:id:jotaki:20190924093802p:plain

GitHub: https://github.com/yuheijotaki/works-nuxt

クリックイベントと $emit / props

コンポーネント名を Filter.vue にしようと思ったのですが、予約語だったので Search.vue に修正
コードは下記ですが一部省略

components/Search.vue ではクリックしたカテゴリーを $emit する

<template>
  <div>
    <ul>
      <li><a @click="clickedCategoryEvent('All')">All</a></li>
      <li><a @click="clickedCategoryEvent('Front-end')">Front-end</a></li>
      <li><a @click="clickedCategoryEvent('WordPress')">WordPress</a></li>
      <li><a @click="clickedCategoryEvent('Web Design')">Web Design</a></li>
      <li><a @click="clickedCategoryEvent('Tumblr')">Tumblr</a></li>
    </ul>
  </div>
</template>

<script>
export default {
  methods: {
    clickedCategoryEvent(category) {
      this.$emit('clickedCategory',category);
    }
  }
}
</script>

一度 pages/index.vue で受け取り、 components/WorksList.vue へ props する

<template>
  <div>
    <Search @clickedCategory="selectedCategory" />
    <WorksList :filterCategory="propsCategory" />
  </div>
</template>

<script>
export default {
  ...
  data () {
    return {
      category: 'All'
    }
  },
  methods: {
    selectedCategory (category) {
      this.category = category
    }
  },
  computed: {
    propsCategory: function() {
      return this.category
    }
  }
}
</script>

components/WorksList.vue で受け取る

<script>
export default {
  ...
  props:{
    'filterCategory': {
      type: String,
      default: 'All'
    }
  },
  ...
}
</script>

クリックされたカテゴリーを絞り込み表示

components/WorksList.vue
mounted :function(){ にてAPIから投稿を引っ張ってきて
computed: {... にてpropsしてきたカテゴリーに属する投稿をフィルタリング

...
<script>
import axios from "axios";

export default {
  name: 'WorksList',
  components: {
    WorksItem
  },
  props:{
    'filterCategory': {
      type: String,
      default: 'All'
    }
  },
  data () {
    return {
      posts: []
    }
  },
  mounted :function(){
    axios.get( 'https://works.yuheijotaki.com/wp-json/wp/v2/posts?per_page=100' )
    .then( response => {
      this.posts = response.data
    })
    .catch( error => {
      console.log(error)
    })
  },
  computed: {
    filterWorks: function() {
      const posts = this.posts
      const filterCategory = this.filterCategory
      if ( filterCategory !== 'All' ) {
        return this.posts.filter( function( post ) {
          if ( post.category_name.indexOf(filterCategory) >= 0 ) {
            return post
          }
        })
      } else {
        // 初期表示 or `All` を選択した場合
        return this.posts
      }
    }
  }
}
</script>

<template> は computed で絞り込んだ投稿からループする。

<template>
  <ul>
    <WorksItem
      v-for="(post,index) in filterWorks"
      :item="post"
      :key="index"
    />
  </ul>
</template>

残りやること

  • 作業ファイルを src/ にまとめる
  • データ登録・調整やスタインリン
  • Netlify へホストする