From 3f644a5878b9794ca3653c898fe5e9531002f85c Mon Sep 17 00:00:00 2001 From: undefinederror Date: Tue, 7 Jul 2020 00:12:11 +0200 Subject: [PATCH] arg and bind change update directive, added sync arg --- CHANGELOG.md | 12 +++++++ README.md | 2 +- src/lib-components/vue-lazy-input.js | 48 +++++++++++++++++----------- 3 files changed, 42 insertions(+), 20 deletions(-) create mode 100644 CHANGELOG.md diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..0dc6b18 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,12 @@ + +# v2.0.0 + --- + ### Improved + - Directive rebinds on arg and value updates + - Added `sync` type for no-delay behaviour +# v1.0.5 + --- + - Minor fixes and renaming +# v1.0.0 + --- +- Initial Release \ No newline at end of file diff --git a/README.md b/README.md index 649a0de..be8bdf6 100644 --- a/README.md +++ b/README.md @@ -42,7 +42,7 @@ v-lazy-input must be coupled with either a **v-model** directive or an **@input* v-lazy-input:[type]="duration" ``` -**type** is either _debounce_ or _throttle_, default is _debounce_. +**type** is either _debounce_, _throttle_ or _sync_ (fires immediately), default is _debounce_. **duration** is a number, default is _500_. diff --git a/src/lib-components/vue-lazy-input.js b/src/lib-components/vue-lazy-input.js index 54b8f16..f29dd08 100644 --- a/src/lib-components/vue-lazy-input.js +++ b/src/lib-components/vue-lazy-input.js @@ -1,37 +1,41 @@ -import { throttle, debounce } from 'lodash' -const _ = { throttle, debounce } +import { throttle, debounce, identity as sync } from 'lodash' +const _ = { throttle, debounce, sync } +const DELAY = 500 +const TYPE = 'debounce' export default { bind(el, binding, vnode) { - const type = ['debounce', 'throttle'].includes(binding.arg) - ? binding.arg - : 'debounce' - - const d = Number(binding.value) || 500 - const { removeListener, addListener, getInputEvents } = getHelpers(vnode) - const inputEvents = getInputEvents(vnode) + const type = Object.keys(_).includes(binding.arg) ? binding.arg : TYPE + const d = Number(binding.value) || DELAY + const { removeListener, addListener, getInputEvents, getHandler } = getHelpers(vnode) + let inputEvents = vnode.$_originalInputEvents || getInputEvents(vnode) if (!inputEvents.length) { // eslint-disable-next-line console.log('[v-lazy-input] no input events found during bind') } + + binding.def.unbind(el, binding, vnode) - inputEvents.map(handler => { - removeListener('input', - handler._wrapper || /** v >= 2.6.0 */ - handler._withTask || /** 2.5.2 >= v > 2.6.0 */ - handler /** v < 2.5.2*/ ) - }) addListener('input', _[type](function (val) { inputEvents.map(x => { x(val) }) }, d), false) + + vnode.$_originalInputEvents = inputEvents }, unbind(el, binding, vnode) { - const { removeListener, getInputEvents } = getHelpers(vnode) - + const { removeListener, getInputEvents, getHandler } = getHelpers(vnode) + getInputEvents(vnode).map(handler => { - removeListener('input', handler) + removeListener('input', getHandler(handler)) }) + }, + update(el, binding, vnode, oldVnode) { + vnode.$_originalInputEvents = oldVnode.$_originalInputEvents + + if (binding.oldValue !== binding.value || binding.oldArg !== binding.arg) { + binding.def.bind(el, binding, vnode) + } } } @@ -52,6 +56,11 @@ function getHelpers(vnode) { vnode.data.on[type] = handler } + const getHandler = handler => + handler._wrapper || /** v >= 2.6.0 */ + handler._withTask || /** 2.5.2 >= v > 2.6.0 */ + handler /** v < 2.5.2*/ + const getInputEvents = isCmp ? () => [...(vnode.componentInstance._events.input || [])] : () => [vnode.data.on.input] @@ -59,6 +68,7 @@ function getHelpers(vnode) { return { removeListener, addListener, - getInputEvents + getInputEvents, + getHandler } }