Nuxt.jsで記事検索機能を実装してみよう

2021-08-31

地獄の釜が開かれた

本業の方は、納期が2ヶ月近く圧縮されました。当初の計画でもショートしていたので当然間に合うはずもありませんが、サラリーマンなのでそうも言ってられない。言いますけど…。 このまま進むと私を含めて全員が炎上プロジェクに焼かれて朽ちてしまいます。無駄な死体を増やさないため仕様書を毎晩深夜まで作り続けるのですが非常に苦痛を伴います。

地獄の釜の中身も煮詰まって結晶化してしまいそうな日程で進み始めましたね…合掌。 我々末端社員にできることは祈って完全燃焼して再構築されるまで、現状を報告しつつ少しずつ前に進めじっと堪え耐えることだけです…。

はじめに

さて、今日はNuxt.jsブログの続きを作っていきます。 Category分けとかにも応用できそうなので、記事の全文機能を作っていきます。

githubに今回作ったプロジェクト丸っと上げてます。

github:kokodev

commit指定してDLする場合はこれでいけますかね。

git clone https://github.com/kenpos/kokodev.git
cd kokodev
git checkout 224b6810ad0e50530475a2128e411281aeb0e9ae

作り方

pages/index.vue

template

まずはTOPページに検索バーを追加していきましょう。 入力した値はScriptで取得して使用します。

<template>
...
<input id="search" v-model="q" placeholder="Search..." />
~~
記事一覧
~~~
...
</template>

Script

記事コンテンツの取得し、先程作成したQuery用の入力欄の値で検索します。 あまり凝ったこともしていないのですが、こうなりました。

Scriptの全文はこちら。

<script>
export default {
 async asyncData ({ $content,route }) {
   const q = route.query.q
   let query = $content('', { deep: true })
   .sortBy('date', 'desc')
   if (q) {
      query = query.search(q)
   }
   const articles = await query.fetch()
   return {
      q,
      articles
   }
  },
  watch: {
    q () {
      this.$router.replace({ query: this.q ? { q: this.q } : undefined }).catch(() => { })
    }
  },
  watchQuery: true
}

</script>

記事を階層構造になっているもの含めて全取得して、タグ情報にある日付順にソートしています。

let query = $content('', { deep: true }).sortBy('date', 'desc')

取得した記事の中から、query.searchで指定したワードにマッチするものを取得します。 もしtitleから取得したい場合は下記のように書くことが出来ます。

quety = query.search('title',q)
watch:{}

内で、Searchバーの中身の変化を見て随時取得し検索するようにしています。

記事の中身

1.md ,2.md ,3.mdみたいな名前で適当に書いています。

例えば1.mdであればこのように書いています。

---
title: '1'
date: '2021-06-02 02:19'
description: 'Empower your NuxtJS application with @nuxt/content module write in a content/ directory and fetch your Markdown, JSON, YAML and CSV files through a MongoDB like API, acting as a Git-based Headless CMS.'
category: 'Vue'
---

Github

実行結果

このように作ることで検索画面が出来上がりました。

まとめ

ネット検索してもあまり良いものがヒットせず いろんなサイトの記載を混ぜて試してましたが良い感じに動いてよかったです。