diff options
Diffstat (limited to 'alpinejs/packages/alpinejs/src/reactivity.js')
-rw-r--r-- | alpinejs/packages/alpinejs/src/reactivity.js | 62 |
1 files changed, 62 insertions, 0 deletions
diff --git a/alpinejs/packages/alpinejs/src/reactivity.js b/alpinejs/packages/alpinejs/src/reactivity.js new file mode 100644 index 0000000..b233d06 --- /dev/null +++ b/alpinejs/packages/alpinejs/src/reactivity.js @@ -0,0 +1,62 @@ + +import { scheduler } from './scheduler' + +let reactive, effect, release, raw + +let shouldSchedule = true +export function disableEffectScheduling(callback) { + shouldSchedule = false + + callback() + + shouldSchedule = true +} + +export function setReactivityEngine(engine) { + reactive = engine.reactive + release = engine.release + effect = (callback) => engine.effect(callback, { scheduler: task => { + if (shouldSchedule) { + scheduler(task) + } else { + task() + } + } }) + raw = engine.raw +} + +export function overrideEffect(override) { effect = override } + +export function elementBoundEffect(el) { + let cleanup = () => {} + + let wrappedEffect = (callback) => { + let effectReference = effect(callback) + + if (! el._x_effects) { + el._x_effects = new Set + + // Livewire depends on el._x_runEffects. + el._x_runEffects = () => { el._x_effects.forEach(i => i()) } + } + + el._x_effects.add(effectReference) + + cleanup = () => { + if (effectReference === undefined) return + + el._x_effects.delete(effectReference) + + release(effectReference) + } + } + + return [wrappedEffect, () => { cleanup() }] +} + +export { + release, + reactive, + effect, + raw, +} |