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

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 へホストする