
今朝は検索機能を実装したので、そのことについて振り返って行きます!
比較的簡単に出来た印象です。
目次
参考にしたもの
コピペでOK!Vue.jsでリアルタイム検索をつくる方法 – console dot logblog.capilano-fw.com
下記は取得した値をどのように表示するのかに使いました。Vue.jsのv-forでの並び順を指定したキーの値順番にしたり、昇順、降順を切り替えたりするVue.jsで使用できるv-forは簡単にリストレンダリングできとても便利です。ただ、レンダリングの順番を指定したキーで並www.virment.com
実装の手順
まず検索するフォームを作成。ここに入力された値がv-modelを通して双方向バインディングをする。
記事一覧を取得する。今回はライフサイクルメソッドを使用しています。
入力された値を使って記事一覧の中に検索をかけ、値を取得。
その値をv-forを使って表示する、といった流れになっています。
まずはコードを
<template>
 <h3>検索してみる</h3>
 <input type="text" v-model="keyword" @keyup="key" placeholder="記事のタイトルを入力">
 <div v-for="post in posts" :key="post.id">
  <p>{{post.title}}</p>
 </div>
<・template>
<script>
export default {
 data() {
   return {
     keyword: '',
     keyup: false
   }
 },
 created() {
   this.$store.dispatch('getposts')
 },
 computed: {
   posts() {
     return this.$store.state.posts.filter(function(post) {
       if(this.keyup === true) {
         return post.title.indexOf(this.keyword) > -1
       }
     }, this)
   }
 },
 methods: {
   key() {
     if(event.key === 'Backspace' || event.key === 'Enter') {
       this.keyup = false
     } else {
       this.keyup = true
     }
   }
 }
}
</script>
ライフサイクルメソッドであるcreated()を使用してFirebaseに保存されている値を取得します。
computedでcreatedの処理で保存されているpost一覧を取得します。filterメソッドを使用して検索していきます。titleとthis.keywordが一致した場合に値を返すようになっています。
キーコードについて
keyupアクションにをinputに設定する事でキーコードによる不必要な挙動を制限しています。
今回はBackspaceとEnterが押された時にfalseにして、表示させない。という処理をしています。
dataに初期値を入れるのを忘れないように!
感想
比較的簡単に実装できるかと思います。今回はVuexの部分については深く触れていません(下にコード貼っておきます)が、何をfilterするかが大事ですね。
indexOfに出会った。
雑ですが、Vuexを使用している部分も載せておきます。
state
posts: []
mutations
get(state, posts) {
     state.posts = posts
   },
actions
getposts({commit}) {
     db.collection('posts').onSnapshot(snapshot => {
       let posts = []
       snapshot.forEach(element => {
         let post = element.data()
         post.id = element.id
         if(post.public === true) {
           posts.push(post)
         }
       });
       commit('get', posts)
     })
   }
今回はこんな感じでした!
以上!