【Vue.js】検索文字などの特定文字を、マーカーでハイライト表示するコンポーネントを作った
2018-12-11こんな感じなのを作成します。
コンポーネントのソース
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
<template> <div> <span v-for="(word, key) in highLight(allWord, searchWord)" // ⑤ :class="{'-highlight': word == searchWord}" > {{word}} </span> </div> </template> <script> export default { props: ['allWord', 'searchWord'],//① methods: { highLight (words, query) { var wordArr = [] if (this.searchWord) { //②検索文字をカンマで囲む words = words.replace(query, ',' + query + ',') //③最初と最後のカンマを削除 words = words.replace(/^,/ , '').replace(/(,$)/ , '') //④文字を配列にする。 return words.split(',') } else{ return [words] } } } } </script> |
①親コンポーネントから、’allWord’と ‘searchWord’の2つのデータをpropsでわたします。
allWordは全文、 searchWordは、ハイライト表示したい文字です。
②〜④で、文字を、検索対象文字で区切った配列にします。(②、③はもっといい書き方あるはず)
「お腹が減った。パンを食べよう。パンは炭水化物だから太るかもしれないけど!」
で、「パン」という文字を検索した場合は、
[お腹が減った。, パン , を食べよう。, パン, は炭水化物だから太るかもしれないけど!]
という配列になります。
⑤配列にした文字をv-forで回します。検索対象文字の場合は、’-highlight’というクラスをつけて、マーカーが付くようにします。
1 2 3 4 5 6 7 |
<style lang="stylus"> .-highlight background: linear-gradient(transparent 0%, #649d7e 0%); color: #fff; padding: 1px 5px; border-radius: 2px; </style> |
↑このスタイルも、propsでデータを渡して変更出来るようにすれば、マーカーの色や文字色も変えられて便利です!
呼び出し方
1 2 3 4 5 6 7 8 |
<略> <highlight-word :all-word="task.name" :search-word="form['free_word']" class="task" > </highlight-word> <略> |
こんな感じでよびだしましょう!
ーーーーーーーー
この記事がお役に立てたら、是非シェアをお願いします^^