src/directive/mark.js (35 lines of code) (raw):

import Mark from 'mark.js'; import Vue from 'vue'; import {debounce} from 'lodash-es'; function doMark(el, keywords) { let instance = el.__markInstance; function doMark() { el.__markInstance.mark(keywords, { diacritics: true, separateWordSearch: true }); } if (!instance) { el.__markInstance = new Mark(el); doMark(); } else { el.__markInstance.unmark({ done() { doMark(); } }); } } Vue.directive('mark', { inserted(el, binding) { el.__doMarkDebounced = debounce(doMark, 500, { trailing: true, leading: false }); el.__doMarkDebounced(el, binding.value); }, update(el, binding) { el.__doMarkDebounced(el, binding.value); } });