bootstrap-vue
Version:
With more than 85 components, over 45 available plugins, several directives, and 1000+ icons, BootstrapVue provides one of the most comprehensive implementations of the Bootstrap v4 component and grid system available for Vue.js v2.6, complete with extens
55 lines (45 loc) • 1.41 kB
JavaScript
// v-b-hover directive
import { IS_BROWSER } from '../../constants/env'
import { EVENT_OPTIONS_NO_CAPTURE } from '../../constants/events'
import { eventOnOff } from '../../utils/events'
import { isFunction } from '../../utils/inspect'
// --- Constants ---
const PROP = '__BV_hover_handler__'
const MOUSEENTER = 'mouseenter'
const MOUSELEAVE = 'mouseleave'
// --- Helper methods ---
const createListener = handler => {
const listener = event => {
handler(event.type === MOUSEENTER, event)
}
listener.fn = handler
return listener
}
const updateListeners = (on, el, listener) => {
eventOnOff(on, el, MOUSEENTER, listener, EVENT_OPTIONS_NO_CAPTURE)
eventOnOff(on, el, MOUSELEAVE, listener, EVENT_OPTIONS_NO_CAPTURE)
}
// --- Directive bind/unbind/update handler ---
const directive = (el, { value: handler = null }) => {
if (IS_BROWSER) {
const listener = el[PROP]
const hasListener = isFunction(listener)
const handlerChanged = !(hasListener && listener.fn === handler)
if (hasListener && handlerChanged) {
updateListeners(false, el, listener)
delete el[PROP]
}
if (isFunction(handler) && handlerChanged) {
el[PROP] = createListener(handler)
updateListeners(true, el, el[PROP])
}
}
}
// VBHover directive
export const VBHover = {
bind: directive,
componentUpdated: directive,
unbind(el) {
directive(el, { value: null })
}
}